PDFBox3.0を用いたPDFへの描画(基本編)
2025 年 8 月 4 日 by nishimoton技術調査でPDFBoxについて調べ、あまりにもver3.0.xについての記事がないため書きました。
目次
- PDFBoxとは
- 基本的な描画方法
- 注意点と実際のソース
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に文字列が描画されます。