SHOEISHA iD

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

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

ComponentZine(ComponentOne)

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

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

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

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

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

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

もっと読む

この記事の著者

瀬戸 遥(セト ハルカ)

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

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

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

この記事をシェア

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

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング