C#でPDFを編集出力する際にPDFClownを使う機会があったので備忘録。
PDFClownはJava及び.NetでPDFを編集作成を行う為のライブラリです。
準備
PDFClown公式サイトよりソースをダウンロードし、コンパイルを行いPDFClown.dllを作成。
それを使用するプロジェクトで参照する。
usingで適宜必要なライブラリを呼び出し
using org.pdfclown.documents;
using org.pdfclown.documents.contents;
using org.pdfclown.documents.contents.colorSpaces;
using org.pdfclown.documents.contents.composition;
using entities = org.pdfclown.documents.contents.entities;
using fonts = org.pdfclown.documents.contents.fonts;
using files = org.pdfclown.files;
まずは英語で出力
今回はボタンをクリックするとPDFを出力する簡単な構造にしてみた。
ソースは以下の通り
private void btnOutput_Click(object sender, EventArgs e)
{
try
{
// 新しいファイルを作成(ファイルを読み込む際には引数にファイルパスをセット)
files::File file = new files::File();
Document document = file.Document;
// ドキュメントに新しいページを追加
Page page = new Page(document);
document.Pages.Add(page);
// 編集を行う場合は編集ページを取得
// Pages pages = document.Pages;
// Page page = pages[0];
// コンテンツのコンポーザー(編集変数)を作成する
PrimitiveComposer composer = new PrimitiveComposer(page);
// フォントを設定
composer.SetFont(
new fonts::StandardType1Font(
document,
fonts::StandardType1Font.FamilyEnum.Times,
false,
true
),
12
);
// 編集を行うブロック用変数を用意
BlockComposer blockComposer = new BlockComposer(composer);
// 範囲を指定
blockComposer.Begin(new RectangleF(10, 10, 200, 15), XAlignmentEnum.Center, YAlignmentEnum.Middle);
// 文字出力
blockComposer.ShowText("I can't speak japanese!");
blockComposer.ShowBreak();
blockComposer.End();
// ページに反映
composer.Flush();
// ファイルを保存
file.Save("C:\\test.pdf", files::SerializationModeEnum.Standard);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
出力されたファイル内容はこんな感じ。
Oh,めっちゃ達筆やね!!
じゃあ問題の日本語出力
文字の部分を単純に日本語にして出力してみます。
// 文字出力
//blockComposer.ShowText("I can't speak japanese!");
blockComposer.ShowText("私は英語喋れません!");
blockComposer.ShowBreak();
blockComposer.End();
はい、エラーになりました。
原因はPDFClownで最初にセットしたTimesフォントが日本語出力に対応していないのが原因です。
PDFClownが標準で使用できるフォントは以下の通り
・Courier
・Helvetica
・Times
・Symbol
・ZapfDingbats
日本語フォントを含むCJKフォントはこれでは出力できません。
なのでフォントファイルを読み込んで出力してみましょう。
フォントファイル読み込み
以下でWindowsにインストールされているフォントファイルを読み込んで出力してみましょう。
// フォントを設定
//composer.SetFont(
// new fonts::StandardType1Font(
// document,
// fonts::StandardType1Font.FamilyEnum.Times,
// false,
// true
// ),
// 12
// );
// MSゴシックのフォントファイル(TTC)を読み込んで設定
composer.SetFont(
fonts::Font.Get(
document,
"C:\\Windows\\Fonts\\msgothic.ttc"
),
12
);
// 編集を行うブロック用変数を用意
BlockComposer blockComposer = new BlockComposer(composer);
// 範囲を指定
blockComposer.Begin(new RectangleF(10, 10, 200, 15), XAlignmentEnum.Center, YAlignmentEnum.Middle);
// 文字出力
//blockComposer.ShowText("I can't speak japanese!");
blockComposer.ShowText("私は英語喋れません!");
blockComposer.ShowBreak();
blockComposer.End();
すると以下のようなエラーメッセージが表示される。
実はPDFClownはフォントファイルの「ttf」のファイルは読み込めるが、現在使用している0.1.3のバージョンでは「ttc」ファイルを読み込めない模様。
「ttc」ファイルは「ttf」が何個か圧縮されているファイルと認識していただければ良いと思います。現在のWindows標準の日本語フォントは基本的に「ttc」となるのでそのまま使用することはできません。
何らかの形で「ttf」ファイルに変換するか、日本語フォントの「ttf」ファイルを読み込んでみてください。
それを踏まえて以下のように変更
// フォントを設定
//composer.SetFont(
// new fonts::StandardType1Font(
// document,
// fonts::StandardType1Font.FamilyEnum.Times,
// false,
// true
// ),
// 12
// );
// MSゴシックのフォントファイル(TTC)を読み込んで設定
composer.SetFont(
fonts::Font.Get(
document,
"C:\\msgothic.ttf"
),
12
);
// 編集を行うブロック用変数を用意
BlockComposer blockComposer = new BlockComposer(composer);
// 範囲を指定
blockComposer.Begin(new RectangleF(10, 10, 200, 15), XAlignmentEnum.Center, YAlignmentEnum.Middle);
// 文字出力
//blockComposer.ShowText("I can't speak japanese!");
blockComposer.ShowText("私は英語喋れません!");
blockComposer.ShowBreak();
blockComposer.End();
出力されたファイルを確認すると以下の通り
やったね!出力完了!
ただし、落とし穴が有りました。
出力されたファイルを見てみると明らかにサイズが大きい・・・。
問題はフォントファイルを読み込んだことにあります。
フォントファイルをこのPDFデータを受け取ったユーザーが読み込めるよう、PDFファイルに埋め込みを行うのです。
現在この対応方法はない模様・・・。次のPDFClownの0.2.0バージョンではCJKフォント出力に対応するらしいので、リリースを心待ちにしております。