PDF for .NET のもう1つの強力な機能は、DrawStringRtf メソッドを使用してリッチテキストフォーマット(RTF)テキストを表示する機能です。主に RTF を作成するツールが非常に多く、RTF によるテンプレートの作成、アプリケーションのカスタマイズ、RTF 文字列の表示が容易なので、この機能は非常に便利です。これにより、十分に書式設定された実用的なドキュメントを、コードを記述することなく簡単に作成できるようになります。
たとえば、以下のコードはワードパッドによって作成された RTF テンプレートを使用しています。このコードは、ディレクトリをスキャンし、テンプレートに基づいて RTF 文字列をビルドし、DrawStringRtf メソッドを使用して RTF を表示します。
Visual Basic コードの書き方
Visual Basic |
コードのコピー
|
' RTF テンプレートを取得します。
Dim rtfHdr As String = "" & _ "{\rtf1\ansi\ansicpg1252\deff0\deflang1033" & _ "{\fonttbl{\f0\fswiss\fcharset0 " & _ "Arial;}{\f1\froman\fprq2\fcharset0 Book Antiqua;}}" & _ "{\colortbl ;\red0\green0\blue0;}" & _ "\viewkind4\uc1\pard\f0\fs20\par" & _ "\pard\tx1440\tx2880\tx4320\tx5760\cf1\b\f1\fs24 " & _ "Directory Report created on <>\par" & _ "\ul\par Name\tab Extension\tab Size\tab Date\tab " & _ "Attributes\par" Dim rtfEntry As String = "" & _ "\cf0\ulnone\b0\f0\fs16 <>\tab " & _ "<>\tab <>\tab <>\tab <>\par" ' Build RTF string. Dim sb As New StringBuilder() sb.Append(rtfHdr.Replace("<>", DateTime.Today.ToShortDateString())) Dim file As String For Each file in Directory.GetFiles(@"c:\winnt", "*.bmp") Dim s As String = rtfEntry Dim fi As FileInfo = New FileInfo(file) s = s.Replace("<>", Path.GetFileNameWithoutExtension(file)) s = s.Replace("<>", fi.Extension) s = s.Replace("<>", String.Format("{0:#,##0}", fi.Length)) s = s.Replace("<>", fi.LastWriteTime.ToShortDateString()) s = s.Replace("<>", fi.Attributes.ToString()) sb.Append(s) Next sb.Append("}")
' RTF 文字列をビルドします。
Dim sb As New StringBuilder()
sb.Append(rtfHdr.Replace("<<TODAY>>", DateTime.Today.ToShortDateString()))
For Each file in Directory.GetFiles(@"c:\winnt", "*.bmp")
For Each file in Directory.GetFiles(@"c:\winnt", "*.bmp")
Dim s As String = rtfEntry
Dim fi As FileInfo = New FileInfo(file)
s = s.Replace("<<NAME>>", Path.GetFileNameWithoutExtension(file));
s = s.Replace("<<EXT>>", fi.Extension);
s = s.Replace("<<SIZE>>", string.Format("{0:#,##0}", fi.Length));
ss = s.Replace("<<DATE>>", fi.LastWriteTime.ToShortDateString());ring())
s = s.Replace("<<ATTS>>", fi.Attributes.ToString())
sb.Append(s)
Next
sb.Append("}")
' 描画します。
Dim pdf As New C1PdfDocument() Dim rect As RectangleF = _c1pdf.PageRectangle rect.Inflate(-72, -72) _c1pdf.DrawStringRtf(sb.ToString(), Font, Brushes.Black, rect) ' 保存します。
_c1pdf.Save("c:\temp\dir.pdf")
|
C# コードの書き方
C# |
コードのコピー
|
// RTF テンプレートを取得します。
string rtfHdr = @"{\rtf1\ansi\ansicpg1252\deff0\deflang1033" +
@"{\fonttbl{\f0\fswiss\fcharset0 " +
@"Arial;}{\f1\froman\fprq2\fcharset0 Book Antiqua;}}" +
@"{\colortbl ;\red0\green0\blue0;}" +
@"\viewkind4\uc1\pard\f0\fs20\par" +
@"\pard\tx1440\tx2880\tx4320\tx5760\cf1\b\f1\fs24 " +
@"Directory Report created on <>\par" +
@"\ul\par Name\tab Extension\tab Size\tab Date\tab " +
@"Attributes\par";
string rtfEntry = @"\cf0\ulnone\b0\f0\fs16 <>\tab " +
@"<>\tab <>\tab <>\tab <>\par";
// RTF 文字列をビルドします。
StringBuilder sb = new StringBuilder();
sb.Append(rtfHdr.Replace("<>", DateTime.Today.ToShortDateString()));
foreach (string file in Directory.GetFiles(@"c:\winnt", "*.bmp"))
{
string s = rtfEntry;
FileInfo fi = new FileInfo(file);
s = s.Replace("<>", Path.GetFileNameWithoutExtension(file));
s = s.Replace("<>", fi.Extension);
s = s.Replace("<>", string.Format("{0:#,##0}", fi.Length));
s = s.Replace("<>", fi.LastWriteTime.ToShortDateString());
s = s.Replace("<>", fi.Attributes.ToString());
sb.Append(s);
}
// RTF 文字列を表示します。
C1.C1Pdf.C1PdfDocument pdf = new C1.C1Pdf.C1PdfDocument();
RectangleF rect = pdf.PageRectangle;
rect.Inflate(-72, -72);
_c1pdf.DrawStringRtf(sb.ToString(), Font, Brushes.Black, rect);
// 保存します。
_c1pdf.Save(@"c:\temp\dir.pdf");
|
コードはとても簡単です。唯一複雑な部分は RTF 定義ですが、これはワードパッドで作成された RTF ファイルからコピー&ペーストされました。RTF テンプレートの文字列には、後で実際のコンテンツに置き換えられるタグ(「<<NAME>>」など)が含まれています。
RTF 文字列がビルドされると、DrawStringRtf コマンドを使用して PDF ドキュメントに表示されます。結果は次のようになります。