2

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);

Notofor ループは、クラスパスにあるパッケージから中国語フォントを追加するために使用されます。私たちの環境では、次のようなエラー シナリオが発生することがあります。

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 の作成は合法ですか、それともインスタンスを 1 つだけにする必要がありますか (たとえば、作成コストのため)?
  • DefaultFontProvider が 1 回だけ初期化される場合 -> このインスタンス スレッドは保存されますか?

前もって感謝します!

4

1 に答える 1