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

PDFBox COSStream在使用前关闭

盖雪峰
2023-03-14

我们从运行在云中的docker容器中的pdf生成器中获得间歇性异常。生成器的一部分处理获取SVG文档并将其加载到PDF中。每100ish调用它就会从importPageAsForm(tmpSVGPdf,0)引发以下异常。

java.io.IOException: COSStream has been closed and cannot be read. Perhaps its enclosing PDDocument has been closed?

我们还没能在本地复制这个问题。

PDDocument pdf = new PDDocument();
PDPage page = new PDPage(new PDRectangle(width, height));
pdf.addPage(page);

然后我们打开一个PDF流&一个svg代码转换器的输出流。

try(PDPageContentStream stream = new PDPageContentStream(pdf, page, PDPageContentStream.AppendMode.APPEND,false, true))
try (ByteArrayOutputStream byteStream = new ByteArrayOutputStream())

当我们点击下面的importPageAsForm时,我们会传入临时SVG文档,在该函数中的某个地方,它会点击一个关闭的COSStream。我们使用相同的数据在本地运行函数,它总是运行良好。

TranscoderInput input = new TranscoderInput(new ByteArrayInputStream(element.getEncodedData().getBytes()));
TranscoderOutput output = new TranscoderOutput(byteStream);
pdfTranscoder.transcode(input, output);
PDDocument tmpSVGPdf = PDDocument.load(byteStream.toByteArray());

LayerUtility layerUtil = new LayerUtility(pdf);
PDFormXObject svgObj = layerUtil.importPageAsForm(tmpSVGPdf, 0);
stream.drawForm(svgObj);
return Optional.of(pdf);

共有1个答案

万俟穆冉
2023-03-14

好的,所以在我最初的帖子中,我实际上有'tmpsvgpdf.close()'这一行在发帖时没有被测试,这是我的错。原来这就是问题所在。我们没有关闭tempSVG,由于某种原因导致了问题,尽管关闭是在异常抛出的地方之后。我们在importPageAsForm()调用后插入close()&问题不再出现。去想办法!

 类似资料:
  • 本文向大家介绍javascript在当前窗口关闭前检测窗口是否关闭,包括了javascript在当前窗口关闭前检测窗口是否关闭的使用技巧和注意事项,需要的朋友参考一下 在当前窗口关闭前,检测当前窗口是否关闭 在ie9中,如果刷新文档的话,unloadform和onbeforeunload都会执行,如果是关闭页面的话只会执行onbeforeunload事件 值得注意的是,onunload在关闭页面时

  • 在使用Hibernate和Jpa的spring boot应用程序中,我需要在saveAll()之前关闭select,以提高高记录数的性能。 我找到了一个使用JPQL的方法,性能很好(在30s内删除+保存10k条记录),但我希望继续使用hibernate和JPA。 我的期望是,当我运行用Java编写的代码时,我必须删除一个表的所有记录,然后保存另一个表的所有记录。当我以经典的方式(deleteAll

  • 如何删除已分配给端口的当前进程/应用程序? 例如:

  • 问题内容: 是否可以在switch语句中使用关系运算符(<,<=,>,> =)? 上面的例子(显然)不起作用 问题答案: 你不能。 从jls-14.11 关系运算符(<,<=,>,> =)导致并且不允许这样做。 以下所有条件必须为真,否则会发生编译时错误: 与switch语句关联的每个case常量表达式都必须可分配给开关Expression的类型(第5.2节)。 与switch语句关联的大小写常量

  • 问题内容: 根据Java文档,在任何java.io Streams上调用close()都会自动调用flush()。但是我在很多示例中都看到过,即使在生产代码中,开发人员也都在close()之前显式使用了flush()。在什么情况下,我们需要在close()之前使用flush()? 问题答案: 在编写必须发送的内容后,开发人员养成了调用flush()的习惯。 恕我直言,在刚进行写操作时,使用flus

  • 说我有这样的关系 那么,我是否可以说这种关系是一种关联,而不是聚合或组合。 我可以说狮子使用食物并像这样绘制UML图吗 此外,这种关系也没有多重性,因为Lion没有Food数组,食物也没有Lions数组作为实例变量。不同于复合和聚合,其中关系具有多重性。 如果我希望Food也能以同样的方式使用Lion呢。我在两个班级之间画两个箭头吗?