テキストファイルを読み込んでRTF化を実行する処理
今度は、テキストファイルを読み込んで、RTFテキストに変換してPDFドキュメント化する処理を作ります。
テキストファイルは、画面のように大見出し、中見出し、小見出しを◆◇▲の記号で区別し、特に色を変えたい行には※記号をつけています。
プログラム側では、この記号を識別しRTFタグの設定を変えるようにしています。
この処理は、ボタン「読み込み」のイベントハンドラに作成します。
PDF作成の準備
最初に、PDF作成のための各種設定を行います。ここは、先に作成したプログラムと同じようなコードです。一部数値と変数の数が変わっています。カラーテーブルも、色数を1つ増やしています。
配列buff()は、ファイルから読み込んだテキストを格納するのに使用します。
Private Sub Button2_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button2.Click Dim font As New Font("MS ゴシック", 10) Dim rc As RectangleF = Me.C1PdfDocument1.PageRectangle rc.Inflate(-50, -50) Dim buff() As String, str As String = "" Dim c As String = "" str = "{\colortbl;\red0\green0\blue0;\red0\green0\blue255;" & _ "\red0\green255\blue255;\red0\green255\blue0;" & _ "\red255\green0\blue255;\red255\green0\blue0;" & _ "\red255\green255\blue0;\red255\green255\blue255;" & _ "\red126\green94\blue225;}"
private void button2_Click(object sender, EventArgs e) { Font font = new Font("MS ゴシック", 10); RectangleF rc = c1PdfDocument1.PageRectangle; rc.Inflate(-50, -50); String[] buff; String str = ""; String c = ""; String msg = ""; str = "{\\colortbl;\\red0\\green0\\blue0;\\red0\\green0\\blue255;" + "\\red0\\green255\\blue255;\\red0\\green255\\blue0;" + "\\red255\\green0\\blue255;\\red255\\green0\\blue0;" + "\\red255\\green255\\blue0;\\red255\\green255\\blue255;" + "\\red126\\green94\\blue225;}";
テキストファイルの読み込み処理
続いて、テキストファイルを読み込んでデータを取得する処理です。テキストファイルからの読み込みには、FileクラスのReadAllLinesメソッドを使用します。
Fileクラスは、ファイルの作成、コピー、削除、移動、オープンなどファイルの操作のための静的メソッドを提供するクラスです。メソッドの提供のみのクラスなのでコンストラクタによるオブジェクトインスタンスの作成は必要ありません。
ReadAllLinesメソッドは、ファイルを開き中のデータを行単位で取り出して配列に格納するメソッドです(行単位とは、改行コードに出会うまでを1行としています)。引数は2つで、1つは読み出すファイルへのパス名で、もう1つは文字のエンコーディングをEncodingクラスのメンバで指定します。「Default」を指定すると、システムの現在のANSIコードページのエンコーディングを使用してデータを取り出します。
buff = File.ReadAllLines("c:\pdf-data.txt", Encoding.Default)
buff = File.ReadAllLines("c:/pdf-data.txt", Encoding.Default);
取り出したテキストデータは、1行ずつ配列Buffの要素に格納されているので、VBではFor Each...Nextステートメントで、C#であればforeachステートメントを使って1行ずつ参照し、文字列の先頭にある記号を取りだして、処理を分岐します。文字の取り出しは、StringクラスのSubstringメソッドを使用します。なお、配列には元のテキストファイルにある改行分も要素に格納されていますが、中身は空なのでデータのある場合だけ先頭の1文字を取り出します。
For Each s In buff If s <> "" Then c = s.Substring(0, 1) Select Case c
foreach (String s in buff) { if (s != "") { c = s.Substring(0, 1); switch (c)
先頭の文字を取り出したら、後はそれぞれの書式になるようにRTFタグを設定します。先頭の記号はPDFドキュメントには必要ないので、StringクラスのRemoveメソッドで切り取っておきます。
そして、すべての行がカラーテーブルの記述を含め1行の文字列になるようにして変数strに格納します。このとき、空白の要素がある場合は、改行するように{\par }
を結合しておきます。
Case "◆" s = s.Remove(0, 1) str &= "{\b {\fs30 {\cf2 " & s & " \par}}} " Case "◇" s = s.Remove(0, 1) str &= "{\fs26 {\cf6 \tab " & s & " \par}} " Case "▲" s = s.Remove(0, 1) str &= "{\fs26 {\cf9 " & s & " \par}} " Case "※" s = s.Remove(0, 1) str &= "{\cf5 \tab " & s & " \par} " Case Else str &= "{\cf0 " & s & " \par }" End Select Else str &= "{\par }" End If Next
{ case "◆": msg = s.Remove(0, 1); str += "{\\b {\\fs30 {\\cf2 " + msg + " \\par}}} "; break; case "◇": msg = s.Remove(0, 1); str += "{\\fs26 {\\cf6 \\tab " + msg + " \\par}} "; break; case "▲": msg = s.Remove(0, 1); str += "{\\fs26 {\\cf9 " + msg + " \\par}} "; break; case "※": msg = s.Remove(0, 1); str += "{\\cf5 \\tab " + msg + " \\par} "; break; default: str += "{\\cf0 " + s + " \\par }"; break; } } else { str += "{\\par }"; } }
最後に、C1PdfDocumentコンポーネントのDrawStringRtfメソッドを実行してRTFテキストをPDF化し、保存と表示処理を実行して出来上がりです。
なお、このプログラムでは、作成したRTFテキストがどのようになっているのかが分かるように、TextBoxで表示するようにしています。
Me.C1PdfDocument1.DrawStringRtf(str, font, Brushes.Black, rc) Me.TextBox1.Text = str savepdf()
c1PdfDocument1.DrawStringRtf(str, font, Brushes.Black, rc); textBox1.Text = str; savepdf();
まとめ
RTFテキストは、プレーンのテキストに比べて綺麗な装飾を設定できるのがメリットですが、そのためにタグを設定しなければならないのがちょっとやっかいです。しかし、同じPDFドキュメントを作成するなら、綺麗に装飾されたドキュメントの方が見栄えがよくアピール度も高くなります。
C1PdfDocumentコンポーネントは、RTFドキュメントもPDF化できますから、RTFエディタにPDF化処理を組み込めば、機能の高いアプリケーションを作ることができると思います。
参考文献
- Microsoft Dpownload Center『Word 2007: Rich Text Format (RTF) Specification, version 1.9』
- Microsoft サポートオンライン『ASP を使用して RTF (Rich Text Format) ドキュメントを生成し、Microsoft Word にストリーム出力する方法』