はじめに
最近、作成した文書や資料をPDFにして配布・閲覧する機会が多くなっています。どんなアプリケーションでも印刷機を介してPDFファイルに変換できる印刷ドライバが出回っていますが、どうせなら、独自のアプリケーションに最初からPDFを作成してくれる機能を組み込みたいですね。
ComponentOne Studio Enterprise 2011JのPDF for .NETコンポーネントに収録されているC1PdfDocumentコントロールは、アプリケーションにPDFファイル作成機能を提供してくれるコントロールです。通常データのPDF化はもちろん、書式を持ったリッチテキスト(.rtf)もそのままPDFに変換でき、プロパティの設定、電子署名、セキュリティ、圧縮、アウトライン、ハイパーリンク、添付ファイルといったPDFの高度な機能の大部分を使うことができます。
今回はこのC1PdfDocumentコントロールを使い、書式とプロパティを持った文書をPDFドキュメントとして保存するWindowsアプリケーションを作ってみました。
対象読者
Visual Basic、Visual C# 2010を使ってプログラムを作ったことのある人
必要な環境
Visual Basic 2010、Visual C# 2010、Visual Studio 2010でプログラムが作れる環境。なお、本プログラムはWindows Vista上で動作するVisual Studio 2010を使用して作成し、動作確認を行っています。
PDF for .NETを使って作成したアプリケーションを配布する場合、アセンブリファイルを添付する必要があります。アプリケーションを正常に動作させるためには、次のファイルをインストールする必要があります。
ファイル | 内容 |
C1.C1Pdf.2.dll | 本体アセンブリ |
C1.C1Pdf.4.dll | 本体アセンブリ(※) |
上記のファイルを、プログラムを実行するフォルダにフォルダ構成を変えずに格納します。なお、本サンプルプログラムを実行するには、Adobe Readerがインストールされている必要があるため、ご注意ください。
コンポーネントのインストール
この記事の手順を試すには、Visual Studio、Visual Basic、Visual C#の開発環境にComponentOne Studio Enterprise 2011J(または、ComponentOne Studio for Windows Forms 2010J)をインストールする必要があります。インストーラは、グレープシティのWebページからダウンロードできます。
製品のトライアル版一覧ページにてダウンロードしたい製品にチェックを入れ、ページ右上部の[申込フォーム]をクリックしてグレープシティのWebサイトへ必要情報を登録すると、添付トライアルライセンスキーファイルとダウンロードサイトを記載したE-Mailが送られてきますので、ここからダウンロードします。制限事項などの詳細については、インストーラに同梱されているリリースノートを参照ください。
コントロールの追加
ComponentOne Studio Enterprise 2011J(または、ComponentOne Studio for Windows Forms 2010J)をインストールしたら、ツールボックスに専用のタブを作成し、使用するコントロールを追加します。追加するコントロールは、アセンブリ名が「C1.C1Pdf.4」の「C1PdfDocument」です。

C1PdfDocumentコントロールについて
PDF for .NETのC1PdfDocumentコントロールは、.NET FrameworkアプリケーションからPDFドキュメントを作成できるライブラリです。PDFフォーム、電子署名、セキュリティ、圧縮、アウトライン、ハイパーリンク、添付ファイルなどの、PDFが持つ高度な機能を利用できます。
テキストの描画機能
PDF for .NETの最大の特長は、使い方が簡単であることです。ドキュメントに内容を追加するための方法は、.NET FrameworkのGraphicsクラスの使い方と良く似ています。.NETでのテキストとグラフィックスの表示方法を知っていれば、PDF for .NETの使い方はすぐ身につきます。
例えば、データをテキストとしてPDFドキュメントにするには、C1PdfDocumentクラスの「DrawString」メソッドを使用します。このメソッドは、テキストを指定の四角形の左上に配置し、四角形内でテキストを折り返します。描画用の四角形は、RectangleFクラスで四角形のサイズと描画位置を指定するため、自由なレイアウトで作成できます。また、テキストの描画に際し、使用するフォントと描画色を指定できるため、書式を設定したテキストとして描画することもできます。
オーバーロードされているDrawStringメソッドでは、引数にStringFormatオブジェクトを指定できるメソッドもあるので、配置、方向、タブストップなどのテキストレイアウト情報や、省略記号の挿入、国別の代替の数字形式などの表示方法も指定してテキストを描画できます。
次のコードは、ヘルプファイルにあるテキスト描画のサンプルコードです。最初にフォントと描画領域の四角形と描画する文字列を作成しDrawStringメソッドを実行、引数にStringFormatオブジェクトを使って文字の配置を指定して描画しています。ほとんどの文字の描画は、このような手法でPDFドキュメントに描画していきます。
Dim font As New Font("MS PGothic", 12) Dim rect As New RectangleF(72, 72, 100, 100) Dim text As String = "小さい矩形領域内に描画するための長いテキスト。" ' テキストを中央配置します。 Dim sf As New StringFormat() sf.Alignment = StringAlignment.Center sf.LineAlignment = StringAlignment.Center C1PdfDocument1.DrawString(text, font, Brushes.Black, rect, sf) C1PdfDocument1.DrawRectangle(Pens.Gray, rect)
Font font = new Font("MS PGothic", 12); RectangleF rect = new RectangleF(72, 72, 100, 100); string text = "小さい矩形領域内に描画するための長いテキスト。"; // テキストを中央配置します。 StringFormat sf = new StringFormat(); sf.Alignment = StringAlignment.Center; sf.LineAlignment = StringAlignment.Center; c1PdfDocument1.DrawString(text, font, Brushes.Black, rect, sf); c1PdfDocument1.DrawRectangle(Pens.Gray, rect);

C1PdfDocumentクラスとメンバの特徴
C1PdfDocumentクラスは、ドキュメントを作成/保存する方法を提供するクラスです。C1PdfDocumentクラスのインスタンスを作成すると、1ページの空白ページを持つPDFドキュメントを持ちます。メンバメソッドには、テキストや図形を描画するメソッドが多く属しており、これらのメソッドを使ってデータをPDFドキュメント化します。
テキストの描画には、DrawStringメソッド以外にDrawStringRtfメソッドがあります。このメソッドは、文字のサイズや描画色、描画位置などの属性を持つテキスト「リッチテキスト」を描画します。WindowsフォームのRichTextBoxコントロールで、このリッチテキストを描画できます。
メソッド | 説明 |
Clear | ドキュメントを初期状態に戻します |
Dispose | コントロールで使用されるすべてのリソースを解放します |
DrawArc | RectangleF構造体で指定された楕円の一部を表す円弧を描画します |
DrawBezier | 4つのPointF構造体で定義されるベジェ曲線を描画します |
DrawBeziers | PointF構造体の配列から一連のベジェ曲線を描画します |
DrawEllipse | 楕円を描画します |
DrawImage | イメージを描画します |
DrawLine | 直線を描画します |
DrawLines | PointF構造体の配列を結ぶ一連の直線を描画します |
DrawPie | RectangleF構造体で定義される楕円と2つの角度によって指定された扇形を描画します |
DrawPolygon | PointF構造体の配列で定義された多角形を描画します |
DrawRectangle | 四角形を描画します |
DrawString | プレーンテキストを描画します |
DrawStringHtml | HTMLテキストを描画します |
DrawStringRtf | リッチテキストを描画します |
FillArc | RectangleF構造体で指定された楕円の一部を表す円弧の内部を塗りつぶします |
FillEllipse | 塗りつぶされた楕円を描画します |
FillPie | RectangleF構造体で定義される楕円と2つの角度によって指定された扇形の内部を塗りつぶします |
FillPolygon | 塗りつぶされた多角形を描画します |
FillRectangle | 塗りつぶされた四角形を描画します |
MeasureString | 指定したFontで描画した場合の、指定した文字列を計測します |
MeasureStringHtml | 指定されたFontオブジェクトで表示されたときのHTML文字列を計測します |
MeasureStringRtf | 指定されたFontオブジェクトで描画されたRTF文字列のサイズを測定します |
NewPage | 新しいページを開始します |
Write | PDFストリームの現在のページに生のコンテンツを書き込みます |
PDFドキュメントの作成
PDFドキュメントを作成する方法もとても簡単で、保存するファイル名を引数に指定し、Saveメソッドを実行するだけです。作業の流れは、以下のたった3つです。
- コンテンツとなるテキストや図形を描画する
- 保存するファイル名を作成する
- Saveメソッドを実行する
ドキュメントプロパティの設定が可能
PDFドキュメントには、作成者やタイトルなどの情報をプロパティとして含めることができます。これらのドキュメントプロパティはDocumentInfoクラスの次のプロパティを使って設定します。
設定内容 | 操作プロパティ |
タイトル | Title |
作成者 | Author |
サブタイトル | Subject |
キーワード | Keywords |
アプリケーション | Creator |
PDF Producer | Produce |
フォームの作成
では、C1PdfDocumentコントロールを使ってプログラムを作成しましょう。作成するプログラムは、業務連絡という定型文書をPDF文書として作成するアプリケーションです。
GUIのデザイン
使用するコントロールは、Label、TextBox、GroupBox、Buttonです。文書を記述するコントロールにはRichTextBoxを使用し、記述したテキストの状態をそのままPDF文書にできるようにします。C1PdfDocumentコントロールは、ユーザーインターフェイスを持たず、プロセスだけを提供するため、フォームの外にレイアウトされます。
フォームに入力されたデータをPDF化する処理
フォームに入力された内容を、コードでPDFドキュメントに作成していきます。トリガーのイベントハンドラはButtonコントロールのClickイベントハンドラです。処理は、次の順序で行います。
- フォームのLoadイベントハンドラで、TextBox「発行日」に当日の日付を入力
- ButtonのClickイベントハンドラで、PDFドキュメントのコンテンツを作成
- PDF文書のプロパティを作成
- RichTextBoxコントロールの入力内容を一度RTF形式でファイルに保存
- その内容を含めPDFファイルを作成
- 作成したPDFドキュメントを表示
PDFドキュメントのコンテンツ作成には、独自のプロシージャ(メソッド)を使用します。
前準備
まずは、発行日の日付入力と、テキストボックス「発行者」に入力があるとこの内容をテキストボックス「作成者」に入力する処理を作成します。日付はDateTimeクラスを使用し、yyyy年mm月dd日形式でTextBox「発行日」に入力します。テキストボックス「作成者」の入力は、テキストボックス「発行者のTextChangedイベントハンドラ」で行います。
Imports System.IO Public Class Form1 Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load TextBox_発行日.Text = DateTime.Today.Date.ToString("D") End Sub Private Sub TextBox_発行者_TextChanged(sender As System.Object, e As System.EventArgs) Handles TextBox_発行者.TextChanged TextBox_作成者.Text = TextBox_発行者.Text End Sub
using System.IO; namespace rtf_pdf_cs { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { textBox_発行日.Text = DateTime.Today.Date.ToString("D"); } private void textBox_発行者_TextChanged(object sender, EventArgs e) { textBox_作成者.Text = textBox_発行者.Text; }
PDFコンテンツの作成
次に、処理のメインとなるPDFコンテンツを作成していきます。独自のプロシージャ(メソッド)「pdfcontents」を作成し、この中に処理を作成します。コードは、上から順番にレイアウトするように、次の順序で作成していきます。
- 発行者の作成
- 発行日の作成
- 発行番号の作成
- 見出しの作成
- 題名の作成
これらは、いずれも使用するフォント、描画領域、描画色を作成/指定してDrawStringメソッドで描画します。描画領域の位置とサイズに注意してください。それぞれ、PDFドキュメントのどの位置にくるのかを計算しながら決めていきます。
また、「RichTextBox_内容」については、改行やタブの情報も含めてPDFドキュメント化するため、一度RichTextBoxコントロールのSaveFileメソッドで入力内容をRTF形式のファイルに保存し、DrawStringRtfメソッドで描画します。こうすると、テキストを加工することなく簡単にRTFテキストを描画できます。描画した各データは、いずれもストリームに格納されます。
Private Sub pdfcontents() '発行者の作成 Dim newfont As Font = New Font("MS Pゴシック", 10, FontStyle.Regular) Dim newrect As RectangleF = New RectangleF(300, 20, 200, 30) C1PdfDocument1.DrawString("発行者:" + TextBox_発行者.Text, newfont, Brushes.Black, newrect) '発行日の作成 newfont = New Font("MS Pゴシック", 10, FontStyle.Regular) newrect = New RectangleF(300, 35, 200, 30) C1PdfDocument1.DrawString("発行日:" + TextBox_発行日.Text, newfont, Brushes.Black, newrect) '発行番号の作成 newfont = New Font("MS Pゴシック", 10, FontStyle.Regular) newrect = New RectangleF(300, 50, 150, 30) C1PdfDocument1.DrawString("発行番号:" + TextBox_発行番号.Text, newfont, Brushes.Black, newrect) '見出しの作成 newfont = New Font("MS Pゴシック", 28, FontStyle.Underline) newrect = New RectangleF(200, 120, 200, 30) C1PdfDocument1.DrawString("業 務 連 絡", newfont, Brushes.Black, newrect) '題名の作成 newfont = New Font("MS Pゴシック", 16, FontStyle.Regular) newrect = New RectangleF(100, 200, 400, 30) C1PdfDocument1.DrawString(TextBox_題名.Text, newfont, Brushes.Blue, newrect) '内容の作成 newfont = New Font("MS Pゴシック", 12) newrect = New RectangleF(50, 250, 400, 400) RichTextBox_内容.SaveFile("temp.rtf") Dim st As String = File.ReadAllText("temp.rtf", System.Text.Encoding.Default) C1PdfDocument1.DrawStringRtf(st, newfont, Brushes.Black, newrect) End Sub
private void pdfcontents() { //発行者の作成 Font newfont = new Font("MS Pゴシック", 10, FontStyle.Regular); RectangleF newrect = new RectangleF(300, 20, 200, 30); c1PdfDocument1.DrawString("発行者:" + textBox_発行者.Text, newfont, Brushes.Black, newrect); //発行日の作成 newfont = new Font("MS Pゴシック", 10, FontStyle.Regular); newrect = new RectangleF(300, 35, 200, 30); c1PdfDocument1.DrawString("発行日:" + textBox_発行日.Text, newfont, Brushes.Black, newrect); //発行番号の作成 newfont = new Font("MS Pゴシック", 10, FontStyle.Regular); newrect = new RectangleF(300, 50, 150, 30); c1PdfDocument1.DrawString("発行番号:" + textBox_発行番号.Text, newfont, Brushes.Black, newrect); //見出しの作成 newfont = new Font("MS Pゴシック", 28, FontStyle.Underline); newrect = new RectangleF(200, 120, 200, 30); c1PdfDocument1.DrawString("業 務 連 絡", newfont, Brushes.Black, newrect); //題名の作成 newfont = new Font("MS Pゴシック", 16, FontStyle.Regular); newrect = new RectangleF(100, 200, 400, 30); c1PdfDocument1.DrawString(textBox_題名.Text, newfont, Brushes.Blue, newrect); //内容の作成 newfont = new Font("MS Pゴシック", 12); newrect = new RectangleF(50, 250, 400, 400); richTextBox_内容.SaveFile("temp.rtf"); String st = File.ReadAllText("temp.rtf", System.Text.Encoding.Default); c1PdfDocument1.DrawStringRtf(st, newfont, Brushes.Black, newrect); }
作成したPDFコンテンツ「pdfcontents」は、Button「PDF文書を作成する」のClickイベントハンドラで呼び出します。
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click 'PDFコンテンツの作成 pdfcontents()
private void button1_Click(object sender, EventArgs e) { //PDFコンテンツの作成 pdfcontents();
PDF文書のプロパティ作成
続いて、PDF文書のプロパティに表示される情報を作成します。これは、既に説明したように、DocumentInfoクラスのプロパティを使って設定します。各プロパティに該当するTextBoxコントロールの入力値を代入するだけです。
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click 'PDFコンテンツの作成 pdfcontents() 'PDF文書のプロパティ作成 C1PdfDocument1.DocumentInfo.Author = TextBox_作成者.Text C1PdfDocument1.DocumentInfo.Subject = TextBox_サブタイトル.Text C1PdfDocument1.DocumentInfo.Keywords = TextBox_キーワード.Text C1PdfDocument1.DocumentInfo.Title = TextBox_題名.Text
private void button1_Click(object sender, EventArgs e) { //PDFコンテンツの作成 pdfcontents(); //PDF文書のプロパティ作成 c1PdfDocument1.DocumentInfo.Author = textBox_作成者.Text; c1PdfDocument1.DocumentInfo.Subject = textBox_サブタイトル.Text; c1PdfDocument1.DocumentInfo.Keywords = textBox_キーワード.Text; c1PdfDocument1.DocumentInfo.Title = textBox_題名.Text;
PDFファイルの作成
PDFドキュメントの内容ができあがったら保存するファイル名を作成し、C1PdfDocumentクラスのSaveメソッドを実行すると、プロパティの内容を持ったPDFドキュメントが作成されます。あとは、メッセージボックスで保存した旨を表示し、ProcessクラスのStartメソッドを使って作成したPDFドキュメントを表示してできあがりです。
'PDFファイルの作成 Dim fname As String = "業務連絡" + TextBox_発行番号.Text + " .pdf" C1PdfDocument1.Save(fname) MessageBox.Show("PDF文書を作成しました", "文書保存", MessageBoxButtons.OK, MessageBoxIcon.Information) System.Diagnostics.Process.Start(fname) End Sub Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click Me.Close() End Sub
//PDFファイルの作成 String fname = "業務連絡" + textBox_発行番号.Text + " .pdf"; c1PdfDocument1.Save(fname); MessageBox.Show("PDF文書を作成しました", "文書保存", MessageBoxButtons.OK, MessageBoxIcon.Information); System.Diagnostics.Process.Start(fname); } private void button2_Click(object sender, EventArgs e) { this.Close(); }
まとめ
C1PdfDocumentコントロールは、これまで紹介してきたようにとても簡単にデータをPDFドキュメント化できます。C1PdfDocumentコントロールがRTFデータをPDF化できる機能を持っているため、RichTextBoxコントロールと組み合わせることで、書式付テキストだけでなく段落やインデント、表組みなども作成できます。ただ簡単なだけでなく、見た目にもかなりのリッチなレベルでPDFドキュメント作成アプリケーションを作ることが可能です。