java - PDFBox COSStream 使用前关闭
问题描述
我们从在云中的 docker 容器中运行的 pdf 生成器收到间歇性异常。生成器的一部分处理获取 SVG 文档并将其加载到 pdf 中。每 100 次调用它都会从 importPageAsForm(tmpSVGPdf, 0) 抛出以下异常。
java.io.IOException: COSStream has been closed and cannot be read. Perhaps its enclosing PDDocument has been closed?
我们无法在本地重现此问题。
首先,我们构建将包含加载的 svg 的 pdf:
PDDocument pdf = new PDDocument();
PDPage page = new PDPage(new PDRectangle(width, height));
pdf.addPage(page);
然后我们为 svg 转码器打开一个 PDF 流和一个输出流。
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);
解决方案
好的,所以在我最初的帖子中,我实际上有'tmpSVGPdf.close()' 这个特定的行在发布时未经测试,这是我的错。事实证明这是问题所在。我们没有关闭 tempSVG 并且由于某种原因导致了问题,尽管关闭是在异常引发之后发生的。我们在 importPageAsForm() 调用之后插入了 close() 并且问题不再出现。去搞清楚!
推荐阅读
- python - 来自 Python 的 Sonos 的 Unicode 播放列表
- css - 不同视口的引导间距助手?
- javascript - PHP 中的 JSON 对象解析
- ios - CTFrame 有时为空,具体取决于 UIFont pointSize
- python - Django 项目中的多个视图和模型
- z3 - 如何在 z3 中添加 IndexOf 结果的偏移量
- c# - 为什么触发 C# 事件的方法必须是虚拟保护的?
- javascript - 在nodejs中等待与rabbit的正确连接
- java - 嵌套的浏览器:让外部滑动而不是内部
- java - Spring Webflux - 将数据流发送到端点