PDFBox COSStream закрыт перед использованием - PullRequest
0 голосов
/ 14 ноября 2018

Мы получаем периодические исключения от нашего генератора 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);

1 Ответ

0 голосов
/ 24 ноября 2018

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

...