gpt4 book ai didi

java - 如何修复java.lang.OutOfMemoryError : Java heap space when generating pdf document?

转载 作者:行者123 更新时间:2023-12-01 19:37:35 26 4
gpt4 key购买 nike

我的系统在处理大文件时抛出异常:“java.lang.OutOfMemoryError: Java heap space”。我意识到 StringWriter.toString() 会导致堆中的大小增加一倍,因此可能会导致问题。如何优化以下代码块以避免内存不足。

public byte[] generateFromFo(final StringWriter foString) {
try {
StringReader foReader = new StringReader(foString.toString());
ByteArrayOutputStream pdfWriter = new ByteArrayOutputStream();
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, fopFactory.newFOUserAgent(),pdfWriter);
TRANSFORMER_FACTORY.newTransformer().transform(new StreamSource(foReader), new SAXResult(fop.getDefaultHandler()));
LOG.debug("Completed rendering PDF output!");
return pdfWriter.toByteArray();
} catch (Exception e) {
LOG.error("Error while generating PDF from FO",e);
throw new AuditReportExportServiceException(AuditErrorCode.INTERNAL_ERROR,"Could not generate PDF from XSL-FO");
}
}

最佳答案

使用字节的 InputStream 可能会减少 foString 的内存最多 2 倍(char = 2 字节)。

ByteArrayOutputStream 在填充过程中会调整大小,因此添加估计的需求会加快速度,并且可能会防止调整大小过多。

        InputStream foReader = new ByteArrayInputStream(
foString.toString().getBytes(StandardCharsets.UTF_8);
foString.close();
final int initialCapacity = 160 * 1024;
ByteArrayOutputStream pdfWriter = new ByteArrayOutputStream(initialCapacity);
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, fopFactory.newFOUserAgent(),
pdfWriter);
TRANSFORMER_FACTORY.newTransformer().transform(new StreamSource(foReader),
new SAXResult(fop.getDefaultHandler()));

最好的办法是更改 API:

public void generateFromFo(final String foString, OutputStream pdfOut) { ... }

这可能会使 ByteArrayOutputStream 变得多余,并且您可能会立即流式传输到文件、URL 或其他内容。

文档本身和生成的 PDF 也存在问题:

  • 图像尺寸(但请记住打印的高分辨率)
  • 一些图像可以很好地矢量化
  • 页面标题中的重复图像应存储一次
  • 字体最好是标准字体,第二好的嵌入子集(使用的字符)
  • XML 可能不是最理想的,而且非常重复

关于java - 如何修复java.lang.OutOfMemoryError : Java heap space when generating pdf document?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56885192/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com