Ошибка при чтении файла PDF, созданного MS Office - PullRequest
1 голос
/ 30 октября 2019

Всякий раз, когда я пытаюсь прочитать PDF-файл, созданный Office, возникает ошибка:

com.itextpdf.kernel.PdfException: Append mode requires a document without errors, even if recovery is possible.
    at com.itextpdf.kernel.pdf.PdfDocument.open

Пример рассматриваемого файла: https://drive.google.com/open?id=1fnwtXfEGg6BIeVuAi-l28Ol_dxbCd12F и фрагмент кодаЯ использую, чтобы открыть его. Моя цель состоит в том, чтобы сделать отдельную подпись, это прекрасно работает для каждого файла, если он не генерируется MS Office.

PdfReader reader = new PdfReader(docPath);
StampingProperties properties = new StampingProperties();
        properties.useAppendMode();

//This is where the error is thrown.
PdfSigner signer = new PdfSigner(reader, new FileOutputStream(outputPath), properties);

Я прочитал этот вопрос, который в основном та же проблема: В режиме добавления требуется документ без ошибок, даже если восстановление возможно , пробовал то, что Лоуги предлагает для удаления байтов

xref
0 24
0000000000 65535 f 
0000011981 00000 n 
0000000239 00000 n 
0000003212 00000 n 
0000000022 00000 n 
0000000220 00000 n 
0000000343 00000 n 
0000003176 00000 n 
0000000000 00000 n 
0000003345 00000 n 
0000000440 00000 n 
0000003155 00000 n 
0000003295 00000 n 
0000003863 00000 n 
0000003519 00000 n 
0000003843 00000 n 
0000004099 00000 n 
0000011737 00000 n 
0000011758 00000 n 
0000011803 00000 n 
0000011877 00000 n 
0000011900 00000 n 
0000011942 00000 n 
0000011961 00000 n 
trailer
<< /Size 24 /Root 12 0 R /Info 1 0 R /ID [ <8e4b8658dd1d1f745bdf99a0eb05bb97>
<8e4b8658dd1d1f745bdf99a0eb05bb97> ] >>
startxref
12125
%%EOF

Но мой PDF жаловался и перестал работать, такжепопытался оставить %% EOF, но получил тот же результат.

Итак, две вещи:

1) Есть ли исправление для ошибки, обсуждаемой Lowagie и MKL?

2) Что может быть решением этой проблемы?

1 Ответ

1 голос
/ 31 октября 2019

Прежде всего, вопрос , на который вы ссылаетесь , это , а не о , в основном та же проблема, , вы просто получаете то же сообщение об ошибке. В рассматриваемом PDF-файле есть гибридный справочный PDF, который не является вашим файлом: ваш файл имеет только одну таблицу перекрестных ссылок и один трейлер, в то время как гибридный ссылочный PDF имеет (как минимум) две таблицы перекрестных ссылок, за которыми следует трейлер, ипоследний трейлер имеет запись XRefStm , указывающую на поток перекрестных ссылок. Гибридные справочные PDF-файлы действительны, у iText 7 раньше были проблемы с такими PDF-файлами, и это было ошибкой.

С другой стороны, в вашем PDF-файле действительно есть ошибка: в таблице перекрестных ссылок утверждается, что объект 8имеет смещение файла 0

xref
0 24
...
0000000000 00000 n 

Это не может быть правдой, так как в начале файла находится заголовок PDF. Кроме того, первым объектом, который следует после этого, является объект 4, поэтому нельзя утверждать, что имеется в виду первый объект, следующий за смещением ...

iText 7 разрешает режим добавления, только если он не обнаружил проблему висходный файл. Это разумно.

Так что, если вы воспроизводимым образом получаете эту ошибку, вы должны сообщить об ошибке производителю PDF.

Вы утверждаете, что PDF-файл был генерируется MS Office . Метаданные вашего PDF, с другой стороны, указывают, что, хотя MS Word является создателем документа , фактическим производителем PDF является Quartz PDFContext. Возможно, вы захотите подать проблему для Quartz PDFContext.

Обходной путь для вас - перехватить это исключение и повторить попытку без режима добавления.

В качестве альтернативы, если вам действительно действительно нужно обработать эти поврежденные файлы в режиме добавления, вы можете заставить PdfReader лгать о найденной ошибке, переопределив hasRebuiltXref с помощью метода, которыйвсегда возвращает false, например, заменяя

PdfReader reader = new PdfReader(SOURCE);

на

PdfReader reader = new PdfReader(SOURCE) {
    @Override
    public boolean hasRebuiltXref() {
        return false;
    }
};

( StampNoChange test testAppendTest)

Имейте в виду, однако, что полученный PDF все еще содержит ошибку iText, указанную в исходном файле. Таким образом, любые процессоры PDF, продолжающие обработку вашего PDF, также могут наткнуться, так же, как это делал изначально iText, или каким-то другим, возможно, впечатляющим способом.

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