iTextSharpで日本語フォント出力

前回、PDFClownでの日本語フォント出力を行ったが今回はiTextSharpでの日本語フォント出力を行ってみようと思う。

iTextSharpはPDFClownと同じくJava及び.NetでPDFを編集作成を行う為のライブラリです。
そもそもはJava用のライブラリとして作成され、.Net版に移行されたようです。

準備

NuGetから簡単に入手できます。(今回はVisualStudio2012で作成します)

[ツール]→[ライブラリ パッケージマネージャー]→[ソリューションのNuGetパッケージの管理]でNuGetパッケージの管理画面を開きます。

検索条件に「iTestSharp」と入れると簡単にiTextSharpが出てきますのでインストールしてください。

適宜必要なライブラリを追加してください。

using iTextSharp.text;
using iTextSharp.text.pdf;
using iFont = iTextSharp.text.Font;

iTextSharpでの日本語出力で以下の2つのパターンを紹介してみます。
・SetSimpleColumnでの出力
・テーブルを作成し、セルにTextを主力

SetSimpleColumnでの出力

SetSimpleColumnで出力する場合のイメージは、指定した座標に簡易のTextBoxを設け、そこにTextを出力していく様な感じになります。

今回も単純な構造にしてみました。

前回より太くなっているのは気分です。以下がソースです。

        private void btnOutput_Click(object sender, EventArgs e)
        {
            try
            {
                //Fontフォルダを指定
                FontFactory.RegisterDirectory(Environment.SystemDirectory.Replace("system32", "fonts"));
                // A4サイズで作成
                Document pdfDoc = new Document(PageSize.A4);
                // 保存ファイルを指定
                FileStream fileStream = new FileStream("C:\\test.pdf", FileMode.Create);
                PdfWriter pdfWriter = PdfWriter.GetInstance(pdfDoc, fileStream);
                // PDFオープン
                pdfDoc.Open();
                PdfContentByte pdfContentByte = pdfWriter.DirectContent;
                //フォントの設定
                iFont font =
                    FontFactory.GetFont("MS ゴシック",
                    BaseFont.IDENTITY_H,    //横書き
                    BaseFont.NOT_EMBEDDED,  //フォントをPDFファイルに組み込まない(重要)
                    11f,                    //フォントサイズ
                    iFont.NORMAL,           //フォントスタイル
                    BaseColor.BLACK);       //フォントカラー


                ColumnText columnText = new ColumnText(pdfContentByte);
                //SetSimpleColumnで出力
                columnText.SetSimpleColumn(
                    new Phrase("私は日本語しゃべれます", font)
                    , 100   // 始点X座標
                    , 600   // 始点Y座標
                    , 250   // 終点X座標
                    , 620   // 終点Y座標
                    , 11f
                    , Element.ALIGN_LEFT // 左寄せ
                    );

                //テキスト描画
                columnText.Go();

                //PDFドキュメントを閉じる
                pdfDoc.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

出力されたファイルはこんな感じ

出力されたファイルのとソースの座標を見ていただくとわかるが、iTextSharpの座標は左上が始点ではなく、左下が始点となる。
なのでY座標の指定には多少注意が必要です。

そしてファイルサイズ

フォントファイルも埋め込まれていないので肥大化してません。

テーブルを作成し、セルにTextを主力

次はテーブルを作成して、そのセルへのText出力をしてみましょう。
ついでに縦書き出力してみます。
ソースは以下の通り

private void btnOutput_Click(object sender, EventArgs e)
        {
            try
            {
                //Fontフォルダを指定
                FontFactory.RegisterDirectory(Environment.SystemDirectory.Replace("system32", "fonts"));
                // A4サイズで作成
                Document pdfDoc = new Document(PageSize.A4);
                // 保存ファイルを指定
                FileStream fileStream = new FileStream("C:\\test.pdf", FileMode.Create);
                PdfWriter pdfWriter = PdfWriter.GetInstance(pdfDoc, fileStream);
                // PDFオープン
                pdfDoc.Open();
                PdfContentByte pdfContentByte = pdfWriter.DirectContent;
                //フォントの設定
                iFont font =
                    FontFactory.GetFont("MS ゴシック",
                    BaseFont.IDENTITY_H,    //横書き
                    BaseFont.NOT_EMBEDDED,  //フォントをPDFファイルに組み込まない(重要)
                    11f,                    //フォントサイズ
                    iFont.NORMAL,           //フォントスタイル
                    BaseColor.BLACK);       //フォントカラー

                // 2列のテーブルを用意
                PdfPTable table = new PdfPTable(new float[] { 0.5f, 0.5f });
                table.DefaultCell.Padding = 0;
                // テーブルの横幅
                table.TotalWidth = 40f;

                // 日本語出力1
                PdfPCell cell1 = new PdfPCell(new Phrase("日本語", font));
                cell1.HorizontalAlignment = Element.ALIGN_CENTER;   // 横中央寄せ
                cell1.VerticalAlignment = Element.ALIGN_MIDDLE;     // 縦中央寄せ
                cell1.FixedHeight = 100f;                           // 縦幅長さ固定
                cell1.Border = iTextSharp.text.Rectangle.NO_BORDER; // 罫線なし
                table.AddCell(cell1);
                // 日本語出力2
                PdfPCell cell2 = new PdfPCell(new Phrase("にほんご", font));
                cell2.HorizontalAlignment = Element.ALIGN_CENTER;   // 横中央寄せ
                cell2.VerticalAlignment = Element.ALIGN_MIDDLE;     // 縦中央寄せ
                cell2.FixedHeight = 100f;                           // 縦幅長さ固定
                cell2.BackgroundColor = BaseColor.RED;              // 背景色
                table.AddCell(cell2);
                // テーブル位置設定
                table.WriteSelectedRows(0, -1, 100, 800, pdfContentByte);
                //PDFドキュメントを閉じる
                pdfDoc.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

これで出力されたファイルは以下の通り

はい、2列のテーブルに2つの日本語テキストが出力されています。

もちろんファイルは肥大化してません。

今回はiTextSharpでの2つの出力方法をご紹介させていただきました。