前回、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つの出力方法をご紹介させていただきました。