Как открыть документ PDF из существующего документа PDF в itext7? - PullRequest
0 голосов
/ 29 мая 2019

Чтобы проверить загруженные файлы PDF на базовое соответствие PDF / A, мне нужно прочитать их как PdfADocuments. Но начиная с версии 7.1.6 это больше не работает, но выдает исключение PdfException (PdfException.PdfReaderHasBeenAlreadyUtilized)

class Controller
...
// get uploaded data into PdfDocument, which is passed
// on to different services.

InputStream filecontent = fileupload.getInputStream();
int read = 0;
byte[] bytes = new byte[1024];
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
while ((read = filecontent.read(bytes,0,bytes.length)) != -1) {
    filesize += read;
    buffer.write(bytes, 0, read);
}

ByteArrayInputStream input = new ByteArrayInputStream(buffer.toByteArray());
PdfReader reader = new PdfReader(input); 
PdfWriter writer = new PdfWriter(new ByteArrayOutputStream());

PdfDocument pdf = new PdfDocument(reader, writer);

AnalyzerService analyzer = new AnalyzerService();
if(analyzer.analyze(pdf)) {
    otherService.doSomethingWith(pdf);
}
...

class AnalyzerService
...
public boolean analyze(PdfDocument pdf) {
    PdfADocument pdfa = new PdfADocument(
        pdf.getReader(), pdf.getWriter() <-- PdfException here
    );
...
}

До iText 7.1.5 включительно это работало.

С 7.1.6 я получаю "com.itextpdf.kernel.PdfException: данный экземпляр PdfReader уже использовался. PdfReader не может быть повторно использован, пожалуйста, создайте новый экземпляр."

Кажется, мне нужно получить байты из PdfDocument в виде байта [], а затем создать из него новый PdfReader. Я пытался получить их из pdf.getReader (). GetOutputStream (). ToByteArray (), но это не работает.

В настоящий момент я совершенно растерялся, как создать этот PdfADocument из данного PdfDocument.

1 Ответ

1 голос
/ 29 мая 2019

Ваш подход использует одинаковые PdfReader и (что еще хуже) одинаковые PdfWriter для экземпляров PdfDocument и PdfADocument. Поскольку оба могут манипулировать PdfReader и записывать в PdfWriter, такая ситуация может привести к появлению мусора в модуле записи, поэтому вы не должны этого делать.

Просто всегда рассматривайте документ как с читателем, так и с писателем как незавершенное, что нельзя рассматривать как готовый файл документа, например, выписка для промежуточных чеков.

Если вы хотите проверить загруженные файлы PDF , почему бы вам просто не переслать byte[] из buffer.toByteArray() в метод analyze для создания отдельного считывателя (и, при необходимости, документ) из? Это действительно точно проверяет загруженный файл ...

Кроме того, если ваш входной документ может соответствовать PDF / A и обрабатывается специально в этом случае, разве вы не должны также манипулировать им как PdfADocument, если это так? То есть Разве вы не должны сначала проверить свой анализатор на соответствие и в положительном случае использовать PdfADocument для него также в своем классе контроллеров?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...