当前位置: 首页 > 知识库问答 >
问题:

iText-OutOfMemory创建超过1000个PDF

沈畅
2023-03-14

我想创建一个用PDF-AS填充的ZipOutputStream。我使用的是iText(5.5.7版)。对于超过1000个pdf条目,我在doc.close()上得到一个OutOfMemory-exception并且找不到泄漏。

ByteArrayOutputStream baos = new ByteArrayOutputStream();
ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream(baos));
zos.setEncoding("Cp850");
for (MyObject o : objects) {
try {
    String pdfFilename = o.getName() + ".pdf";
    zos.putNextEntry(new ZipEntry(pdfFilename));
    pdfBuilder.buildPdfADocument(zos);
    zos.closeEntry();
} ...

PDFBuilder

public void buildPdfADocument(org.apache.tools.zip.ZipOutputStream zos){
   Document doc = new Document(PageSize.A4);
   PdfAWriter writer = PdfAWriter.getInstance(doc, zos, PdfAConformanceLevel.PDF_A_1B);
   writer.setCloseStream(false); // to not close my zos
   writer.setViewerPreferences(PdfWriter.ALLOW_PRINTING | PdfWriter.PageLayoutSinglePage);
   writer.createXmpMetadata();
   doc.open();
   // adding Element's to doc
   // with flushContent() on PdfPTables
   InputStream sRGBprofile = servletContext.getResourceAsStream("/WEB-INF/conf/AdobeRGB1998.icc");
   ICC_Profile icc = ICC_Profile.getInstance(sRGBprofile);
   writer.setOutputIntents("Custom", "", "http://www.color.org", "sRGB IEC61966-2.1", icc);
   //try to close/flush everything possible
   doc.close();
   writer.setXmpMetadata(null);
   writer.flush();
   writer.close();
   if(sRGBprofile != null){
     sRGBprofile.close();
   }
}

有什么建议我该怎么修复它?我是不是忘了什么?我已经尝试过使用java ZipOutputStream,但它有任何区别。

Thx为你的答案!我理解ByteOutputStream的问题,但我不确定在我的情况下什么是最好的方法。这是一个web应用程序,我需要以某种方式将zip打包到数据库blob中。

我现在所做的是用iText将PDF直接创建到ZipOutputStream中,并将相应的ByteArrayOutputSteam的字节数组保存到Blob中。我看到的选项是:

拆分我的数据在500个对象包,保存前500个PDF到数据库,然后打开zip和添加下500个等等...但我假设这给我造成了和我现在一样的情况,即在内存中打开了太大的流。

尝试在服务器上保存PDF(不确定是否有足够的空间),创建临时zip文件,然后将字节提交到blob...

有什么建议/想法吗?

共有1个答案

支阳波
2023-03-14

这是因为ZipOutputStream由ByteArrayOutputStream支持,因此即使关闭条目也会将完整的ZIP内容保留在内存中。

 类似资料:
  • 问题内容: 我如何从数据存储中获取1000条以上的记录,然后将其全部放入一个列表中以传递给Django? 问题答案: 与1.3.6版本开始(公布八月-17-2010),你 CAN 从变更日志: 数据存储区count()查询的结果 以及所有数据存储区查询的偏移量不再上限为1000 。

  • null 有人能解释一下,当我使用PdfReader阅读模板后,我如何制作模板的副本吗?有没有办法把表格写到模板副本上,而不是一个新文档上? 为了将来的参考,我做了以下工作:

  • 问题内容: 我正在尝试通过iText合并1000个PDF文件。我不确定内存泄漏发生在哪里。下面是示例代码。请注意,一旦合并到父文件,我将删除子pdf文件。请指出以下代码中的错误,或者有没有更好的方法在没有内存的情况下做到这一点。此过程通过servlet(不是独立程序)完成 问题答案: 您可能想要尝试以下操作(为清楚起见,异常处理,文件关闭和删除已删除):

  • 假设N是根号,三者将创建N-1,N-2,N-3的左中右节点。 EX: 等。 我的 TreeNode 类具有以下变量: 每当我构造一个整数大于 28 的树时,我都会得到一个 OutOfMemoryError。我的递归方法是效率低下还是很自然?谢谢!

  • 问题内容: 我是Sql的新手,但是将excel文档中的1000多个行插入到我的数据库中的最佳方法是什么(Sql Server2008。) 例如,我正在使用以下查询: 这很好用,但是插入1000条记录是有限制的,我有19000条记录,我真的不想做19条单独的插入语句,还有另一个问题,那就是公司ID总是相同的,那么有没有更好的方法呢写了19000次吗? 问题答案: Microsoft提供了带有SQL

  • 问题内容: 我使用itext将pdf转换为文本文件,它实际上工作良好,但是对于某些词它可以完成以下操作:例如,在pdf中,有诸如“ present the main idea”之类的短语,但是itext创建了诸如“ presentthemainideas”之类的输出。无论如何,有没有纠正这种行为? 问题答案: 缺少空格字符的原因是,您在渲染的PDF中看到的空格不一定与PDF页面内容描述中的空格相对