PDFBox COSStream在使用前已关闭

时间:2018-11-14 03:49:40

标签: java svg pdfbox

我们从运行在云中的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?

我们无法在本地重现此问题。

首先,我们将构建包含已加载的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);

1 个答案:

答案 0 :(得分:0)

好,所以在我的第一篇文章中,我实际上有一个'tmpSVGPdf.close()'。在发布时,这条特殊的线未经测试,这是我的错。原来,这就是问题所在。我们没有关闭tempSVG,由于某种原因导致了问题,尽管关闭是在引发异常的地方进行的。我们在importPageAsForm()调用之后插入了close(),问题不再存在。走吧!