Symfoware

Symfowareについての考察blog

Apache PDFBoxで日本語の出力とフォントの埋め込み

PDFBoxを使ってみたのですが、どうしても日本語フォントを使用しての
PDF出力ができない。
JavaのPDFライブラリ Apache PDFBoxでHello World

もう、諦めていたのですがひょっとして、まだ正式リリースされていない
2.0系を使用すれば表示できるのでは。と思い試してみます。


スナップショットの取得



PDFBoxのダウンロード
https://pdfbox.apache.org/download.cgi

632_01.png

Download a snapshot buildのリンクをたどります。

632_02.png


「fontbox」「pdfbox」それぞれの「2.0.0-SNAPSHOT」のリンクをたどります。

632_03.png


・fontbox-2.0.0-20150803.050027-1654.jar
・pdfbox-2.0.0-20150803.050251-1602.jar
をそれぞれダウンロードし、ビルドパスに含めました。

日々開発が進んでいますので、その日時点の最新が良いかと思います。

632_04.png


Apache Commons Loggingに依存していますので、
http://commons.apache.org/proper/commons-logging/download_logging.cgi
こちらから「commons-logging-1.2-bin.zip」をダウンロード。

commons-logging-1.2.jarもビルドパスに含めておきます。




フォントファイルの準備



テストには特徴のある「たぬきフォント」を使用させていただきました。
http://tanukifont.com/tanuki-permanent-marker/

TanukiMagic.ttfを取得します。




サンプルプログラム



まだ2.0系のドキュメントは用意されていませんので、
https://svn.apache.org/viewvc/pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/pdmodel/

このサンプルを参考に、プログラムを記載します。
フォントファイルを指定して、日本語が出力できるかテスト。

※仕様が変更になり、このコードでは動かなくなる可能性があります。
今のところ、これで動いてくれました。


  1. package com.fc2.blog68.symfoware;
  2. import java.io.File;
  3. import org.apache.pdfbox.pdmodel.PDDocument;
  4. import org.apache.pdfbox.pdmodel.PDPage;
  5. import org.apache.pdfbox.pdmodel.PDPageContentStream;
  6. import org.apache.pdfbox.pdmodel.font.PDFont;
  7. import org.apache.pdfbox.pdmodel.font.PDType0Font;
  8. public class MainProccess {
  9.     public static void main(String... args) throws Exception {
  10.         PDDocument doc = new PDDocument();
  11.         // 新しいページを追加
  12.         PDPage page = new PDPage();
  13.         doc.addPage(page);
  14.         
  15.         // フォントファイルを読み込み
  16.         PDFont font = PDType0Font.load(doc, new File("TanukiMagic.ttf"));
  17.         
  18.         // 出力用のストリームを開く
  19.         PDPageContentStream contents = new PDPageContentStream(doc, page);
  20.         
  21.         // テキスト出力開始
  22.         contents.beginText();
  23.         // 使用するフォントに読み込んだフォントを指定。
  24.         // 第二引数はフォントサイズ
  25.         contents.setFont(font, 46);
  26.         
  27.         // テキストの出力位置を指定。
  28.         // 左下がX:0 Y:0の座標となる
  29.         contents.newLineAtOffset(100, 500);
  30.         contents.showText("日本語出力123");
  31.         // テキスト出力終了
  32.         contents.endText();
  33.         
  34.         // ストリームを閉じる
  35.         contents.close();
  36.         // pdfファイルを出力
  37.         doc.save("sample.pdf");
  38.         doc.close();
  39.     }
  40. }




実行してみると、今までの苦労が嘘みたいに、あっさり出力されました。

632_05.png





改行



おまけで、改行しながらshowTextする方法。
setLeadingで行間を指定。
newLineで開業してくれます。


  1. package com.fc2.blog68.symfoware;
  2. import java.io.File;
  3. import org.apache.pdfbox.pdmodel.PDDocument;
  4. import org.apache.pdfbox.pdmodel.PDPage;
  5. import org.apache.pdfbox.pdmodel.PDPageContentStream;
  6. import org.apache.pdfbox.pdmodel.font.PDFont;
  7. import org.apache.pdfbox.pdmodel.font.PDType0Font;
  8. public class MainProccess {
  9.     public static void main(String... args) throws Exception {
  10.         PDDocument doc = new PDDocument();
  11.         // 新しいページを追加
  12.         PDPage page = new PDPage();
  13.         doc.addPage(page);
  14.         
  15.         // フォントファイルを読み込み
  16.         PDFont font = PDType0Font.load(doc, new File("TanukiMagic.ttf"));
  17.         
  18.         // 出力用のストリームを開く
  19.         PDPageContentStream contents = new PDPageContentStream(doc, page);
  20.         
  21.         // 行間隔を指定
  22.         contents.setLeading(46 * 1.2);
  23.         
  24.         // テキスト出力開始
  25.         contents.beginText();
  26.         // 使用するフォントに読み込んだフォントを指定。
  27.         // 第二引数はフォントサイズ
  28.         contents.setFont(font, 46);
  29.         
  30.         // テキストの出力位置を指定。
  31.         // 左下がX:0 Y:0の座標となる
  32.         contents.newLineAtOffset(100, 500);
  33.         contents.showText("日本語出力123");
  34.         
  35.         // 改行
  36.         contents.newLine();
  37.         contents.showText("二行目を出力!");
  38.         
  39.         
  40.         // テキスト出力終了
  41.         contents.endText();
  42.         
  43.         // ストリームを閉じる
  44.         contents.close();
  45.         // pdfファイルを出力
  46.         doc.save("sample.pdf");
  47.         doc.close();
  48.     }
  49. }




632_06.png


続きます。
PDFライブラリ Apache PDFBoxで線の描画と矩形の塗りつぶし
関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2015/08/03(月) 21:27:09|
  2. Java
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<PDFライブラリ Apache PDFBoxで線の描画と矩形の塗りつぶし | ホーム | elixirからepgsqlを使用して、PostgreSQLに接続する>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1777-fa62dd9a
この記事にトラックバックする(FC2ブログユーザー)