SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

ComponentZine(ComponentOne)

テキストファイルをRTFテキストに変換してPDF化するアプリケーション

C1PdfDocumentコンポーネントを使ったドキュメント変換アプリの作成

  • このエントリーをはてなブックマークに追加

テキストファイルを読み込んでRTF化を実行する処理

 今度は、テキストファイルを読み込んで、RTFテキストに変換してPDFドキュメント化する処理を作ります。

 テキストファイルは、画面のように大見出し、中見出し、小見出しを◆◇▲の記号で区別し、特に色を変えたい行には※記号をつけています。

テキストは記号で装飾の違いを区別している
テキストは記号で装飾の違いを区別している

 プログラム側では、この記号を識別しRTFタグの設定を変えるようにしています。

このような形でRTFテキスト化する
このような形でRTFテキスト化する

 この処理は、ボタン「読み込み」のイベントハンドラに作成します。

※注意
 サンプルのテキストファイル「pdf-data.txt」を、ドライブCのルートにおいてからプログラムを実行してください。

PDF作成の準備

 最初に、PDF作成のための各種設定を行います。ここは、先に作成したプログラムと同じようなコードです。一部数値と変数の数が変わっています。カラーテーブルも、色数を1つ増やしています。

 配列buff()は、ファイルから読み込んだテキストを格納するのに使用します。

Visual Basic
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;}"
C#
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コードページのエンコーディングを使用してデータを取り出します。

Visual Basic
buff = File.ReadAllLines("c:\pdf-data.txt", Encoding.Default)
C#
buff = File.ReadAllLines("c:/pdf-data.txt", Encoding.Default);

 取り出したテキストデータは、1行ずつ配列Buffの要素に格納されているので、VBではFor Each...Nextステートメントで、C#であればforeachステートメントを使って1行ずつ参照し、文字列の先頭にある記号を取りだして、処理を分岐します。文字の取り出しは、StringクラスのSubstringメソッドを使用します。なお、配列には元のテキストファイルにある改行分も要素に格納されていますが、中身は空なのでデータのある場合だけ先頭の1文字を取り出します。

Visual Basic
For Each s In buff
    If s <> "" Then
        c = s.Substring(0, 1)
        Select Case c
C#
foreach (String s in buff)
{
    if (s != "")
    {
        c = s.Substring(0, 1);
        switch (c)

 先頭の文字を取り出したら、後はそれぞれの書式になるようにRTFタグを設定します。先頭の記号はPDFドキュメントには必要ないので、StringクラスのRemoveメソッドで切り取っておきます。

 そして、すべての行がカラーテーブルの記述を含め1行の文字列になるようにして変数strに格納します。このとき、空白の要素がある場合は、改行するように{\par }を結合しておきます。

Visual Basic
            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
C#
        {
            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で表示するようにしています。

Visual Basic
Me.C1PdfDocument1.DrawStringRtf(str, font, Brushes.Black, rc)
Me.TextBox1.Text = str
savepdf()
C#
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
  • このドキュメントでは、「\」(英語キーボードではバックスラッシュ)を「Control Symbol」、「tab」や「fb」などの命令記号を「Destinations」、「{}」を「Group」と呼び、これらを総称して「Control Word」と呼んでいますが、本稿では記事の内容を分かりやすくするために「タグ」という用語に置き換えて記述しています。

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
ComponentZine(ComponentOne)連載記事一覧

もっと読む

この記事の著者

瀬戸 遥(セト ハルカ)

8ビットコンピュータの時代からBASICを使い、C言語を独習で学びWindows 3.1のフリーソフトを作成、NiftyServeのフォーラムなどで配布。Excel VBAとVisual Basic関連の解説書を中心に現在まで40冊以上の書籍を出版。近著に、「ExcelユーザーのためのAccess再...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/1874 2008/06/24 15:07

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング