SHOEISHA iD

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

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

ComponentZine(ComponentOne)

.NETで文書をPDF化するアプリケーションを作る

PowerTools PDF for .NETのC1PdfDocumentコンポーネントで文書をPDF化する

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

PowerTools PDF for .NETのC1PdfDocumentコンポーネントは、データをPDF化する機能を1つに集約したコンポーネントで、メソッドとプロパティの操作だけでテキストをPDF化することができます。今回はこのコンポーネントを使って、プログラム実行時に入力したデータをPDF化するアプリケーションを作ってみました。

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

はじめに

 最近では、「文書を作成しPDFで公開する」ということも身近なことになってきています。しかし、自分のプログラムで作成したデータをPDFファイルにするには、「データを一度ファイルに保存し、PDF化するソフトを使って変換する」という2段階の処理が必要になり、手間がかかってしまいます。

 PowerTools PDF for .NETのC1PdfDocumentコンポーネントは、データをPDF化する機能を1つに集約したコンポーネントです。メソッドとプロパティの操作だけでテキストをPDF化してくれます。もちろん、画像やグラフィックスを持ったリッチテキストもPDF化することができます。

 そこで、今回はこのC1PdfDocumentコンポーネントを使って、プログラム実行時に入力したデータをPDF化するアプリケーションを作ってみました。

TextBoxに入力した文章をPDF化する
TextBoxに入力した文章をPDF化する
1ページに収まるかどうかを判断し、収まらない場合は自動的にページを追加し作成する
1ページに収まるかどうかを判断し、収まらない場合は自動的にページを追加し作成する

対象読者

 Visual Basic 2005またはVisual C# 2005を使ってプログラムを作ったことのある人。

必要な環境

 Visual Basic 2005またはVisual C# 2005、Visual Studio 2005でプログラムが作れる環境。

プログラム実行時の注意事項

 本稿の実行ファイル(バイナリファイル)を動かすには、zipファイルに同梱してある以下の2つのファイルが必要になります。

  • C1.C1Pdf.2.dll…C1Pdf コントロール(.NET Framework 2.0 用)

 これらのファイルを、実行プログラムと同じフォルダに格納します。また、.NET Framework 2.0から追加されたクラスやメンバを使用しているので、.NET Framework 2.0がインストールされていることが必須条件です。

 また、作成したPDFドキュメントを表示するために、Adobe Readerを使用しますので、使用しているコンピュータにインストールしておいてください。

コンポーネントのインストール

 はじめてPowerTools True WinReports for .NETおよびPowerTools Preview for .NETを使用する方は、プロジェクトにComponentOne Studio 2007 WinForms Editionをインストールする必要があります。

 インストーラは、グレープシティのWebページからダウンロードできますので、ここからダウンロードしてインストールしてください。製品ページ左側の[ダウンロード]-[トライアル版]をクリックし、ダウンロード方法([FTP]または[HTTP])を選択すれば入手できます。ファイルはLZH形式で圧縮されています。

 有償のコンポーネントですが、プロダクトキーを入力せずにインストールすることで、トライアル版として使用できます。制限事項などの詳細については、インストーラに同梱されているリリースノートを参照ください。

コントロールの追加

 ComponentOne Studio 2007 WinForms Editionをインストールしたら、ツールボックスに専用のタブを作成し、PowerTools PDF for .NET を追加します。追加するコンポーネントは、「.NET Frameworkコンポーネント」の「名前空間」が「C1.C1Pdf」で始まる名前空間のコンポーネント「C1PdfDocument」です。

「名前空間」が「C1.C1Pdf」で始まる名前空間のコンポーネント「C1PdfDocument」を選択する
「名前空間」が「C1.C1Pdf」で始まる名前空間のコンポーネント「C1PdfDocument」を選択する
※注意
 Visual Studio .NET 2002/2003用コンポーネントとVisual Studio 2005用コンポーネントは、名称や名前空間がほとんど同じですが、Visual Studio .NET 2002/2003用コンポーネントを Visual Studio 2005環境で使うことはできないので注意してください。
 Visual Studio 2005用コンポーネントは、アセンブリ名が「C1.C1Pdf.2 」と末尾に「.2」が付いています。必ずアセンブリ名を確認し、コンポーネントを選択してください。

GUIの作成

 フォームの作成はとても簡単です。TextBoxを2つ、LabelとButton、C1PdfDocumentコンポーネントを1つずつ配置します。

 C1PdfDocumentコンポーネントは機能を提供するコンポーネントで、ユーザーの操作は受け付けませんのでフォームの外に配置されます。TextBoxは、[Multiline]プロパティを「True」にし、[ScrollBars]プロパティを「Vertical」に設定しておきます。

GUIデザイン
GUIデザイン

C1PdfDocumentコンポーネントについて

 PowerTools PDF for .NETのC1PdfDocumentコンポーネントは、メソッドとプロパティの操作だけで、テキストをPDF化できます。また、テキストだけでなく画像やグラフィックスを持ったリッチテキストもPDF化することができます。

 線、四角形、楕円、扇形、円弧、丸角の四角形、ポリゴン、ベジェ曲線などのグラフィックス描画用メソッドを持っており、プログラム実行時にグラフなどを作成してPDFファイルにすることも可能です。

 さらに、PDF特有の目次やブックマーク、注釈、ハイパーリンク機能までも使うことができます。左ペインにアウトライン構造が表示されるPDFをよく見ますが、このようなPDFを作成することもでき、PDFドキュメントを暗号化して、権限を持ったユーザーのみがパスワードを使ってアクセスできるように設定することも可能です。

目次とブックマークを持つPDFファイル
目次とブックマークを持つPDFファイル
いろいろなサイズや向きの文書を作ることができる
いろいろなサイズや向きの文書を作ることができる

 C1PdfDocumentコンポーネントを使ってPDFドキュメントを作成するには、基本的には次のような手順を取ります。

  1. 文字列を描画するための矩形を用意する
  2. DrawStringメソッドを使用し、文字列、フォント、ブラシを使用し矩形に文字列を描画する
  3. Saveメソッドを使用し、ドキュメントをファイルまたはストリームに保存する

 C1Pdfではポイントベースの座標システムを使用し、原点はページの左上隅になります。座標システムがピクセルではなくポイントに基づいているため、描画エリアのサイズや位置などに使用する構造体は、float型のメンバを持つ RectangleF、SizeF、PointFの各構造体を使用します。

 int型のメンバを持つ構造体は使用しません。

PDF化処理の作成

 処理のすべては、ButtonコントロールのClickイベントハンドラで行います。

 このプログラムでは、TextBoxに入力された文字列をPDFドキュメントとして作成します。TextBoxは、MultilineプロパティをTrueにして、複数行編集ができるようにしているので、TextBoxへの入力文字列が1ページを超える可能性があります。

 そこで、入力文字列がPDFの1ページに収まるかどうかを判断し、収まらなければページを追加してすべての文字列がPDFドキュメントに入るような処理を組み込みます。

PDF作成の準備と最初の描画

 最初に、PDF化の準備処理を作成します。まずPDFドキュメントに使用するフォントと描画領域を作成し、TextBoxに入力文字列がなければメッセージを表示してイベントハンドラの処理を中止するようにします。

 TextBoxに文字列があれば、それを取得し変数に格納しておきます。

Visual Basic
Private Sub Button1_Click(ByVal sender As System.Object, _
                 ByVal e As System.EventArgs) Handles Button1.Click
    Dim font As Font = New Font("MS ゴシック", 10)
    Dim rc As RectangleF
    Dim nextchr As Integer
    
    If Me.TextBox1.Text = "" Then
        MessageBox.Show("文書を入力してください")
        Exit Sub
    End If
    
    Dim doc As String = Me.TextBox1.Text
C#
private void Button1_Click(object sender, EventArgs e)
{
    Font font = new Font("MS ゴシック", 10);
    RectangleF rc;
    int nextchr ;

    if(TextBox1.Text == ""){
        MessageBox.Show("文書を入力してください");
        return;
    }
    
    String doc = TextBox1.Text;

 次に、C1PdfDocumentコンポーネントのPageRectangleプロパティから、現在のページ面を表す四角形をポイント単位で取得します。 また、Inflateメソッドでこの RectangleF構造体を少し縮小します。これで、PDFドキュメントの上下左右に余白ができます。

 そして、DrawStringメソッドでこの四角形に文字列を描画します。引数は4つで、「描画文字列」「描画フォント」「描画ブラシ」「描画先のRectangleF構造体」です。

 DrawStringメソッドは、引数に指定した文字列が描画先の四角形にすべて収まらなかった場合、残った文字列の最初の文字のインデックス番号を返してきますので、これを変数に保存しておきます。

Visual Basic
rc = Me.C1PdfDocument1.PageRectangle
rc.Inflate(-50, -50)

nextchr = Me.C1PdfDocument1.DrawString(doc, font, Brushes.Black, rc)
C#
rc = c1PdfDocument1.PageRectangle;
rc.Inflate(-50, -50);

nextchr = c1PdfDocument1.DrawString(doc, font, Brushes.Black, rc);

ページの追加と残った文字列の描画処理

 このインデックス番号が、文字列の総文字数よりも小さければ、描画文字列は1ページに収まらないということがわかりますので、次のページを追加して続きの文字列を描画する処理を組み立てます。ただし、追加するページは何ページになるのかが分からないので、この処理はwhileステートメントを使用し、インデックス番号が総文字数内である間は処理を繰り返すようにします。

 まず、変数docの文字列からすでに描画した文字列を除いて残った文字列を取得します。この処理は、StringクラスのSubstringメソッドを使用します。このメソッドは、引数に指定した文字位置から終端までの文字を取り出して返してきますので、その戻り値を変数docに再度代入します。

 そして、C1PdfDocumentコンポーネントのNewPageメソッドで新しいページを追加し、そこに残りの文字列をDrawStringで描画します。

 ここでも、さらに描画しきれない文字列があれば、再度この処理を繰り返し、すべての文字列が描画できるまでページを追加して文字列を描画していきます。

Visual Basic
If nextchr < doc.Length Then
    While nextchr < doc.Length
        doc = doc.Substring(nextchr)
        Me.C1PdfDocument1.NewPage()
        nextchr = Me.C1PdfDocument1.DrawString(doc, _
                                    font, Brushes.Black, rc)
    End While
End If
C#
if(nextchr < doc.Length){
    while(nextchr < doc.Length){
        doc = doc.Substring(nextchr);
        c1PdfDocument1.NewPage();
        nextchr = c1PdfDocument1.DrawString(doc, 
                                            font, Brushes.Black, rc);
    }
}

PDFドキュメントの保存と表示

 すべての文字列の描画が終われば、ドキュメントをSaveメソッドで保存します。引数はファイル名とパス名です。ここでは、もう1つのTextBoxに入力されているパスとファイル名でPDFドキュメントを保存します。

 そして、ProcessクラスのStartメソッドを使い、保存したPDFファイルを表示します。

 最後に、作成したドキュメントをC1PdfDocumentコンポーネントから削除し、次のドキュメントの作成に備えて出来上がりです。

Visual Basic
Dim fname As String = Me.TextBox2.Text

Try
    Me.C1PdfDocument1.Save(fname)
Catch ex As Exception
    MessageBox.Show(ex.Message)
    Exit Sub
End Try

Dim ret As Integer = MessageBox.Show("作成したPDFを表示しますか?", _
                         "PDFの表示", MessageBoxButtons.YesNo, _
                         MessageBoxIcon.Question)

If ret = DialogResult.Yes Then
    Process.Start(fname)
Else
    MessageBox.Show("PDFファイルを保存しました")
End If

Me.C1PdfDocument1.Clear()
C#
String fname = TextBox2.Text;

try{
    c1PdfDocument1.Save(fname);
}catch(Exception ex){
    MessageBox.Show(ex.Message);
    return;
}

DialogResult ret = MessageBox.Show("作成したPDFを表示しますか?", 
                       "PDFの表示", MessageBoxButtons.YesNo, 
                       MessageBoxIcon.Question);

if(ret == DialogResult.Yes){
    System.Diagnostics.Process.Start(fname);
}else{
    MessageBox.Show("PDFファイルを保存しました");
}

 c1PdfDocument1.Clear();

まとめ

 C1PdfDocumentコンポーネントを使うと、実に簡単にPDFファイルを作成できるのがわかると思います。

 今回は、単純なテキストをPDFファイル化しましたが、C1PdfDocumentコンポーネントではいろいろな用紙サイズのPDFを作成でき、用紙の縦横だけではなく縦書き文字の作成も可能になっています。

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

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

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

この記事をシェア

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

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング