使用PDFBox Java库时TIMES_ROMAN字体找不到的问题排查
PDFBox中TIMES_ROMAN字体找不到的问题解决
我尝试使用Java的PDFBox库向PDF中写入文本,但设置字体时发现TIMES_ROMAN不可用。我的代码和教程中的写法一致,请问问题出在哪里?
报错信息
java: cannot find symbol symbol: variable TIMES_ROMAN location: class org.apache.pdfbox.pdmodel.font.PDType1Font
相关代码
import org.apache.pdfbox.*; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDDocumentInformation; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageContentStream; import org.apache.pdfbox.pdmodel.font.PDType1Font; import java.io.IOException; public class app { public static void main(String[] args) throws IOException { PDDocument document = new PDDocument(); for(int x=0;x<10;x++){ PDPage myPage = new PDPage(); document.addPage(myPage); } PDPage page = document.getPage(1); PDPageContentStream contentStream = new PDPageContentStream(document,page); contentStream.beginText(); contentStream.setFont(PDType1Font.TIMES_ROMAN, 12); document.save("C:/Users/ASUS/Desktop/testPDFBOX.pdf"); document.close(); } }
问题原因及解决方法
问题出在PDFBox的版本差异上:
- 如果你用的是PDFBox 3.x及以上版本:这个版本重构了PDType1Font的字体常量命名,原
TIMES_ROMAN被更名为TIMES_ROMAN_REGULAR,同时新增了TIMES_ROMAN_BOLD、TIMES_ROMAN_ITALIC等细分常量。只需要把代码里的字体常量替换即可:contentStream.setFont(PDType1Font.TIMES_ROMAN_REGULAR, 12); - 如果你想保留教程里
TIMES_ROMAN的写法:直接降级PDFBox到2.x稳定版本(比如2.0.29),这个版本里PDType1Font.TIMES_ROMAN是原生支持的。
额外提示
你的代码还有个小问题:调用beginText()后没有设置文本的起始位置,就算字体问题解决了,文本也不会显示出来。可以在setFont之后补充以下代码:
contentStream.newLineAtOffset(50, 700); // 设置文本在页面的(50,700)位置 contentStream.showText("测试文本"); // 写入具体内容 contentStream.endText(); // 结束文本绘制 contentStream.close(); // 关闭内容流
否则可能出现PDF无法正常显示或损坏的情况。
内容的提问来源于stack exchange,提问作者Chingu Dev
相关产品推荐
相关产品推荐

