PDFBox3.0を用いたPDFへの描画(基本編)

2025 年 8 月 4 日 by nishimoton

技術調査でPDFBoxについて調べ、あまりにもver3.0.xについての記事がないため書きました。

目次

  1. PDFBoxとは
  2. 基本的な描画方法
  3. 注意点と実際のソース

1. PDFBoxとは

PDFドキュメントを操作するためのオープンソースのJavaツールです。
新しいPDFドキュメントの作成、既存のPDFの操作、PDFからのコンテンツの抽出、PDFへの描画などができます。
以下からダウンロードできます。
https://pdfbox.apache.org/downloads.html
2025年4月現在、3.0.xと2.0.xのふたつのバージョンがサポートされています。
2.0と3.0では使えるクラスなどが違い、3.0を利用する場合に2.0の記事が参考にならないことも多いです。

2. 基本的な描画方法

PDFを新規作成して描画することもできますが、この記事では既存のPDFの指定の座標に指定の文字列を描画します。
今回用に用意したPDFは以下です。

こちらに文章を描画しようと思います。
PDFのどこかに指定した文章が描画されていたら成功とします。

以下の流れで、既存のPDFに文字列を描画することができます。

// 描画するPDFの指定
File templateFile = new File("files\\SamplePDF.pdf");

try (PDDocument pdfDocument = Loader.loadPDF(templateFile)) {
    // ドキュメントカタログの取得
    PDDocumentCatalog docCatalog = pdfDocument.getDocumentCatalog();
    // 1ページ目の取得
    PDPage page = docCatalog.getPages().get(0);

    // フォントの指定
    File fontFile = new File("files\\IPAPGothic-02.ttf");
    PDFont font = PDType0Font.load(pdfDocument, fontFile);

    // PDPageContentStreamを作成してテキストを追加する
    PDPageContentStream contentStream = new PDPageContentStream(pdfDocument, page, PDPageContentStream.AppendMode.APPEND, true, true);

    contentStream.beginText();
    contentStream.setFont(font, /*フォントサイズ*/);
    contentStream.newLineAtOffset(/*x座標*/, /*y座標*/);
    contentStream.showText(/*描画するテキスト*/);
    contentStream.endText();

    contentStream.close();

3. 注意点と実際のソース

PDFBoxでは、座標の指定は左下が0, 0となります。また、単位はptで、1ptは1/72インチ(およそ0.3528mm)だそうです。
そして、PDFBox3.0.xではデフォルトのフォントが使えなくなり、自分でフォントを用意しなければなりません。
今回はIPA(情報処理推進機構)が開発したIPA Pゴシックを使用しました。
以下は、指定のPDFに「あア亜」と描画するプログラムの全文です。
(なるべく短くなるようにしており、トランザクションや複数人からのアクセスは考慮していません)

import java.io.File;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

import org.apache.pdfbox.Loader;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDDocumentCatalog;
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 SampleClass {

    public static void main(String[] args) {

        // 描画するPDFの指定
        File templateFile = new File("files\\SamplePDF.pdf");

        try (PDDocument pdfDocument = Loader.loadPDF(templateFile)) {
            // ドキュメントカタログの取得
            PDDocumentCatalog docCatalog = pdfDocument.getDocumentCatalog();
            // 1ページ目の取得
            PDPage page = docCatalog.getPages().get(0);
            // フォントの指定
            File fontFile = new File("files\\IPAPGothic-02.ttf");
            PDFont font = PDType0Font.load(pdfDocument, fontFile);

            // PDPageContentStreamを作成してテキストを追加する
            PDPageContentStream contentStream = new PDPageContentStream(pdfDocument, page,
                    PDPageContentStream.AppendMode.APPEND, true, true);

            float x = 50;
            float y = 800;
            float fontSize = 20;
            String text = "あア亜";

            contentStream.beginText();
            contentStream.setFont(font, fontSize);
            contentStream.newLineAtOffset(x, y);
            contentStream.showText(text);
            contentStream.endText();

            contentStream.close();

            // 現在の日付と時刻の取得
            LocalDateTime now = LocalDateTime.now();
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd_HHmmss");
            String formattedDateTime = now.format(formatter);
            // 保存用のファイル名の設定
            String pdfName = "files\\output_" + formattedDateTime + ".pdf";

            // PDFファイルの保存
            pdfDocument.save(pdfName);

        } catch (IOException e) {
            System.out.println("Failed to load PDF document: " + e.getMessage());
            e.printStackTrace();
        } catch (Exception e) {
            System.out.println("Else Exception");
            e.printStackTrace();
        }
    }
}

これを実行すると、以下のようにPDFに文字列が描画されます。

タグ: , ,

TrackBack