pdfbox:如何加载一次字体并多次使用



我正试图在一个循环中创建许多pdf文件。

for(int i=0; i<10000; ++i){
PDDocument doc = PDDocument.load(inputstream);
PDPage page = doc.getPage(0);
PDPageContentStream content = new PDPageContentStream(doc, page, PDPageContentStream.AppendMode.APPEND, true, true);
content.beginText();
//what happens here?
PDFont font = PDType0Font.load(doc, Thread.currentThread().getContextClassLoader().getResourceAsStream("font/simsun.ttf") );
content.setFont(font, 10);
//...
doc.save(outstream);
doc.close();
}

调用PDType0Font.load...会发生什么?因为ttf文件很大(10M(,它会创建10000次font的短暂大对象吗?如果是这样的话,有没有办法让字体像PDType1Font一样嵌入,这样我就可以只加载一次,然后在循环中多次使用它?我在这里遇到了一个完整的GC问题,我正在努力解决它。

在字体框级别创建字体:

TrueTypeFont ttf = new TTFParser().parse(...);

您现在可以在不同的PDDocument对象中重用ttf,如下所示:

PDFont font = PDType0Font.load(doc, ttf, true);

处理完所有文档后,不要忘记关闭ttf

另请参阅源代码中的PDFontTest.testPDFBox3826()

最新更新