SHOEISHA iD

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

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

ComponentZine(ComponentOne)

書式を持った文書をPDF化する.NET アプリケーションの作成

ComponentOne Studio Enterprise 2011JのPDF for .NETコンポーネントを使ったアプリケーションの作成

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

 今回は、ComponentOne Studio Enterprise 2011JのPDF for .NETに収録されているC1PdfDocumentを取り上げます。このコントロールはアプリケーションにPDFファイル作成機能を提供します。今回はこのコントロールを使って、書式とプロパティを持ったリッチテキスト文書をPDFドキュメントとして保存するWindowsアプリケーションを作ってみました。

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

はじめに

 最近、作成した文書や資料をPDFにして配布・閲覧する機会が多くなっています。どんなアプリケーションでも印刷機を介してPDFファイルに変換できる印刷ドライバが出回っていますが、どうせなら、独自のアプリケーションに最初からPDFを作成してくれる機能を組み込みたいですね。

 ComponentOne Studio Enterprise 2011JのPDF for .NETコンポーネントに収録されているC1PdfDocumentコントロールは、アプリケーションにPDFファイル作成機能を提供してくれるコントロールです。通常データのPDF化はもちろん、書式を持ったリッチテキスト(.rtf)もそのままPDFに変換でき、プロパティの設定、電子署名、セキュリティ、圧縮、アウトライン、ハイパーリンク、添付ファイルといったPDFの高度な機能の大部分を使うことができます。

 今回はこのC1PdfDocumentコントロールを使い、書式とプロパティを持った文書をPDFドキュメントとして保存するWindowsアプリケーションを作ってみました。

フォーム上でドキュメントを作成、リッチテキストボックスコントロールを使って入力
フォーム上でドキュメントを作成、リッチテキストボックスコントロールを使って入力
リッチテキストとして保存しているので改行もそのままPDFに変換
リッチテキストとして保存しているので改行もそのままPDFに変換
作成したPDFドキュメントにプロパティを設定
作成したPDFドキュメントにプロパティを設定

対象読者

 Visual Basic、Visual C# 2010を使ってプログラムを作ったことのある人

必要な環境

 Visual Basic 2010、Visual C# 2010、Visual Studio 2010でプログラムが作れる環境。なお、本プログラムはWindows Vista上で動作するVisual Studio 2010を使用して作成し、動作確認を行っています。

※サンプルソース実行時の注意事項

 PDF for .NETを使って作成したアプリケーションを配布する場合、アセンブリファイルを添付する必要があります。アプリケーションを正常に動作させるためには、次のファイルをインストールする必要があります。


必要なアセンブリファイル(※は.NET Framework 4でのみ使用可能)
ファイル 内容
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」です。

アセンブリ名が「C1.C1Pdf.4」の「C1PdfDocument」コントロールを選択
アセンブリ名が「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ドキュメントに描画していきます。

Visual Basic
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)
C#
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コントロールで、このリッチテキストを描画できます。

C1PdfDocumentクラスの描画用メンバメソッド(抜粋)
メソッド 説明
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つです。

  1. コンテンツとなるテキストや図形を描画する
  2. 保存するファイル名を作成する
  3. Saveメソッドを実行する

ドキュメントプロパティの設定が可能

 PDFドキュメントには、作成者やタイトルなどの情報をプロパティとして含めることができます。これらのドキュメントプロパティはDocumentInfoクラスの次のプロパティを使って設定します。

DocumentInfoクラスのプロパティ
設定内容 操作プロパティ
タイトル Title
作成者 Author
サブタイトル Subject
キーワード Keywords
アプリケーション Creator
PDF Producer Produce
設定した内容はPDFドキュメントの「文書のプロパティ」に表示される
設定した内容はPDFドキュメントの「文書のプロパティ」に表示される

フォームの作成

 では、C1PdfDocumentコントロールを使ってプログラムを作成しましょう。作成するプログラムは、業務連絡という定型文書をPDF文書として作成するアプリケーションです。

GUIのデザイン

 使用するコントロールは、Label、TextBox、GroupBox、Buttonです。文書を記述するコントロールにはRichTextBoxを使用し、記述したテキストの状態をそのままPDF文書にできるようにします。C1PdfDocumentコントロールは、ユーザーインターフェイスを持たず、プロセスだけを提供するため、フォームの外にレイアウトされます。

フォームのレイアウト
フォームのレイアウト

フォームに入力されたデータをPDF化する処理

 フォームに入力された内容を、コードでPDFドキュメントに作成していきます。トリガーのイベントハンドラはButtonコントロールのClickイベントハンドラです。処理は、次の順序で行います。

  1. フォームのLoadイベントハンドラで、TextBox「発行日」に当日の日付を入力
  2. ButtonのClickイベントハンドラで、PDFドキュメントのコンテンツを作成
  3. PDF文書のプロパティを作成
  4. RichTextBoxコントロールの入力内容を一度RTF形式でファイルに保存
  5. その内容を含めPDFファイルを作成
  6. 作成したPDFドキュメントを表示

 PDFドキュメントのコンテンツ作成には、独自のプロシージャ(メソッド)を使用します。

前準備

 まずは、発行日の日付入力と、テキストボックス「発行者」に入力があるとこの内容をテキストボックス「作成者」に入力する処理を作成します。日付はDateTimeクラスを使用し、yyyy年mm月dd日形式でTextBox「発行日」に入力します。テキストボックス「作成者」の入力は、テキストボックス「発行者のTextChangedイベントハンドラ」で行います。

Visual Basic
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
C#
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」を作成し、この中に処理を作成します。コードは、上から順番にレイアウトするように、次の順序で作成していきます。

  1. 発行者の作成
  2. 発行日の作成
  3. 発行番号の作成
  4. 見出しの作成
  5. 題名の作成

 これらは、いずれも使用するフォント、描画領域、描画色を作成/指定してDrawStringメソッドで描画します。描画領域の位置とサイズに注意してください。それぞれ、PDFドキュメントのどの位置にくるのかを計算しながら決めていきます。

 また、「RichTextBox_内容」については、改行やタブの情報も含めてPDFドキュメント化するため、一度RichTextBoxコントロールのSaveFileメソッドで入力内容をRTF形式のファイルに保存し、DrawStringRtfメソッドで描画します。こうすると、テキストを加工することなく簡単にRTFテキストを描画できます。描画した各データは、いずれもストリームに格納されます。

Visual Basic
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
C#
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イベントハンドラで呼び出します。

Visual Basic
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click

    'PDFコンテンツの作成
    pdfcontents()
C#
private void button1_Click(object sender, EventArgs e)
{
    //PDFコンテンツの作成
    pdfcontents();

PDF文書のプロパティ作成

 続いて、PDF文書のプロパティに表示される情報を作成します。これは、既に説明したように、DocumentInfoクラスのプロパティを使って設定します。各プロパティに該当するTextBoxコントロールの入力値を代入するだけです。

Visual Basic
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
C#
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ドキュメントを表示してできあがりです。

Visual Basic
    '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
C#
    //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ドキュメント作成アプリケーションを作ることが可能です。

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

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

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

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/6342 2012/01/24 10:57

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング