PDFドキュメント作成処理
独自のプロシージャ(メソッド)「print_out」を作成し、この中に処理を組み立てていきます。
処理のメインはPDFドキュメントの作成で、フォームに入力された顔写真、社員情報とラベルで表示している会社情報、社名とロゴの画像、QRコード画像をレイアウトしていきます。
レイアウトをデザインするにあたってはRectangleF構造体を使用し、描画位置を確保しています。
- (1) 最初に、作成するPDFドキュメントのファイル名と保存するフォルダを作成します。PDFドキュメントは、プログラム実行フォルダと同じフォルダに保存することにします。
- (2) C1PdfDocumentコントロールを初期状態に戻します。これは、続けていくつものPDFドキュメントを作成する際に、一つ作成するごとにそれまで作成したドキュメントを削除する必要があるためです。
- (3) C1PdfDocumentクラスのImageQualityプロパティで、PDFドキュメントの画質を設定します。プロパティの設定値は「ImageQualityEnum列挙体」のメンバで、以下の値を使用することができます。ここでは、「High」を指定し最高画質に設定しています。圧縮率は低いのでファイルサイズは大きくなりますが、グラフィックスの画質は高くなります。
メンバ名 | 説明 |
Low | 低品質、高圧縮率。 |
Medium | 中品質、中圧縮率。 |
Default | 高品質、低~中圧縮率。 |
High | 最高品質、低圧縮率。 |
- (4) 「社名」「顔写真」「ロゴ」の3つの画像をPDFドキュメントにレイアウトします。画像の描画は、DrawImageメソッドを使用します。PictureBoxコントロールにすでに画像が設定されていますので、これを取り出して描画します。それぞれどこに描画するのかは、RectangleF構造体で指定します。
- (5) DrawStringメソッドを使用して、社員情報を描画します。フォントは「MS P明朝」でサイズは「10」にします。
- (6) QRコードの画像を挿入します。画像の描画なのでDrawImageメソッドを使用し、ファイルから作成するのでImageクラスのFromFileメソッドを使用します。
- (7) フォームのLabelコントロールで表示している会社情報を挿入します。テキストなのでDrawStringメソッドで描画します。フォントは社員情報と同じですが、サイズを1つ小さくします。
- (8) 最後に、DrawRectangleメソッドを使用してドキュメント全体を枠線で囲みます。
- (9) 作成したPDFドキュメントを保存します。保存場所とファイル名はすでにメンバ変数「fname」で作成しているのでこれを使用します。ファイルの保存はC1PdfDocumentコントロールのSaveメソッドを使用しますが、ここでは同じファイル名で保存するようにしています。そのため、それまでに作成したPDFドキュメントが表示されていると、ファイル保存がエラーになってしまいます。そこで、Tryステートメントでエラーをキャッチし、開いているPDFドキュメントを閉じてもらってから、改めてファイル保存処理を行ってもらうようにします。
- (10) ファイルに保存したら、ProcessクラスのStartメソッドでPDFドキュメントを表示して完成です。
Sub print_out() '準備 Dim fname As String = Application.StartupPath + "/meisi.pdf" '(1) C1PdfDocument1.Clear() '(2) C1PdfDocument1.ImageQuality = C1.C1Pdf.ImageQualityEnum.High '(3) '画像の配置 Dim rect As New RectangleF(10, 5, 130, 22) '(4) C1PdfDocument1.DrawImage(PictureBox1.Image, rect) '社名 rect = New RectangleF(10, 35, 70, 70) C1PdfDocument1.DrawImage(PictureBox2.Image, rect) '顔写真 rect = New RectangleF(190, 5, 60, 40) C1PdfDocument1.DrawImage(PictureBox3.Image, rect) 'ロゴ '社員情報の配置 (5) Dim fnt As New Font("MS P明朝", 10) rect = New RectangleF(90, 35, 80, 10) C1PdfDocument1.DrawString(TextBox1.Text, fnt, Brushes.Black, rect) '氏名 rect = New RectangleF(90, 50, 150, 10) C1PdfDocument1.DrawString(TextBox2.Text, fnt, Brushes.Black, rect) '所属 rect = New RectangleF(90, 65, 150, 10) C1PdfDocument1.DrawString(TextBox3.Text, fnt, Brushes.Black, rect) '役職 rect = New RectangleF(90, 80, 150, 10) C1PdfDocument1.DrawString(TextBox4.Text, fnt, Brushes.Black, rect) 'メールアドレス 'QRコードの挿入 (6) rect = New RectangleF(10, 110, 50, 50) C1PdfDocument1.DrawImage(Image.FromFile(qr_fname), rect) '顔写真 '会社情報の挿入 (7) fnt = New Font("MS P明朝", 9) rect = New RectangleF(90, 115, 150, 10) C1PdfDocument1.DrawString("株式会社 SEGCファイナンス", _ fnt, Brushes.Black, rect) rect = New RectangleF(90, 125, 150, 10) C1PdfDocument1.DrawString("〒111-000", fnt, Brushes.Black, rect) rect = New RectangleF(90, 135, 250, 10) C1PdfDocument1.DrawString("東京都渋谷区翔泳1-0-0 暮府シティ2014", _ fnt, Brushes.Black, rect) rect = New RectangleF(90, 145, 150, 10) C1PdfDocument1.DrawString("℡ 03-111-9999", fnt, Brushes.Black, rect) '枠線の描画 (8) rect = New RectangleF(0, 0, 280, 165) C1PdfDocument1.DrawRectangle(Pens.LightSkyBlue, rect) 'ファイルに保存しプレビュー (9) Try C1PdfDocument1.Save(fname) System.Diagnostics.Process.Start(fname) '(10) Catch ex As Exception MessageBox.Show("開いているPDFを閉じてから保存してください", _ "ファイル保存エラー") End Try End Sub
private void print_out() { //準備 string fname = Application.StartupPath + "/meisi.pdf"; //(1) c1PdfDocument1.Clear(); //(2) c1PdfDocument1.ImageQuality = C1.C1Pdf.ImageQualityEnum.High; //(3) //画像の配置 (4) RectangleF rect = new RectangleF(10, 5, 130, 22); c1PdfDocument1.DrawImage(pictureBox1.Image, rect); //社名 rect = new RectangleF(10, 35, 70, 70); c1PdfDocument1.DrawImage(pictureBox2.Image, rect); //顔写真 rect = new RectangleF(190, 5, 60, 40); c1PdfDocument1.DrawImage(pictureBox3.Image, rect); //ロゴ //社員情報の配置 (5) Font fnt = new Font("MS P明朝", 10); rect = new RectangleF(90, 35, 80, 10); c1PdfDocument1.DrawString(textBox1.Text, fnt, Brushes.Black, rect); //氏名 rect = new RectangleF(90, 50, 150, 10); c1PdfDocument1.DrawString(textBox2.Text, fnt, Brushes.Black, rect); //所属 rect = new RectangleF(90, 65, 150, 10); c1PdfDocument1.DrawString(textBox3.Text, fnt, Brushes.Black, rect); //役職 rect = new RectangleF(90, 80, 150, 10); c1PdfDocument1.DrawString(textBox4.Text, fnt, Brushes.Black, rect); //メールアドレス //QRコードの挿入 (6) rect = new RectangleF(10, 110, 50, 50); c1PdfDocument1.DrawImage(Image.FromFile(qr_fname), rect); //顔写真 //会社情報の挿入 (7) fnt = new Font("MS P明朝", 9); rect = new RectangleF(90, 115, 150, 10); c1PdfDocument1.DrawString("株式会社 SEGCファイナンス", fnt, Brushes.Black, rect); rect = new RectangleF(90, 125, 150, 10); c1PdfDocument1.DrawString("〒111-000", fnt, Brushes.Black, rect); rect = new RectangleF(90, 135, 250, 10); c1PdfDocument1.DrawString("東京都渋谷区翔泳1-0-0 暮府シティ2014", fnt, Brushes.Black, rect); rect = new RectangleF(90, 145, 150, 10); c1PdfDocument1.DrawString("℡ 03-111-9999", fnt, Brushes.Black, rect); //枠線の描画 (8) rect = new RectangleF(0, 0, 280, 165); c1PdfDocument1.DrawRectangle(Pens.LightSkyBlue, rect); //ファイルに保存しプレビュー (9) try { c1PdfDocument1.Save(fname); pdfProcess = Process.Start(fname); //(10) } catch { MessageBox.Show("開いているPDFを閉じてから保存してください", "ファイル保存エラー"); } }
まとめ
携帯端末の普及に伴って、QRコードの利用範囲はどんどん広がっています。宣伝媒体だけでなく会社の書類や資料に組み込んで、QRコードを読み取るアプリケーションと組み合わせて、書類のフォルダを自動的に振り分ける使い方なども行われているようです。
一方、PDFドキュメントも読み取り専用メディアなので、元の書類が改ざんされることなく配布できるため、ペーパーメディアの主流に近いフォーマットとなっています。
GcBarCode、C1PdfDocumentの両コントロールはこれらのニーズに応えたコントロールで、組み合わせることで幅広い範囲のアプリケーションで利用できます。
参考文献
- MSDN .NET Frameworkクラスライブラリリファレンス 「System.Drawing名前空間」
- ComponentZine 『バーコード作成.NETアプリケーションを作る』
- ComponentZine 『書式を持った文書をPDF化する.NET アプリケーションの作成』