Apache PDFBoxが日本語出力できるようになった件


Apache PDFBoxはjavaでPDFをごにょごにょできるライブラリです。
https://pdfbox.apache.org/

2016年3月に2.0系がリリースされ日本語が出力できるようになってました。

以前からSNAPSHOT版が出ており、試している人がいたので下記参考に試してみた結果を書きます。
http://symfoware.blog68.fc2.com/blog-entry-1777.html

試したソースコード

pom.xmlに下記を追記。

        <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>pdfbox</artifactId>
            <version>2.0.1</version>
        </dependency>

下記が実行してみたソースコード

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

//・・・

    public static void main(String[] args) throws IOException {
        //Windowsで、C:/Windows/Fonts/ARIALUNI.TTFにフォントがないと動きません。
        Path path = Paths.get("pdf.pdf");
        try (OutputStream out = Files.newOutputStream(path)) {
            make(out);
        }

        System.out.println(path.toAbsolutePath());
    }

    public static void make(OutputStream out) throws IOException {

        try (PDDocument doc = new PDDocument()) {
            float fontSize = 50;
            PDRectangle rectangle = PDRectangle.A6;
            PDPage page = new PDPage(rectangle);
            doc.addPage(page);

            // フォントファイルを読み込み(2.0系から追加されたメソッド)
            PDFont font = PDType0Font.load(doc, new File("C:/Windows/Fonts/ARIALUNI.TTF"));

            try (PDPageContentStream contents = new PDPageContentStream(doc, page)) {
                contents.beginText();

                contents.setFont(font, fontSize);

                contents.newLineAtOffset(10, rectangle.getHeight() - fontSize - 10);
                contents.showText("こんにちは");
                contents.newLineAtOffset(0, -fontSize);
                contents.showText("世界");

                contents.endText();
            }
            doc.save(out);
        }
    }

結果

こんな感じ。

あとがき

僕はApache大好きなので、もうiTextの時代は終わったと勝手に思っています。