PDF for .NET
複雑な RTF テキストの描画

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 ドキュメントに表示されます。結果は次のようになります。