Java ライブラリ Apache PDFBox で PDF を操作しよう (第2回:文字の表示)

 本連載では Java で PDF を操作できる Apache PDFBox について解説します。 前回は PDFBox の概要と簡単な操作について解説しました。 今回は文字を PDF に表示する方法について解説します。

文字を埋め込んだ PDF を作成しよう

 最初にお決まりの Hello World から始めましょう。 次のようにプログラムを作成してください。

package sample.pdfbox;

import java.io.IOException;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDFont;
import org.apache.pdfbox.pdmodel.font.PDType1Font;

public class Main {
  public static void main(String args[]) {
    try {
      PDDocument document = new PDDocument();

      PDPage page = new PDPage();
      document.addPage(page);

      PDFont font = PDType1Font.HELVETICA_BOLD;

      PDPageContentStream contentStream = new PDPageContentStream(document, page);
      contentStream.beginText();
      contentStream.setFont(font, 12);
      contentStream.newLineAtOffset(0f, 0f);
      contentStream.showText( "Hello World" );
      contentStream.endText();
      contentStream.close();

      document.save("helloworld.pdf");
      document.close();
    }
    catch (IOException e) {
      e.printStackTrace();
    }
  }
}

 文字を埋め込むには、まず文字で利用するフォントを宣言します。 ここでは、PDFont font = PDType1Font.HELVETICA_BOLD; という宣言で利用するフォント(Helvetica_Bold)を指定しています。 この PDType1Font クラスは、Type1フォントを表しています。 (「Type1フォント」についての説明は本稿の趣旨とは違うので省略しますが、フォントの種類のことです。) PDType1Font クラスには、他にも以下のフォントが指定できるようにクラス変数に実装されています。

  • PDType1Font.COURIER
  • PDType1Font.COURIER_BOLD
  • PDType1Font.COURIER_BOLD_OBLIQUE
  • PDType1Font.COURIER_OBLIQUE
  • PDType1Font.HELVETICA
  • PDType1Font.HELVETICA_BOLD
  • PDType1Font.HELVETICA_BOLD_OBLIQUE
  • PDType1Font.HELVETICA_OBLIQUE
  • PDType1Font.SYMBOL
  • PDType1Font.TIMES_BOLD
  • PDType1Font.TIMES_BOLD_ITALIC
  • PDType1Font.TIMES_ITALIC
  • PDType1Font.TIMES_ROMAN
  • PDType1Font.ZAPF_DINGBATS

 フォントを宣言したら、次の処理からテキストの流し込みを開始しています。 contentStream.beginText(); で流し込みを開始して、contentStream.endText(); で終了しています。
 setFont メソッドでは、上で宣言したフォントを引数に指定し、さらに第二引数でフォントのサイズ(12pt)を指定しています。 また newLineAtOffset メソッドではフォントの表示位置を float 型で指定します。 表示位置は、ページの左下が (0,0) の位置となる点に注意してください。 そして showText メソッドで表示する文字を設定しています。

PDFBox 出力サンプル  このプログラムを実行すると、helloworld.pdf というファイル名の右図のような PDF が出力されます。(クリックで拡大)「Hello World」という文字がページの左下に表示されているのがわかります。

日本語の文字を表示する

 それでは次に日本語の文字を PDF に表示してみましょう。 前回も述べましたが、PDFBox の Version 1 では日本語を PDF に表示することができませんでしたが、Version 2 になってマルチバイトのフォントにも対応しましたので、やっと PDFBox を日本のシステムでも利用できるようになったと言っても良いでしょう。

 日本語のフォントを利用する場合、フォントの宣言部分が異なります。 次のように PDType0Font クラスの load メソッドを呼出すことで、利用するフォントを指定することができます。

PDFont font = PDType0Font.load(document, new File("/Library/Fonts/Osaka.ttf"));

 この例は macOS でのフォントの指定の例ですが、Windows でフォントを指定するには C:/Windows/Fonts/ のフォントファイルを指定してください。あとは PDF に表示する文字として日本語の文字列を指定すればOKです。 プログラムを以下のように変更しました。 ついでに文字の表示位置も変更してみました。

package sample.pdfbox;

import java.io.File;
import java.io.IOException;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDFont;
import org.apache.pdfbox.pdmodel.font.PDType0Font;

public class Main {
  public static void main(String args[]) {
    try {
      PDDocument document = new PDDocument();

      PDPage page = new PDPage();
      document.addPage(page);

      PDFont font = PDType0Font.load(document, new File("/Library/Fonts/Osaka.ttf"));

      PDPageContentStream contentStream = new PDPageContentStream(document, page);
      contentStream.beginText();
      contentStream.setFont(font, 12);
      contentStream.newLineAtOffset(200f, 500f);
      contentStream.showText( "ハローワールド!" );
      contentStream.endText();
      contentStream.close();

      document.save("helloworld.pdf");
      document.close();
    }
    catch (IOException e) {
      e.printStackTrace();
    }
  }
}

PDFBox 出力サンプル  このプログラムを実行すると、helloworld.pdf というファイル名の右図のような PDF が出力されます。(クリックで拡大) 今度は「ハローワールド!」という文字がページの中央あたりに表示されているのがわかります。

おわりに

 今回は PDFBox を利用して文字を PDF に表示する方法について解説しました。 次回は PDF に画像を表示する方法について解説したいと思います。 (現在執筆中)

>> Java ライブラリ Apache PDFBox で PDF を操作しよう (第3回:画像の表示)

Java環境構築へ戻る

著者 : OSCA

OSCA

 初級WEBエンジニアです。最近は Android, iOS, WEBアプリの作成に力を入れています。 個人として何か一つでも世の中の多くの人に使ってもらえるアプリを作ろうと日々奮闘中です。