我们正在转换基于iText 7.1.2
和的邮件消息htmlPDF 2.0.2
。转换是在一个静态方法中完成的,该方法由并行线程为每个基于 html 的消息调用。代码看起来像这样简化(流在 finally 块中关闭):
ConverterProperties properties = new ConverterProperties();
FontProvider fontProvider = new DefaultFontProvider();
for (String font : ITEXT_FONTS) {
FontProgram fontProgram = FontProgramFactory.createFont(font);
fontProvider.addFont(fontProgram);
}
properties.setFontProvider(fontProvider);
fos = new FileOutputStream(targetFile);
HtmlConverter.convertToPdf(is, fos, properties);
for 循环用于从Noto
位于类路径的包中添加中文字体。在我们的环境中,我们现在有时会看到以下错误场景:
Caused by: java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:3236)
at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:118)
at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93)
at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:153)
at com.itextpdf.io.util.StreamUtil.inputStreamToArray(StreamUtil.java:212)
at com.itextpdf.html2pdf.resolver.font.DefaultFontProvider.addShippedFreeFonts(DefaultFontProvider.java:111)
at com.itextpdf.html2pdf.resolver.font.DefaultFontProvider.<init>(DefaultFontProvider.java:97)
at com.itextpdf.html2pdf.resolver.font.DefaultFontProvider.<init>(DefaultFontProvider.java:81)
问题是:
- 是否为每个调用创建 DefaultFontProvider 是合法的,还是应该只有一个实例(例如,因为创建成本)?
- 如果 DefaultFontProvider 仅初始化一次 -> 此实例线程是否保存?
提前致谢!