PDF 作為企業文件交換標準,Java 生態早期缺乏成熟操作庫。PDFBox (BSD 授權) 為純 Java 實作,提供文本提取、加密解密、表單填寫、Lucene 整合等功能,填補此空白。
org.pdfbox.cos):直接對應 PDF 內部物件(陣列、布林、字典、數字、字串、串流),操作底層結構,需深入理解 PDF 規範。org.pdfbox.pdfmodel):封裝 COS 模型,提供 PDPage、PDFont 等高階 API,開發效率高。必要時可透過 getCOSObject() 回到底層操作。PDDocument document = PDDocument.load(new File("test.pdf"));
try {
// 操作文件
} finally {
document.close(); // 必須釋放資源(含臨時檔)
// 一行程式碼建立 Lucene Document
Document luceneDoc = LucenePDFDocument.getDocument(new File("test.pdf"));
// 進階控制:繼承 PDFTextStripper 覆寫 showCharacter() 可依座標篩選文本
PDFBox 自動處理字體編碼、壓縮串流、文字排序等複雜問題,提取結果與閱讀器一致。
PDDocument pdf = PDDocument.load("test.pdf");
PDStandardEncryption enc = new PDStandardEncryption();
enc.setCanPrint(false); // 禁止列印
pdf.setEncryptionDictionary(enc);
pdf.encrypt("masterPwd", null); // 設定擁有者密碼,使用者密碼為 null
pdf.save("test-encrypted.pdf");
PDDocument pdf = PDDocument.load("i-9.pdf");
PDAcroForm form = pdf.getDocumentCatalog().getAcroForm();
form.getField("NAME1").setValue("Smith");
pdf.save("i-9-filled.pdf");
// 導出 FDF/XFDF
FDFDocument fdf = form.exportFDF();
fdf.save("data.fdf");
流程:建立 Acrobat 表單模板 → 記錄欄位名 → 程式填充 → 輸出 PDF。
PDFBox 內建多款工具(PrintFields、SetField、PDFToText 等),無需撰寫程式即可完成常見任務。