iText7策略用于限制PdfFont的内存消耗

时间:2016-07-26 18:45:37

标签: itext itext7

大多数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引用。

    在iText7 API中,没有办法迭代PdfDocument的现有PdfFont(是吗?)
  1. 是PdfFont使用的规则,只是a)它可以在你想要的时候多次使用b)在一个PdfDocument实例中
  2. (即,这里可以使用PdfDocument + PdfFontProgram键简单地缓存PdfFont实例?)

1 个答案:

答案 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()将快速耗尽大文档的内存)