
在 Apache PDFBox 中,PDType1Font.COURIER 等静态字段已被弃用(自 PDFBox 3.0+ 起移除),直接引用会导致编译失败或运行时异常;应改用 PDType1Font(Standard14Fonts.FontName) 构造方式显式创建字体实例。
在 apache pdfbox 中,`pdtype1font.courier` 等静态字段已被弃用(自 pdfbox 3.0+ 起移除),直接引用会导致编译失败或运行时异常;应改用 `pdtype1font(standard14fonts.fontname)` 构造方式显式创建字体实例。
Apache PDFBox 自 3.x 版本起对 Type1 字体 API 进行了重大重构:原先提供的 PDType1Font.COURIER、PDType1Font.HELVETICA 等静态常量已被完全移除。若代码仍沿用旧写法(如 contentStream.setFont(PDType1Font.COURIER, 15)),将触发编译错误(Cannot resolve symbol 'COURIER')或 NoSuchFieldError 运行时异常。
✅ 正确做法是通过 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;
// ... 在生成内容流后
try (PDPageContentStream contentStream = new PDPageContentStream(doc, page)) {
// ✅ 正确:使用 Standard14Fonts.FontName 枚举构造 PDType1Font 实例
contentStream.setFont(new PDType1Font(Standard14Fonts.FontName.COURIER), 15);
contentStream.beginText();
contentStream.newLineAtOffset(100, 700);
contentStream.showText("Hello, Courier!");
contentStream.endText();
}
⚠️ 注意事项:
- 确保使用 PDFBox 3.0.0 或更高版本(推荐 3.0.3+),低版本中 Standard14Fonts 可能未引入;
- Standard14Fonts.FontName 支持全部 14 种标准 PostScript 字体:COURIER、HELVETICA、TIMES_ROMAN、SYMBOL、ZAPF_DINGBATS 等;
- 不要尝试加载本地 .pfb 或 .afm 文件来“修复”缺失字体——标准 Type1 字体已内置于 PDFBox,无需额外资源;
- 若需非标准字体(如中文),应改用 PDType0Font.load() 加载 TrueType 或 OpenType 字体。
? 总结:PDFBox 的字体 API 已转向更安全、可扩展的设计模式。放弃过时的静态字段引用,转而使用类型安全的枚举 + 构造器方式,不仅能避免兼容性问题,也为后续支持更多字体格式打下基础。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











