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を作成でき、用紙の縦横だけではなく縦書き文字の作成も可能になっています。