Acrobat Reader получает ошибку при чтении документа, он может быть поврежден и не может быть восстановлен - PullRequest
0 голосов
/ 02 апреля 2019

Я не могу открыть этот PDF-файл на Acrobat Reader, он говорит мне об ошибке (на французском языке) без ошибки кода. Как я могу получить больше информации о предупреждении об ошибке при открытии PDF-файла в программе Acrobat Reader, есть ли ярлык для отображения дополнительной информации об ошибке, потому что в настоящее время он говорит только на французском языке:

"Произошла ошибка при чтении документа, возможно, он поврежден и не может быть отремонтировать "

В Chrome PDF Viewer я могу открыть эту ошибку-original.pdf

PS: вот еще один ok-original.pdf , который работает при открытии с помощью Acrobat Reader.

Я на Windows10, Acrobat Reader Версия: 19.10.20098.316574

Я не могу объяснить, почему мой файл error-original.pdf поврежден, возможно, после некоторых манипуляций с pdfbox, но не может воспроизвести. Мой вопрос, как получить больше информации об этой ошибке.

ОБНОВЛЕНИЕ № 1 (подробнее)

Вот код, который я использую для подготовки / манипулирования моим оригиналом.pdf Этот код делает 4 вещи: 1. установить частичное имя поля (аналогично текущему значению поля) 2. удалить все ссылки на страницах 3. удалить поле с пустым значением || 4. временное сжатие, чтобы попытаться получить некоторый октет случайно, используя метод @mkl OptimizeAfterMerge.java

Document pdfOriginal = PDDocument.load(f.toFile());

//1.set field partialName like his current value
pdfOriginal.getDocumentCatalog().getAcroForm().getFields().forEach(field -> {
    if (field instanceof PDTextField && !field.getValueAsString().contains("--")
            && !field.getValueAsString().isBlank() && !field.getValueAsString().isEmpty()) {
        field.setPartialName(field.getValueAsString());
    }
});

//2.remove all link in document
removeLinksInPages(pdfOriginal);

//3.remove field with empty||blank value
pdfOriginal.getDocumentCatalog().getAcroForm().getFields().forEach(field -> {
    if (field instanceof PDTextField
            && (field.getValueAsString().isBlank() || field.getValueAsString().isEmpty())) {
        try {
            removeField(pdfOriginal, field.getPartialName());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
});

pdfOriginal.save(new File(f.toAbsolutePath().toString()));
pdfOriginal.close();

//4.try to compress to gain some octets
PDDocument compress = PDDocument.load(f.toFile());
OptimizePdfDocument.optimize(compress);
compress.save(new File(f.toAbsolutePath().toString()));
compress.close();

Используемый метод:

removeLinksInPages (...)

removeField (...)

N.B. Я не могу подтвердить, что этот код всегда выводит исправленный файл, потому что это не так, но иногда, если я открываю файл с помощью Acrobat Reader, его невозможно прочитать.

(сообщение @mkl: поверьте мне, я не говорю здесь о повреждении файла одним из ваших методов, и я знаю, что ваше сжатие предназначено для объединенного файла, не волнуйтесь, я, конечно, поступаю неправильно и пытаюсь найти проблему, спасибо за понимание)

ОБНОВЛЕНИЕ № 2 (странный результат)

Я сталкиваюсь со странной вещью: просто запустив этот код pdfbox на вышеуказанный поврежденный файл error-original.pdf :

PDDocument pdfOriginal = PDDocument.load(new File(".../error-original.pdf"));
pdfOriginal.save(new File(".../error-original.pdf"));
pdfOriginal.close();

Acrobat Reader может открывать выдачу (нетронутый файл PDF), но при прокрутке Acrobat Reader появляется другая ошибка: «эта страница имеет ошибку, программа Acrobat Reader не может показать эту страницу. Свяжитесь с автором PDF для решения проблемы», и когда я закрыть error-alert-popup Я могу продолжать прокручивать и читать мой PDF. Вы можете попробовать открыть с помощью Acrobat Reader этот error-on-scroll.pdf

ps: сообщение для @acrobatreader: проблема в том, что я АВТОР PDF, и я не знаю, как решить (шутка)

@ KenS, не могли бы вы дать какие-то комментарии, похоже, ошибка на стр. 2

Ответы [ 3 ]

1 голос
/ 02 апреля 2019

Когда Acrobat отображает ошибку, вы можете попробовать удерживать нажатой клавишу управления (в Windows), нажимая левую кнопку «ОК». Это иногда дает вам больше информации.

В этом случае это не так. Файл сильно поврежден. Он был отредактирован, по крайней мере, дважды, и редактирование выглядит так, чтобы испортить файл, не требующий простого восстановления. Файл содержит:

startxref
81612

, который должен указывать на начало таблицы внешних ссылок (которая содержит смещение в файле всех объектов). Вместо этого смещение файла указывает на:

C89E1E8B69>]/Index[4 2 10 1 156 2]/Info 5 0 R/Length 31/Prev 77185/Root 1 0 R/Size 158/Type/XRef/W[1 3 0]>>stream

, который является частью пути через поток перекрестных ссылок. Словарь трейлера содержит запись / Prev, которая должна указывать на предыдущую внешнюю ссылку, вместо этого, опять же, он указывает на частичную прохождение через поток внешних ссылок. Исправляя это, он затем указывает на словарь трейлера, который, опять же, имеет запись / Prev, которая является неправильной.

Что бы вы ни использовали для редактирования этого файла, он продолжает ломать его таким же образом.

Я могу исправить эти смещения, что позволяет Ghostscript открывать и читать файл (MuPDF способен восстанавливать даже оригинальный файл). Он по-прежнему жалуется, что внешняя ссылка недействительна, и пытается восстановить. Во время ремонта обнаруживается, что некоторые объекты PDF имеют одинаковый номер объекта и номер поколения, что не должно иметь место.

Поскольку Acrobat не открывает восстановленный файл, возможно, именно на это и жалуется Acrobat. Похоже, что оба раза файл был отредактирован, он включал новые определения объектов 4, 5 и 10, но не увеличивал их номера генерации, оставляя их равными 0, и, следовательно, дублирует друг друга.

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

0 голосов
/ 04 апреля 2019

Может быть error-original.pdf pdf имеет / Пред в дополнение к ok-original.pdf

Но я воспроизвел и нашел решение: Проблема здесь в GIT, в моем проекте при получении файла из удаленного файла он выглядит как PDF, а не как бинарный файл. После добавления файла .gitattributes с содержимым *.pdf binary решите проблему. Итак, резюме:

  1. У автора PDF (на его локальной машине) есть рабочий PDF.

  2. pdf автор commit + push для удаленного доступа.

  3. Другой пользователь извлекает изменения с удаленного компьютера и пытается открыть pdf: это приводит к «поврежденному файлу».

  4. добавление .gittattributes на уровне .gitignore. Исправить проблему.

PS: Но все сказанное выше @mkl и Kens тоже остаются верными.

0 голосов
/ 02 апреля 2019

Следствие к Ответ Кена ...

В вашем файле есть три версии (т. Е. У вашего файла есть первоначальная версия и два инкрементных обновления). Поскольку ваш код PDFBox сохраняется только как совершенно новый файл, без использования инкрементного обновления, конечный результат вашего кода PDFBox уже находится в этой первой ревизии.

Кроме того, ваш исходный файл "ok-original.pdf" сохраняется с использованием таблиц перекрестных ссылок, в то время как все изменения в вашем файле результатов используют только потоки перекрестных ссылок.

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

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

Как уже объяснил Кенс в своем ответе, смещения объектов потока перекрестных ссылок в записях startxref и Prev слишком велики; точнее, они слишком велики на 116 для первоначальной ревизии, на 122 для второй и на 131 для последней, полной PDF.

PDFBox (см. Выше) не создал эти потоки перекрестных ссылок, не говоря уже об их значениях смещения. Таким образом, ваш код PDFBox не несет ответственности за неправильные смещения!

Если Adobe Acrobat - это программа, сгенерировавшая эти три ревизии, я также сомневаюсь, что Adobe Acrobat вызвал неправильные смещения.

Мне кажется, что после этого файл был скопирован или передан какой-либо программой или через какой-то канал, который удалил несколько байтов из файла, 116 байтов в первой ревизии, 6 байтов во второй и 9 байтов в третьей .

(Это сбрасывание могло также произойти в результате слияния нескольких байтов в меньшее количество ...)

...