CodeZine(コードジン)

特集ページ一覧

iTextSharpを利用して.NETでPDF帳票を出力する

iTextSharpで見栄えの良い印刷帳票を作成する

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2006/08/07 00:00
目次

(2)日本語フォントの利用

 実は、さきほどのサンプルの「"Hello iTextSharp"」を日本語に変えても正しく表示されません。日本語を正しく表示させるためには、日本語を表示できるフォントを設定する必要があるためです。

フォントを適用するコード

 次の日本語フォントを利用したPDFを生成してみましょう。

  1. MSゴシック(40ポイント)
  2. MS Pゴシック(太字で32ポイント)
  3. MS UI Gothic(斜線で下線の24ポイント)
  4. HeiseiMin-W3(汎用明朝の20ポイント)
  5. HeiseiKakuGo-W5(汎用ゴシックの赤色の20ポイント)

 ここでは、この5つのフォントを定義しています。

日本語フォントの設定(抜粋)
//[1] MSゴシック
Font fnt1 = new Font(BaseFont.CreateFont
    (@"c:\windows\fonts\msgothic.ttc,0", BaseFont.IDENTITY_H,true),40);

//[2] MS Pゴシック-太字
Font fnt2 = new Font(BaseFont.CreateFont
    (@"c:\windows\fonts\msgothic.ttc,1", BaseFont.IDENTITY_H,true),
    32,iTextSharp.text.Font.BOLD);

//[3] MS UI Gothic-斜体-下線
Font fnt3 = new Font(BaseFont.CreateFont
    (@"c:\windows\fonts\msgothic.ttc,2", BaseFont.IDENTITY_H,true),
    20,iTextSharp.text.Font.ITALIC | iTextSharp.text.Font.UNDERLINE);

//[4] CJK明朝
Font fnt4 = new Font(BaseFont.CreateFont
    ("HeiseiMin-W3", "UniJIS-UCS2-HW-H",false),20);

//[5] CJKゴシック-赤色
Font fnt5 = new Font(BaseFont.CreateFont
    ("HeiseiKakuGo-W5", "UniJIS-UCS2-HW-H",false),20);
fnt5.SetColor(255,0,0);

フォントの適用の仕方

 フォントを文書に適用するには、コンテンツを表すParagraphクラスのコンストラクタで、Fontオブジェクトを指定します。

Paragraphクラスのコンストラクタ
//Document.Add(new Paragraph("フォントを適用させたい文字列", Fontオブジェクト));

//文言とフォントを指定してドキュメントに追加
doc.Add(new Paragraph("MSゴシックです",fnt1));
doc.Add(new Paragraph("MS Pゴシックの太字です",fnt2));
doc.Add(new Paragraph("MS UI Gothicの斜体/下線です",fnt3));
doc.Add(new Paragraph("HeiseiMin-W3(明朝)です",fnt4));
doc.Add(new Paragraph("HeiseiKakuGo-W5(ゴシック)の赤色です",fnt5));

作成するPDFファイル

 このプログラムで生成されるPDFは、次のようになります。

日本語を含むPDFファイル
日本語を含むPDFファイル

 フォントが適用されていることが分かります。

PDF文書のフォント情報の確認

 さらにフォントの情報を確認してみましょう。文書のプロパティの[フォント]タブから確認することができます。

PDFファイルのフォント情報
PDFファイルのフォント情報

 このプロパティから、表示に利用されているフォント、埋め込まれているフォント、エンコードといった情報を確認することができます。

フォントの設定の詳細

 フォントを指定するにはiTextSharp.text名前空間のFontクラスを使用します。Fontクラスでは、コンストラクタにて「フォントの種類/サイズ/スタイル」を指定できます。

Fontクラスのコンストラクタの例
//Font(フォントの種類,サイズ)
Font(Font.TIMES_ROMAN,10);

//Font(フォントの種類,サイズ,スタイル)
Font(Font.TIMES_ROMAN,12,Font.BOLD)

 フォントのサイズは、数字(ポイント)で指定します。

 フォントのスタイルには「NORMAL(標準)」「BOLD(太字)」「ITALIC(斜体)」「BOLDITALIC(太字・斜体)」「UNDERLINE(下線)」などが利用できます。複数のスタイルを適用する場合には、「|」によって連続して指定します。

 なお、Fontクラスは、System.Drawing名前空間にも存在するため、混在する場合は「using iFont = iTextSharp.text.Font;」のようにクラスに別名(この場合はiFont)をつけると利用しやすいでしょう。

日本語フォントの使用

 「MSゴシック」などのハードディスクにインストールされた機種依存フォントを使用する場合には「BaseFontクラスのCreateFontメソッド」を呼び出す必要があります。CreateFontメソッドでは「フォントファイルへのパス/エンコーディング設定/フォントをPDF文書に埋め込むか」を設定します。

MSゴシックを使用する場合
Font fnt1 = new Font(BaseFont.CreateFont
    (@"c:\windows\fonts\msgothic.ttc,0", BaseFont.IDENTITY_H,true),40);

 この例では、フォントの種類として「c:\windows\fonts\msgothic.ttc」ファイルの0番目のフォント(=MSゴシック)、エンコーディングとして「IDENTITY_H」、フォントの埋め込みを選択しています。

フォントファイルの指定

 CreateFontメソッドでは、「@"c:\windows\fonts\msgothic.ttc,0"」というようにフォントファイルへのパスを指定しています。この拡張子がTTC(True Type Collection)のファイルはフォントの集合を表しています。そのためゼロ番目のフォントの利用するという意味で「0」という番号も付加しています。

「c:\windows\fonts」フォルダの中
「c:\windows\fonts」フォルダの中

エンコーディングの指定

 エンコーディング(encoding)とは、文字をバイト列で表す方法のことです。PDFで機種依存フォントを利用する場合は、「BaseFont.IDENTITY_H(横書き)」か「BaseFont.IDENTITY_V(縦書き)」を指定する必要があります。

機種依存フォントで設定可能なエンコーディング
エンコーディング説明
IDENTITY_H横書き
IDENTITY_V縦書き

例外の設定

 なお、フォントファイルが存在しない場合などには例外が発生します(ただし、後述するビルトインフォントとCJK汎用フォントの場合、フォントファイルが存在しなくても問題ありません)。iTextSharpでは、DocumentExceptionIOExceptionといった例外が発生するため、次のようなtrycatch文を記述しておくと良いでしょう。

iTextSharpの例外制御
Document doc = new Document();
try
{
    PdfWriter.GetInstance(doc, new FileStream("XXX.pdf", FileMode.Create));
    Font fnt = new Font(BaseFont.CreateFont
    (@"c:\windows\fonts\msgothic.ttc,0", BaseFont.IDENTITY_H,true),40);
    doc.Open();
    doc.Add(new Paragraph("例外処理",fnt));
}
catch(DocumentException ex)
{
    MessageBox.Show(ex.Message,"DocumentException");
}
catch(IOException ex)
{
    MessageBox.Show(ex.Message,"IOException");
}
finally
{
    doc.Close();
}

ビルトインフォントとCJK汎用フォント

 PDFには、閲覧するPCにフォントが存在しなくてもドキュメントを表示/印刷できるように、フォント情報を埋め込む機能が備わっています。これは便利な機能である反面、ファイルのサイズが肥大化してしまう可能性があります。

ビルトインフォント(欧文基本14フォント)

 そこで、PDFの仕様として、次の欧文のフォントについては、フォントを埋め込まなくてもそのまま使用できるように規定されています。このフォントを「ビルトインフォント」と呼びます。

ビルトインフォント(欧文基本14フォント)
Noフォント説明
1COURIER古いタイプライターのようなフォント(等幅)
2COURIER(BOLD)太字のCOURIER
3COURIER(OBLIQUE)斜体のCOURIER
4COURIER(BOLD/OBLIQUE)太字・斜体のCOURIER
5HELVETICAグラフィックデザインでよく利用されるフォント
6HELVETICA(BOLD)太字のHELVETICA
7HELVETICA(OBLIQUE)斜体のHELVETICA
8HELVETICA(BOLD/OBLIQUE)太字・斜体のHELVETICA
9TIMES_ROMAN英字新聞の見出しのようなフォント
10TIMES_ROMAN(BOLD)太字のTIMES_ROMAN
11TIMES_ROMAN(ITALIC)斜体のTIMES_ROMAN
12TIMES_ROMAN(BOLD/ITALIC)太字・斜体のTIMES_ROMAN
13SYMBOL数式記号用のフォント
14ZAPFDINGBATS数式以外の記号用フォント
書体のサンプル
書体のサンプル

 これらのフォントを利用するように指定した場合は、Adobe Readerが類似したフォントを自動的に選択して表示してくれます。

CJK言語パックの日本語フォント

 日本語の場合も、ビルトインフォントと同様に「CJK(Chinese/Japanese/Korean)言語フォントパック」に含まれる「HeiseiMin-W3」「HeiseiKakuGo-W5」「KozMinPro-Regular」といった汎用の日本語フォントを利用することができます。

CJKフォント(日本語のみ)
フォント名説明
HeiseiMin-W3明朝体
HeiseiKakuGo-W5ゴシック
KozMinPro-Regular明朝体

 これらのフォントを利用すれば、MSゴシックなどのフォント情報をPDFファイルに埋め込む必要がなくなり、サイズの肥大化を防ぐことができます

 また、CJKフォントの場合には、次のエンコーディングを指定します。

CJKフォントで設定可能な日本語Unicodeエンコーディング
エンコーディング説明
UniJIS-UCS2-H横書き
UniJIS-UCS2-V縦書き
UniJIS-UCS2-HW-H横書き(プロポーショナル欧文文字が半角)
UniJIS-UCS2-HW-V縦書き(プロポーショナル欧文文字が半角)

「iTextAsian-1.0.dll」のロード

 注意点として、これらのCJKフォントは「iTextAsian-1.0.dll」という別のDLLに含まれていますので、DocumentオブジェクトをOpenする前に、次のコードを呼び出してロードするようにしてください。サンプルプログラムでは、Form_Loadイベントで呼び出しています。

iTextAsianのロード
BaseFont.AddToResourceSearch("iTextAsian-1.0.dll");

 Visual Studioで開発している場合は、「iTextAsian-1.0.dll」に参照設定をしておけば良いでしょう(ビルドすると自動的に実行ファイルと同じフォルダにコピーされます)。

注意
 あらかじめ「iTextAsian-1.0.dll」のロードをしていない場合、「Font 'HeiseiMin-W3' with 'UniJIS-UCS2-HW-H' is not recognized.」というようなエラーが出力されます。
参考
 フォントの種類にこだわらない場合は、CJKの汎用フォントを利用することが一般的です。しかし筆者が確認した限り、これらのフォントを利用すると文字の先頭に若干の空白が表示されていました。そのため、この後のサンプルではCJKフォントはあまり使用してしていません。

 フォントの詳細については、さまざまなフォントについての概要や、WikiPediaなどのページをご覧頂くとよいかと思います。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • WINGSプロジェクト 青木 淳夫(アオキ アツオ)

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きた...

  • 山田 祥寛(ヤマダ ヨシヒロ)

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XM...

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5