大多数iText7示例都引用PdfFontFactory.createFont()
来获取文本操作的PdfFont实例的句柄。适度,这很好......但是PdfFont是一个非常重量级的对象(PdfEncoding),在PdfDocument关闭之前似乎没有消失。所以下面无辜的块会吞噬记忆:
for (int i = 0; i < someLargeNumber; i++) {
list.add(
new ListItem("never gonna give")
.setFont(PdfFontFactory.createFont("Helvetica-Oblique"))
)
}
使用静态算法的解决方案的一个微不足道的尝试失败,因为它似乎不能在多个PdfDocument中使用PdfFont实例。而且因为我的实际情况比上面的例子更复杂,所以我不想在一个非常深的堆栈中传递一堆PdfFont引用。
(即,这里可以使用PdfDocument + PdfFontProgram键简单地缓存PdfFont实例?)
答案 0 :(得分:0)
PdfFonts似乎在PdfDocument级别可缓存/可重用。如果使用WeakHashMap作为缓存,则键和值都必须是弱引用。例如
private static WeakHashMap<PdfDocument, Map<String, WeakReference<PdfFont>>> fontCache = new WeakHashMap<>();
public static synchronized PdfFont createFont(PdfDocument forDocument, String path) throws IOException {
Map<String, WeakReference<PdfFont>> documentFontMap = fontCache.get(forDocument);
if (documentFontMap == null) {
documentFontMap = new HashMap<>();
fontCache.put(forDocument, documentFontMap);
}
WeakReference<PdfFont> font = documentFontMap.get(path);
if (font == null) {
font = new WeakReference<>(PdfFontFactory.createFont(path));
documentFontMap.put(path, font);
}
return font.get();
}
还应该关注调用PdfFontFactory本身的iText API,例如配置为显示人类可读值的Barcode1D衍生物(即每页创建一个新的Barcode1D实例w / out调用setFont()将快速耗尽大文档的内存)