Мы получаем периодические исключения от нашего генератора 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?
Нам не удалось воспроизвести эту проблему локально.
Сначала мы создаем pdf, который будет содержать загруженный svg:
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);




Итак, в моем первоначальном посте у меня действительно было 'tmpSVGPdf.close ()'. Эта конкретная строка не была протестирована во время публикации, что является моей ошибкой. Оказывается, проблема была в этом. Мы не закрывали tempSVG, и по какой-то причине это вызывало проблему, несмотря на то, что закрытие происходит после того, как возникает исключение. Мы вставили close () после вызова importPageAsForm (), и проблема больше не возникает. Иди разберись!
Я подозреваю, что вы закрываете tmpSVGPdf слишком рано, возможно, некоторые объекты используются в целевом документе, хотя
importPageAsFormдолжен сделать правильный клон. Также убедитесь, что вы используете последнюю версию PDFBox, какую из них вы использовали?