PDFBox COSStream закрыт перед использованием

Мы получаем периодические исключения от нашего генератора 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 слишком рано, возможно, некоторые объекты используются в целевом документе, хотя importPageAsForm должен сделать правильный клон. Также убедитесь, что вы используете последнюю версию PDFBox, какую из них вы использовали?

Tilman Hausherr 14.11.2018 06:11
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
755
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Другие вопросы по теме