
PDFBox 3.x 移除了 PDType1Font.TIMES_ROMAN 等静态字体字段,需改用 new PDType1Font(Standard14Fonts.FontName.TIMES_ROMAN) 实例化标准字体,并补充对应 import。
pdfbox 3.x 移除了 `pdtype1font.times_roman` 等静态字体字段,需改用 `new pdtype1font(standard14fonts.fontname.times_roman)` 实例化标准字体,并补充对应 import。
在使用 Apache PDFBox 3.x(如 3.0.0 及以上版本)向 PDF 写入文本时,若沿用 PDFBox 2.x 的写法(例如直接调用 PDType1Font.TIMES_ROMAN),编译器会报错:
java: cannot find symbol symbol: variable TIMES_ROMAN location: class org.apache.pdfbox.pdmodel.font.PDType1Font
这是因为 PDFBox 3.x 彻底移除了所有标准 Type 1 字体的静态常量(如 TIMES_ROMAN, HELVETICA, COURIER 等),以解决底层 COSDictionary 不可变性引发的线程安全与状态污染问题。
✅ 正确做法是:通过新增的 Standard14Fonts.FontName 枚举配合 PDType1Font 构造函数动态创建字体实例:
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDType1Font;
import org.apache.pdfbox.pdmodel.font.Standard14Fonts; // ✅ 必须添加此 import
public class PdfBoxFontExample {
public static void main(String[] args) throws Exception {
try (PDDocument document = new PDDocument()) {
PDPage page = new PDPage();
document.addPage(page);
try (PDPageContentStream contentStream = new PDPageContentStream(document, page)) {
contentStream.beginText();
// ✅ PDFBox 3.x 正确写法:构造新实例
contentStream.setFont(new PDType1Font(Standard14Fonts.FontName.TIMES_ROMAN), 12);
contentStream.newLineAtOffset(100, 700);
contentStream.showText("Hello from Times Roman!");
contentStream.endText();
}
document.save("testPDFBOX.pdf");
}
}
}
? 关键要点:
- 必须显式
import org.apache.pdfbox.pdmodel.font.Standard14Fonts;; - 使用
new PDType1Font(Standard14Fonts.FontName.XXX)创建字体对象(非单例,每次调用均新建); - 支持全部 14 种 PDF 标准字体,包括:
TIMES_ROMAN,TIMES_BOLD,TIMES_ITALIC,TIMES_BOLD_ITALIC,HELVETICA,HELVETICA_BOLD,HELVETICA_OBLIQUE,HELVETICA_BOLD_OBLIQUE,COURIER,COURIER_BOLD,COURIER_OBLIQUE,COURIER_BOLD_OBLIQUE,SYMBOL,ZAPF_DINGBATS; - 建议在频繁使用同一字体的场景中缓存
PDType1Font实例(如作为类静态字段),避免重复构造开销; - 务必使用
try-with-resources或显式close()释放PDPageContentStream和PDDocument,防止资源泄漏。
? 提示:若需更丰富的字体支持(如中文字体、自定义 TTF),应改用
PDType0Font.load()加载外部字体文件,而非依赖标准 14 字体。但对英文基础排版,Standard14Fonts仍是轻量、可靠且无需嵌入的首选方案。










