はじめに
最近では、「文書を作成しPDFで公開する」ということも身近なことになってきています。しかし、自分のプログラムで作成したデータをPDFファイルにするには、「データを一度ファイルに保存し、PDF化するソフトを使って変換する」という2段階の処理が必要になり、手間がかかってしまいます。
PowerTools PDF for .NETのC1PdfDocumentコンポーネントは、データをPDF化する機能を1つに集約したコンポーネントです。メソッドとプロパティの操作だけでテキストをPDF化してくれます。もちろん、画像やグラフィックスを持ったリッチテキストもPDF化することができます。
そこで、今回はこのC1PdfDocumentコンポーネントを使って、プログラム実行時に入力したデータをPDF化するアプリケーションを作ってみました。
対象読者
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」です。
Visual Studio 2005用コンポーネントは、アセンブリ名が「C1.C1Pdf.2 」と末尾に「.2」が付いています。必ずアセンブリ名を確認し、コンポーネントを選択してください。
GUIの作成
フォームの作成はとても簡単です。TextBoxを2つ、LabelとButton、C1PdfDocumentコンポーネントを1つずつ配置します。
C1PdfDocumentコンポーネントは機能を提供するコンポーネントで、ユーザーの操作は受け付けませんのでフォームの外に配置されます。TextBoxは、[Multiline]プロパティを「True」にし、[ScrollBars]プロパティを「Vertical」に設定しておきます。
C1PdfDocumentコンポーネントについて
PowerTools PDF for .NETのC1PdfDocumentコンポーネントは、メソッドとプロパティの操作だけで、テキストをPDF化できます。また、テキストだけでなく画像やグラフィックスを持ったリッチテキストもPDF化することができます。
線、四角形、楕円、扇形、円弧、丸角の四角形、ポリゴン、ベジェ曲線などのグラフィックス描画用メソッドを持っており、プログラム実行時にグラフなどを作成してPDFファイルにすることも可能です。
さらに、PDF特有の目次やブックマーク、注釈、ハイパーリンク機能までも使うことができます。左ペインにアウトライン構造が表示されるPDFをよく見ますが、このようなPDFを作成することもでき、PDFドキュメントを暗号化して、権限を持ったユーザーのみがパスワードを使ってアクセスできるように設定することも可能です。
C1PdfDocumentコンポーネントを使ってPDFドキュメントを作成するには、基本的には次のような手順を取ります。
- 文字列を描画するための矩形を用意する
- DrawStringメソッドを使用し、文字列、フォント、ブラシを使用し矩形に文字列を描画する
- 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に文字列があれば、それを取得し変数に格納しておきます。
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
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メソッドは、引数に指定した文字列が描画先の四角形にすべて収まらなかった場合、残った文字列の最初の文字のインデックス番号を返してきますので、これを変数に保存しておきます。
rc = Me.C1PdfDocument1.PageRectangle rc.Inflate(-50, -50) nextchr = Me.C1PdfDocument1.DrawString(doc, font, Brushes.Black, rc)
rc = c1PdfDocument1.PageRectangle; rc.Inflate(-50, -50); nextchr = c1PdfDocument1.DrawString(doc, font, Brushes.Black, rc);
ページの追加と残った文字列の描画処理
このインデックス番号が、文字列の総文字数よりも小さければ、描画文字列は1ページに収まらないということがわかりますので、次のページを追加して続きの文字列を描画する処理を組み立てます。ただし、追加するページは何ページになるのかが分からないので、この処理はwhileステートメントを使用し、インデックス番号が総文字数内である間は処理を繰り返すようにします。
まず、変数docの文字列からすでに描画した文字列を除いて残った文字列を取得します。この処理は、StringクラスのSubstringメソッドを使用します。このメソッドは、引数に指定した文字位置から終端までの文字を取り出して返してきますので、その戻り値を変数docに再度代入します。
そして、C1PdfDocumentコンポーネントのNewPageメソッドで新しいページを追加し、そこに残りの文字列をDrawStringで描画します。
ここでも、さらに描画しきれない文字列があれば、再度この処理を繰り返し、すべての文字列が描画できるまでページを追加して文字列を描画していきます。
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
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コンポーネントから削除し、次のドキュメントの作成に備えて出来上がりです。
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()
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を作成でき、用紙の縦横だけではなく縦書き文字の作成も可能になっています。