我正试着在一个循环中创建很多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),它会创建fontPDType0Font.load...00次的短暂大对象吗?如果是这样的话,有没有办法让字体像PDType1Font一样嵌入,这样我就可以只加载一次,并在循环中多次使用它? 我在这里遇到了一个完整的GC问题,我正在努力解决它.

推荐答案

在字体框级别创建字体:

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

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

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

当处理完所有文档时,不要忘了关闭ttf.

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

Java相关问答推荐

如果给定层次 struct 级别,如何从其预序穿越构造n元树

找到允许的最大底片

如何在Android上获取来电信息

无法在org. openjfx:javafx—fxml:21的下列变体之间进行 Select

将带有js文件的 bootstrap 程序导入maven项目时出错

有没有办法让扩展变得多态?

生成桥方法以解决具有相同擦除的冲突方法

使用Room Database删除Jetpack合成中的所有项目后,UI未重新合成

SonarLint:只能有条件地调用方法(S)

我怎样才能让IntelliJ标记toString()的任何实现?

项目react 堆中doOnComplete()和Subscribe()的第三个参数之间的差异

如何在IntelliJ IDEA的Build.sbt中添加外部JAR文件?

使IntelliJ在导入时优先 Select 一个类或将另一个标记为错误

在打开搜索结果时,如何让Eclipse打开整个文件?

本机方法(JNI)总是编译的吗?

ControlsFX RangeSlider在方向垂直时滞后

这是JavaFX SceneBuilder的错误吗?

如何在 WebSphere Application Server 内的托管线程上运行 BatchEE 作业(job)?

更新不可变的深层嵌套字段

ChromeDriver 版本 117+ 强制另存为对话框 - 如何绕过? (selenium/Java)