Прежде всего, вопрос , на который вы ссылаетесь , это , а не о , в основном та же проблема, , вы просто получаете то же сообщение об ошибке. В рассматриваемом 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, или каким-то другим, возможно, впечатляющим способом.