pdfresurrect

В pdfresurrect можно определить, сколько инкрементальных редакций хранится внутри PDF, вывести изменения по объектам, посмотреть сохранённые метаданные создателя и извлечь каждое прежнее состояние в отдельный файл. Основные инструменты — обычный анализ без параметров, быстрый счётчик -q, режим записи -w и вывод сведений -i; вместе они помогают проверить историю договора, отчёта или формы, не изменяя исходный документ.

Работа начинается с команды вида pdfresurrect документ.pdf. Утилита находит маркеры завершения, читает связанные с ними значения startxref, сопоставляет таблицы перекрёстных ссылок и печатает строки для добавленных, изменённых и освобождённых объектов. Когда нужен не подробный протокол, а только ответ о числе сохранений, к имени файла добавляют -q; когда требуются открываемые копии прежних состояний, используют -w.

Результат зависит от способа сохранения PDF. Наиболее полная сводка получается у документов с классическими текстовыми таблицами xref и последовательными инкрементальными обновлениями. Если редактор переписал файл целиком, история могла исчезнуть; если перекрёстные ссылки упакованы в поток, программа способна заметить потенциальный xref-поток и посчитать редакции, но не перечисляет объекты внутри него.

Скачать pdfresurrect

Оценка 9.7 Рекомендуем
  • Редактирование PDF
  • Русский интерфейс
  • Просто новичкам
Скачать бесплатно на Windows
Лучшая альтернатива
pdfresurrect
Оценка 8.0
  • Нет графического интерфейса
  • Не читает xref-потоки
  • Один PDF за запуск
Скачать pdfresurrect
Загрузка начнётся после нажатия

Как устроено восстановление предыдущих состояний

PDF допускает добавление изменений в конец файла без переписывания уже существующих байтов. При таком сохранении редактор записывает новые или изменённые объекты, новую таблицу перекрёстных ссылок, новый словарь trailer и очередной маркер завершения. Старые данные остаются раньше в том же файле, а цепочка указателей /Prev связывает новую таблицу с предыдущей. pdfresurrect использует именно эту структуру: он не угадывает текст по кэшу и не ищет временные файлы, а прослеживает зафиксированные внутри PDF секции обновлений.

Чтобы показать более раннее состояние, программа создаёт копию исходного набора байтов и дописывает в конец новый startxref, указывающий на выбранную старую таблицу. Просмотрщик, соблюдающий обычную логику PDF, принимает эту таблицу за самую позднюю и строит документ по соответствующему состоянию объектов. Поэтому получившийся файл может быть почти такого же размера, как исходный: в нём остаются последующие байты, но точкой входа становится прежняя редакция.

Такой метод полезен именно для последовательных инкрементальных сохранений. Он не является универсальным откатом всех действий пользователя. Полное сохранение с оптимизацией, печать в новый PDF, экспорт через виртуальный принтер и многие операции очистки создают новый набор объектов без старой цепочки. В этом случае счётчик покажет одну редакцию, даже если до экспорта документ редактировали много раз.

Историческое состояние тоже не гарантирует визуального отличия. Редактор мог менять только служебные поля, подпись, аннотацию, форму, закладку или словарь каталога. Поэтому сначала анализируют строки по объектам и метаданные, а затем открывают извлечённые файлы в доверенном просмотрщике и сравнивают страницы, вложения, комментарии и свойства документа.

Подготовка безопасной рабочей копии

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

Имя файла лучше сделать коротким и однозначным, например contract-received.pdf. Пробелы допустимы, если путь заключён в кавычки, но в автоматических сценариях проще избегать кавычек, национальных символов и управляющих знаков. Отдельный каталог особенно важен для -w: программа создаёт рядом папку с суффиксом -versions, и существующая папка с таким именем блокирует повторное извлечение.

Не следует сразу открывать неизвестный PDF в богатом просмотрщике с поддержкой JavaScript, вложений и запуска действий. Сначала можно проверить тип файла, размер, хеш и число редакций, затем выполнять просмотр в изолированной среде. pdfresurrect разбирает внутреннюю структуру, поэтому повреждённый или специально подготовленный документ нужно считать недоверенным входом так же, как архив или исполняемый файл.

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

Запуск команды и чтение справки

Базовый синтаксис содержит имя PDF и необязательные ключи: pdfresurrect file.pdf [-i] [-w] [-q]. Имя файла можно ставить до или после ключей, поскольку программа просматривает аргументы и отдельно распознаёт параметры. Для пути с пробелами используют кавычки: pdfresurrect "Договор 12.pdf" -q. Несколько PDF в одной команде не обрабатываются: каждый файл запускают отдельно или применяют цикл оболочки.

Справка pdfresurrect с ключами -i, -w и -q

Ключи решают разные задачи. -q подавляет подробную пообъектную сводку и печатает только строку с именем и числом редакций. -w создаёт файлы предыдущих состояний и текстовую сводку. -i после структурного анализа выводит версию формата PDF и найденные информационные поля. Ключи можно сочетать, но практический смысл комбинации нужно понимать: например, -w -q сохраняет результаты, а в терминале оставляет минимальный вывод.

В опубликованной справке встречается вызов с -h, хотя фактический обработчик справки зависит от сборки: при отсутствии имени файла программа в любом случае показывает краткое использование. Надёжный способ проверить доступные ключи — запустить pdfresurrect без аргументов и сравнить вывод с установленной man-страницей.

Стандартный вывод удобно перенаправлять в текстовый файл: pdfresurrect sample.pdf > sample-report.txt. Диагностические ошибки пишутся в поток ошибок, поэтому для полного журнала используют pdfresurrect sample.pdf > sample-report.txt 2>&1. Это особенно полезно при пакетной проверке, где нужно сохранить как нормальный отчёт, так и причину отказа.

Быстрый подсчёт редакций с ключом -q

Команда pdfresurrect -q contract.pdf отвечает в форме contract.pdf: 8. Число восемь означает восемь распознанных состояний документа, то есть исходное состояние и семь последующих инкрементальных обновлений. Это не количество изменённых страниц, подписей или пользователей. Одна операция сохранения может изменить десятки объектов, а несколько действий редактора могут попасть в одну секцию обновления.

Подсчёт восьми редакций PDF командой pdfresurrect -q

Счётчик полезен как первый фильтр для большого набора документов. Файлы с единицей обычно не содержат доступной цепочки прежних состояний; файлы с числом больше единицы требуют дальнейшей проверки. Однако единица не доказывает отсутствие прежних данных во всех смыслах: удалённый текст может оставаться в неиспользуемом объекте, потоках, вложениях или графических ресурсах без отдельной таблицы обновления. Для такого анализа нужны дополнительные инструменты.

Сравнивать числа между двумя копиями нужно осторожно. Если один файл оптимизировали или пересохранили полностью, он может иметь одну редакцию и при этом отображать тот же документ, что файл с восемью редакциями. И наоборот, две редакции могут отличаться только метаданными. Число служит индикатором структуры, а не оценкой объёма или важности изменений.

В скрипте вывод удобно разделять по двоеточию, но имя файла само может содержать двоеточие на некоторых платформах или в смонтированных ресурсах. Надёжнее сохранять исходный путь отдельно и извлекать последнее числовое поле. Ещё проще запускать команду в цикле и записывать результат вместе с хешем файла в табличный журнал.

Полная сводка без дополнительных ключей

Без -q программа проходит по каждой распознанной таблице и печатает запись для каждого xref-элемента. Типичная строка содержит имя файла, статус, номер редакции, номер объекта и предполагаемый тип: audit.pdf: --M-- Version 2 -- Object 3 (Page). Такой отчёт показывает структурный масштаб изменений и помогает выбрать состояния для визуального сравнения.

Пообъектная сводка pdfresurrect со статусами A, M и D

Отчёт может быть длинным даже у короткого документа. Страница PDF состоит не из одного элемента: отдельными объектами бывают каталог, дерево страниц, сама страница, шрифты, изображения, содержимое, аннотации, формы и словарь информации. Изменение одной подписи или заметки способно затронуть несколько объектов. Поэтому количество строк нельзя напрямую переводить в количество пользовательских правок.

В конце выводится разделитель с именем файла, общее число редакций и число объектов по каждой редакции. Сводные числа полезны для поиска резких изменений. Например, скачок с нескольких десятков до нескольких сотен объектов может означать добавление страниц, вложений, шрифтов или изображений. Но точный вывод делают только после проверки типов и открытия соответствующих состояний.

Если требуется сохранить отчёт для последующего поиска, перенаправляют вывод в файл и используют обычные средства обработки текста. Можно отобрать строки --M--, сгруппировать записи по номеру редакции или искать типы Annot, Page, Stream. При этом исходный полный журнал оставляют неизменным, а фильтры применяют к копии.

Статусы A, M, D и неопределённые записи

Метка A означает объект, который для данной редакции рассматривается как добавленный. В первом состоянии большинство занятых объектов закономерно получает A. В последующих состояниях такой статус возникает, когда появился новый идентификатор или когда ранее освобождённый номер снова стал активным. Добавление аннотации, поля формы или нового потока часто создаёт несколько строк A.

Метка M означает, что объект с тем же номером уже существовал, но его смещение изменилось. Это структурный признак новой записи объекта, а не доказательство конкретного изменения текста. Редактор может переписать словарь страницы из-за изменения ресурсов, поворота, поля Annots или служебного параметра. Чтобы понять смысл, сравнивают содержимое объекта другими средствами и открывают соответствующие версии.

Метка D относится к освобождённой записи таблицы xref. Она показывает, что номер объекта помечен свободным в новой таблице. Удалённое содержимое при этом может физически оставаться в более ранней части файла и быть доступным через извлечённое состояние. Именно поэтому обычное визуальное удаление или закрытие аннотации нельзя считать безопасным уничтожением данных.

Знак вопроса появляется, когда программа не может уверенно отнести запись к добавленной, изменённой или удалённой. Например, смещение совпало с предыдущим либо сопоставление не даёт однозначного статуса. Такие строки не следует отбрасывать: они помогают увидеть неизменившиеся ссылки и особенности xref, но сами по себе не указывают на пользовательскую правку.

Что означают типы объектов в отчёте

Тип Catalog относится к корневому словарю документа. Его изменение может быть связано с формами, метаданными, закладками, режимом просмотра, дополнительными действиями или другими глобальными структурами. Тип Pages описывает узел дерева страниц, а Page — конкретный словарь страницы. Новая строка Page ещё не означает, что изменилось видимое содержимое: могла поменяться ссылка на аннотацию или набор ресурсов.

Тип Stream требует особого внимания, поскольку потоки хранят команды рисования, изображения, шрифты, вложения, данные форм и другие бинарные блоки. pdfresurrect не выполняет глубокое декодирование каждого потока в отчёте; он лишь определяет тип объекта по доступному словарю. Для содержательного сравнения потоков используют инструменты, умеющие распаковывать фильтры и безопасно показывать байты.

Тип Annot обычно связан с комментариями, ссылками, штампами, выделениями и другими аннотациями. Изменения аннотаций могут быть важны даже при неизменном основном тексте страницы. В договоре это может быть замечание согласующего, в форме — виджет поля, а в отчёте — ссылка или вложенный файл. Проверяют не только видимость аннотации, но и её словарь действий.

Если тип печатается как неизвестный или слишком общий, это не делает объект бесполезным. Не у каждого словаря есть поле /Type, а некоторые значения определяются контекстом. Номер объекта из отчёта можно передать qpdf, mutool show, peepdf или другому структурному анализатору и посмотреть полный словарь, поток и ссылки.

Извлечение состояний с ключом -w

Команда pdfresurrect contract.pdf -w создаёт каталог contract-versions. В нём появляются файлы contract-version-1.pdf, contract-version-2.pdf и далее, а также текстовая сводка. Нумерация отражает порядок распознанных таблиц: первая версия соответствует раннему состоянию, последняя — наиболее позднему из обнаруженных.

Каталог с извлечёнными версиями PDF и файлом summary

Каждый файл представляет собой технически изменённую копию, в которой конечный указатель направлен на выбранную старую таблицу. Оригинал остаётся отдельным. Не следует заменять им исходник или считать извлечённый файл полностью очищенным от последующих байтов: метод предназначен для предъявления старого состояния просмотрщику, а не для гарантированного удаления всех более новых данных.

После извлечения проверяют, что число PDF в каталоге соответствует счётчику -q. Затем открывают состояния по порядку и фиксируют, где впервые появляется нужное изменение. Для большого документа удобнее сначала сравнить размер, число страниц и текстовые хеши, а визуально открывать только состояния, между которыми обнаружена разница.

Если программа сообщает, что каталог уже существует, она прекращает извлечение, чтобы не смешивать результаты разных запусков. Нужно переименовать или удалить старую папку после проверки её содержимого. Автоматическое удаление без контроля опасно: в каталоге могут находиться результаты предыдущего анализа другого файла с тем же базовым именем.

Имена файлов и расположение результатов

Имя выходной папки строится из базового имени PDF без расширения и суффикса -versions. Для report.pdf получится report-versions. Внутренние файлы используют то же базовое имя и номер. Если анализируются документы из разных каталогов, но с одинаковым именем, запускать их из одной рабочей папки нельзя без предварительного переименования: выходные пути столкнутся.

Программа выделяет базовое имя по последнему разделителю пути и удаляет расширение перед формированием каталога. Практически это означает, что выход создаётся в текущем рабочем каталоге, а не обязательно рядом с исходным файлом. Перед запуском -w полезно выполнить pwd и убедиться, что текущая папка доступна для записи.

Расширение ищется по точке в имени. Для сложных имён вроде contract.final.signed.pdf результат обычно остаётся понятным, но безопаснее использовать простую копию. Не стоит подавать файл без расширения, если дальнейшие скрипты ожидают стандартные имена *.pdf. Сам формат определяется по сигнатуре, а не только по суффиксу.

В журнале анализа сохраняют соответствие: исходный полный путь, хеш, каталог результатов и номера извлечённых файлов. Это предотвращает ошибку, когда версия из одного набора случайно сравнивается с версией другого документа.

Текстовый файл summary

При -w подробная сводка записывается в файл с расширением .summary внутри выходного каталога. Это тот же тип информации, который без режима записи появился бы в терминале: статусы объектов, номера редакций, типы и итоговые счётчики. Файл удобно хранить рядом с извлечёнными PDF, потому что он объясняет, почему были выбраны определённые состояния.

Сводку открывают как обычный текст, не изменяя кодировку и переводы строк, если она должна служить частью отчётности. Для заметок создают отдельный файл. При повторном анализе сравнивают не только PDF, но и summary: изменение числа строк может указывать на другую сборку программы, другой входной файл или отличающийся способ разбора.

Большая сводка лучше читается после группировки по редакциям. Можно разделить строки по фрагменту Version N, посчитать A, M и D, затем выделить типы Page, Annot, Stream и Catalog. Такая таблица служит навигацией, но не заменяет исходные строки.

Если summary отсутствует, проверяют права записи, свободное место и сообщения в потоке ошибок. Сам факт появления каталога ещё не гарантирует, что все файлы созданы: ошибка на отдельном файле может оставить неполный набор.

Метаданные создателя с ключом -i

Ключ -i сначала печатает объявленную версию формата PDF, затем пытается вывести информационные поля для каждой распознанной редакции. Среди возможных ключей — Title, Author, Subject, Keywords, Creator, Producer, CreationDate, ModDate и Trapped. Наличие конкретного поля зависит от документа.

Вывод метаданных Creator, Producer и дат по редакциям

Creator обычно обозначает программу, сформировавшую исходное содержимое, а Producer — компонент, записавший PDF. Эти значения могут различаться: документ подготовлен в текстовом редакторе, а экспортирован библиотекой PDF. В последующей редакции производитель может измениться, если файл открыли и сохранили другой программой.

Даты записываются в синтаксисе PDF и могут включать часовой пояс. Их нельзя автоматически приравнивать к достоверному времени события: поля редактируются, копируются из шаблонов и зависят от часов компьютера. Полезно сопоставлять ModDate с порядком редакций, временем файловой системы, цифровой подписью и журналами системы, но не строить вывод на одном поле.

При отсутствии /Info или понятных XMP-данных вывод может ограничиться версией формата. Это не ошибка. Некоторые генераторы намеренно не добавляют информационный словарь, а оптимизаторы удаляют его. Кроме того, метаданные могут храниться в XML-потоке и кодироваться так, что простой разбор не восстановит все значения.

Как программа находит информационные поля

Для каждой валидной таблицы программа ищет trailer и ссылку /Info, затем читает соответствующий объект. Она умеет распознавать традиционный словарь информации и отдельные XML-метаданные. Это даёт возможность увидеть разные значения между редакциями, если новые таблицы ссылаются на новые объекты информации.

Строки PDF могут быть заключены в круглые скобки, содержать экранирование или шестнадцатеричное представление. Отображение сложных Unicode-значений зависит от декодирования. Если имя автора выглядит повреждённым, сравнивают сырые байты объекта и XMP через другой анализатор, а не исправляют текст вручную в основном отчёте.

Наличие одинаковых метаданных во всех редакциях не означает отсутствия изменений. Редактор может оставить старый /Info, обновив только страницы или аннотации. Обратная ситуация также возможна: меняется ModDate, хотя визуальное содержимое остаётся тем же. Поэтому -i используют вместе с пообъектной сводкой.

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

Таблицы xref, startxref и цепочка Prev

Классическая таблица xref сопоставляет номер объекта с байтовым смещением и состоянием записи. После неё trailer содержит ключи вроде /Size, /Root, /Info и /Prev. В конце секции находится startxref с числом, указывающим на начало таблицы. pdfresurrect последовательно находит завершения и проверяет, что указанные области похожи на допустимые xref.

Ключ /Prev важен для понимания логики PDF, но сама программа также ориентируется на несколько маркеров завершения. Повреждённый файл может содержать ложные последовательности внутри потока или некорректные смещения. Поэтому найденное число редакций следует подтверждать тем, что извлечённые состояния действительно открываются и имеют ожидаемую структуру.

Номер объекта и номер поколения вместе образуют ссылку. В отчёте основное внимание уделяется номеру объекта, смещению и признаку свободной или занятой записи. Повторное использование освобождённого номера может выглядеть как добавление. Если важна точная семантика поколений, объект проверяют специализированным просмотрщиком структуры.

Ручной осмотр конца файла помогает диагностировать отказ, но редактировать startxref в исходнике не следует. Одна неверная цифра может сделать документ нечитаемым или перенаправить парсер в случайную область. Для экспериментов создают отдельную копию.

Ограничение xref-потоков

Начиная с PDF 1.5 перекрёстные ссылки могут храниться в специальном потоке вместо текстовой таблицы. pdfresurrect определяет, что объект по адресу startxref выглядит как поток, и помечает наличие потенциальных xref-потоков. Однако код не декодирует их записи, поэтому пообъектная сводка недоступна.

Предупреждение pdfresurrect о xref-потоках без объектной сводки

В таком случае терминал показывает предупреждение о potential cross reference streams и строку An object summary is not available. Итоговое число редакций может присутствовать, но его нужно считать предварительным. Программа не покажет, какие объекты добавлены или изменены, потому что не получила таблицу смещений из закодированного потока.

Практический обходной путь — использовать qpdf или mutool для структурного просмотра исходника. Нельзя сначала переписать файл этими инструментами и затем считать полученную историю эквивалентной оригиналу: нормализация может объединить или заменить секции. Исходный документ сохраняют, а преобразованную копию применяют только как вспомогательный материал.

Если важна цепочка редакций в файле с xref-потоками, peepdf лучше подходит для интерактивного анализа, поскольку умеет разбирать версии, объектные потоки и распространённые фильтры. pdfresurrect остаётся полезным быстрым индикатором и средством для классических таблиц, но его предупреждение нельзя игнорировать.

Линеаризованные PDF

Линеаризованный PDF оптимизирован для постепенного показа по сети. В начале находится отдельная структура быстрого доступа, а дополнительные таблицы могут относиться к одной логической версии. pdfresurrect пытается распознать такой случай, переставить внутренние записи и не считать линейную секцию самостоятельной редакцией.

Несмотря на специальную обработку, количество объектов у линеаризованного файла может выглядеть больше ожидаемого, поскольку объекты начальной секции участвуют в подсчёте вместе с основной таблицей. Это известная особенность интерпретации отчёта. Сравнивать числа объектов между обычным и линеаризованным экземпляром без поправки нельзя.

Линеаризация сама по себе не означает наличие пользовательской истории. Файл может быть создан один раз и содержать несколько технических xref-областей для быстрого доступа. Важны логические версии после корректировки, а не сырое число маркеров в байтах.

Если извлечённое состояние линеаризованного документа открывается нестабильно, проверяют его несколькими просмотрщиками. Метод восстановления рассчитывает, что читатель примет последнюю указанную таблицу за актуальную. Некоторые строгие валидаторы могут сообщать о последующих данных или несогласованности линеаризации, хотя обычный просмотрщик покажет страницу.

Проверка извлечённых PDF

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

Второй контроль — число страниц, размеры страниц и порядок. Если ранняя версия имела меньше страниц, это ожидаемая разница. Если все версии внезапно пустые или не открываются, возможно, просмотрщик не следует выбранному старому startxref, таблица повреждена или секции используют неподдерживаемую структуру.

Третий контроль — текст, аннотации, формы, вложения и метаданные. Простое сравнение отрендеренных изображений не покажет невидимый текст, JavaScript, скрытые поля или вложенные файлы. Поэтому визуальный diff дополняют извлечением текста и структурным анализом.

Четвёртый контроль — связь с summary. Если версия 3 показывает добавление Annot, а версия 2 и 3 визуально одинаковы, нужно включить отображение комментариев и проверить словарь аннотации. Если изменён Stream, сравнивают содержимое страницы или ресурс, на который он ссылается.

Поиск неудачной редактуры и скрытого текста

Один из наиболее практичных сценариев — проверка, не сохранился ли текст, который пытались закрыть прямоугольником или удалить в поздней редакции. Если закрытие выполнено добавлением новой графики при инкрементальном сохранении, раннее состояние может показать исходный текст. pdfresurrect извлекает целый документ до такой правки, что облегчает проверку.

Наличие старой версии не доказывает, что закрытый текст доступен в текущем визуальном состоянии обычными средствами. Оно показывает, что данные остались внутри контейнера и могут быть восстановлены через историю. Для оценки риска проверяют также текущие объекты: текст мог сохраниться под прямоугольником и без отдельной редакции.

После обнаружения проблемы безопасный выходной документ создают заново проверенным способом: применяют настоящее удаление содержимого, сводят страницы в контролируемое представление или используют редактор с верифицируемой функцией редактуры, затем проверяют новый файл несколькими методами. Экспериментальный scrub pdfresurrect для серьёзной защиты не подходит.

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

Анализ истории договора

В договоре сначала запускают -q, затем -i и полный отчёт. Редакции с изменениями Page, Stream, Annot или формы отмечают для извлечения. После -w открывают состояния по порядку и сравнивают реквизиты, суммы, сроки, подписи, комментарии и метаданные.

Особое внимание уделяют поздним небольшим редакциям. Добавление электронной подписи может изменить словари, поля и служебные потоки без заметной правки текста. В то же время правка одного числа в содержимом страницы может затронуть только один поток. Масштаб отчёта не равен юридической значимости.

Если документ содержит цифровую подпись, извлечённые копии не следует выдавать за подписанные экземпляры. Подпись охватывает определённый диапазон байтов и состояние документа; дополнительный startxref меняет файл. Для проверки подписанной ревизии используют инструменты валидации подписей и исходный контейнер.

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

Проверка отчётов, форм и аннотаций

У отчёта инкрементальные сохранения часто появляются после добавления колонтитулов, комментариев, закладок или подписи. Сводка помогает отличить массовое добавление страниц от небольшого служебного обновления. Затем извлечённые состояния сравнивают по числу страниц и контрольным текстовым фрагментам.

В интерактивной форме значения полей могут храниться в словарях виджетов и AcroForm, а внешний вид — в отдельных потоках appearance. Изменение введённого значения способно затронуть несколько объектов. Просмотрщик может показывать обновлённый вид, даже если значение и appearance расходятся, поэтому проверяют оба уровня.

Аннотации могут быть скрыты настройками просмотра или лежать за пределами страницы. Строка Annot в отчёте — повод перечислить аннотации структурным инструментом, а не только искать заметку глазами. Ссылка-аннотация также может содержать действие, не отображаемое как текст.

Сканированный документ обычно хранит страницы как изображения. Изменение одной страницы может создать новый поток изображения и ресурсы, поэтому текстового diff недостаточно. Сравнивают рендеры, размеры изображений и OCR отдельно.

Автоматизация обработки набора PDF

Поскольку команда принимает один файл, пакетную проверку строят в оболочке. Безопасный цикл должен правильно обрабатывать пробелы и специальные символы. В Unix-подобной среде можно использовать find input -type f -name '*.pdf' -print0 и читать нулевые разделители, передавая каждый путь в отдельный запуск.

Пакетный подсчёт редакций PDF в цикле оболочки

Для первичного реестра достаточно сохранить путь, SHA-256, размер и результат -q. Файлы с несколькими редакциями направляют на полный анализ. Такой двухэтапный процесс уменьшает объём журналов и не создаёт сотни выходных каталогов для одноразовых PDF.

Параллельный запуск допустим только в раздельных рабочих каталогах или с уникальными базовыми именами. Иначе процессы могут одновременно пытаться создать одинаковую папку -versions. Кроме того, массовый разбор недоверенных файлов лучше ограничивать по времени, памяти и размеру входа.

Код завершения нужно проверять отдельно от текста. Ошибка открытия, неверная сигнатура или существующий каталог должны помечать задание как неуспешное. Пустой журнал не равен успешному анализу.

Ошибки открытия и неверный PDF

Если путь не существует или процесс не имеет прав чтения, появляется сообщение Could not open file. Сначала проверяют текущий каталог, регистр букв, кавычки вокруг пути и права. В автоматическом задании полезно до запуска убедиться, что путь указывает на обычный файл, а не каталог, сокет или оборванную символическую ссылку.

Ошибки pdfresurrect для отсутствующего и неверного PDF

Сообщение is not a valid PDF означает, что в первых байтах не найдена подходящая сигнатура %PDF-. Расширение .pdf само по себе не достаточно. Файл мог быть HTML-страницей ошибки, пустым вложением, архивом, повреждённой загрузкой или документом с необычным длинным префиксом.

Программа допускает сигнатуру не строго в нулевой позиции, а в пределах начала файла, как разрешает спецификация. Тем не менее подозрительный префикс следует исследовать отдельно. Не стоит вручную добавлять строку %PDF-, чтобы пройти проверку: это не восстановит таблицы и объекты.

Если файл обрезан, разбор может завершиться ошибкой поиска startxref или xref. Сравнивают размер с исходной передачей, повторяют скачивание и проверяют конец файла на маркер завершения. Любое ручное восстановление делают на копии.

Сообщение об одной версии

Фраза There is only one version of this PDF появляется, когда найдена только одна валидная редакция. Без -w программа всё равно может вывести объекты первого состояния и итоговую сводку. С -w извлечение прежних состояний не имеет смысла, поэтому выполнение завершается без набора исторических копий.

Сообщение об одной версии PDF и сводка объектов

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

Если ожидались несколько редакций, проверяют, не анализируется ли пересохранённая копия вместо исходного вложения. Почтовая система, портал или сканер мог преобразовать файл. Сравнение хешей и размеров с отправителем часто объясняет расхождение.

Не следует искусственно создавать несколько сохранений и затем использовать их как эталон для исходного файла: разные редакторы формируют xref по-разному. Тестовый документ нужен только для проверки установленной команды.

Ошибка существующего каталога

При -w программа сначала проверяет папку с ожидаемым именем. Если она уже есть, выводится сообщение, что извлечение не будет выполнено. Это защитное поведение предотвращает перезапись, но также означает, что повторный запуск не обновит частично созданный набор.

Ошибка существующего каталога и повторное извлечение после переименования

Перед удалением каталога сравнивают его содержимое с текущим исходником. В папке могут быть результаты другого файла с таким же именем. Надёжный приём — создавать для каждого задания отдельный каталог, названный по хешу или идентификатору дела, и запускать команду внутри него.

Если предыдущий запуск завершился аварийно, папка может содержать только часть версий. Её переименовывают, сохраняют журнал ошибки и повторяют анализ в чистом месте. Смешивать старые и новые файлы нельзя, потому что номера версий совпадут.

После успешного запуска проверяют количество PDF и наличие summary. Только затем старый каталог можно удалить или архивировать согласно процедуре.

Недоступная пообъектная сводка

Объектная сводка отсутствует не только при xref-потоках. Она может быть пустой, если таблица не содержит разобранных записей или структура повреждена. Итоговое предупреждение сообщает о невозможности перечислить объекты, но не объясняет все причины автоматически.

Сначала смотрят, есть ли отдельная строка о potential cross reference streams. Затем проверяют PDF другим анализатором и валидатором. Если qpdf или mutool также сообщает повреждение xref, файл мог быть частично передан или намеренно сформирован с нестандартной структурой.

Нельзя считать пустую сводку доказательством отсутствия изменений. Это только отсутствие данных у выбранного метода. В отчёте формулируют именно ограничение разбора и перечисляют дополнительные проверки.

Переписывание файла инструментом ремонта может сделать объектную таблицу доступной, но новая копия уже не является исходным доказательством. Её результаты помечают как производные.

Экспериментальная очистка истории

В исходном коде присутствует экспериментальный режим scrub, который может быть включён при компиляции специальным флагом. Обычная справка его не показывает. Задача режима — занулять старые экземпляры изменённых и удалённых объектов, однако документация прямо предупреждает, что результат нельзя считать надёжной защитой и что PDF может перестать корректно отображаться.

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

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

Если сборка неожиданно принимает -s, это не означает, что функция стала пригодной для серьёзной санитарной обработки. Ограничение относится к самой концепции и требует внешней верификации.

Безопасность при разборе недоверенных файлов

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

Для большого набора файлов задают лимиты процессора, памяти и размера вывода. Повреждённая структура может вызвать долгий поиск, огромный журнал или аварийное завершение. Контейнер или виртуальная машина упрощает очистку среды после проверки.

Извлечённые версии остаются недоверенными PDF. Открытие в просмотрщике может активировать ссылки, сценарии, вложения или действия. Используют просмотрщик с отключёнными активными возможностями и актуальными исправлениями, а при необходимости рендерят страницы в изолированной среде.

Отчёт pdfresurrect сам по себе текстовый, но имена файлов и значения метаданных могут содержать управляющие символы. При включении в HTML, таблицу или журнал их экранируют, чтобы данные не стали разметкой или формулой.

Установка в Linux, macOS и других Unix-системах

В Debian и совместимых системах пакет устанавливают через менеджер пакетов, чтобы получить бинарник, man-страницу и контроль зависимостей. В Fedora и других RPM-системах используют пакет соответствующего репозитория. Во FreeBSD утилита доступна через коллекцию портов, а в macOS — через MacPorts. Название команды после установки остаётся pdfresurrect.

Перед анализом проверяют, какой бинарник будет запущен: command -v pdfresurrect. Затем вызывают справку и тестируют программу на безобидном PDF. Если в системе есть несколько копий, путь в автоматизации фиксируют явно, чтобы обновление PATH не поменяло исполняемый файл.

Сборка из исходного кода обычно использует стандартный цикл ./configure, make и установку с необходимыми правами. Для воспроизводимости записывают хеш архива и параметры компиляции. Экспериментальные флаги не включают без отдельной причины.

Windows не является основной средой поставки готовых пакетов. Практический вариант — использовать совместимую Unix-среду или виртуальную машину. Перенос неизвестного стороннего EXE повышает риск подмены и лишает преимуществ проверяемого репозитория пакетов.

Как читать коды завершения и журналы

Успешный обычный анализ завершается нулевым кодом. Ошибки открытия, неверный формат и конфликт выходного каталога должны обрабатываться как сбой. В оболочке сразу сохраняют $? или используют условие if pdfresurrect ...; then ...; else ...; fi.

Не все диагностические ситуации равны фатальной ошибке. Сообщение об одной версии может сопровождать корректный разбор. Предупреждение о xref-потоках тоже может завершиться итоговым числом. Автоматический классификатор должен учитывать и код, и ключевые строки, и наличие ожидаемых файлов.

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

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

Сравнение содержимого между версиями

Самый простой визуальный способ — отрендерить одинаковые страницы каждой версии в изображения с одинаковым разрешением и сравнить пиксели. Метод хорошо показывает текст, графику и положение объектов, но не обнаруживает невидимый текст, действия, вложения и метаданные.

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

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

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

Что программа не делает

pdfresurrect не редактирует текст и изображения на странице, не объединяет файлы, не переставляет страницы и не предоставляет визуальное окно. Для таких задач нужен PDF-редактор. Утилита также не показывает страницы самостоятельно: извлечённые файлы открывают отдельным просмотрщиком.

Она не является полноценным антивирусным анализатором. В отчёте видны типы объектов, но нет автоматического поиска JavaScript, уязвимостей, URL, вложений и обфускации на уровне peepdf. Подозрительный документ проверяют набором специализированных средств.

Она не гарантирует восстановление каждой логической правки. Только изменения, сохранённые как доступные инкрементальные секции с поддерживаемой структурой, становятся отдельными версиями. Автосохранение редактора вне PDF, облачная история и журнал системы не входят в файл.

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

Сравнение pdfresurrect с аналогами

Выбор зависит от цели: восстановить состояния, разобрать современные потоки, исследовать вредоносные объекты, исправить структуру или отредактировать страницы. У этих задач пересекаются входные форматы, но рабочий результат различается.

ПрограммаЛучше подходит дляГлавное ограничение
pdfresurrectБыстрого подсчёта и извлечения классических инкрементальных редакцийНе декодирует xref-потоки
PDF CommanderВизуального редактирования текста, страниц и объектовНе восстанавливает цепочку xref-редакций
qpdfПроверки, ремонта, нормализации и JSON-представления структурыНет готового набора прежних состояний одной командой
mutoolПросмотра объектов, потоков и очистки повреждённой структурыИсторию приходится исследовать вручную
peepdfИнтерактивного анализа версий, фильтров, объектных потоков и подозрительных элементовБолее сложная консоль и больше зависимостей
OrigamiСкриптового разбора, создания и изменения структуры PDF на RubyТребует программирования и не является просмотрщиком

Для обычного исправления страниц выбирают PDF Commander. Для точечного восстановления старых состояний с текстовыми xref удобнее pdfresurrect. Если документ использует современные потоки, повреждён или требует подробного объектного анализа, начинают с qpdf, mutool или peepdf. Origami подходит исследователю, которому нужны собственные сценарии разбора и модификации.

Практический сценарий: первичная проверка одного файла

Создайте рабочую папку, скопируйте в неё PDF и запишите SHA-256. Выполните pdfresurrect file.pdf -q. Если число больше единицы, сохраните полный вывод в журнал и отдельно вызовите -i. После этого примените -w, убедитесь в числе созданных состояний и в наличии summary.

Открывайте версии от ранней к поздней. Для каждой фиксируйте число страниц, заметные отличия, метаданные и интересующие номера объектов. Если отличие появилось между версиями 4 и 5, сосредоточьтесь на строках Version 5 и сравните указанные объекты структурным анализатором.

В конце сформируйте краткий вывод: сколько редакций распознано, какие состояния открылись, где появилось значимое изменение, какие ограничения разбора встретились. Не описывайте неподтверждённое содержимое как удалённое только на основании статуса D; покажите его в ранней версии или объекте.

Исходный PDF, журнал, summary и извлечённые файлы храните как единый набор. Переименование допустимо только с таблицей соответствия, иначе теряется связь между номерами и отчётом.

Практический сценарий: фильтрация сотен файлов

Для каталога документов сначала создают список входов с хешами. Затем последовательно запускают -q и записывают число редакций в CSV или JSON, экранируя имена. Файлы с ошибками помещают в отдельную очередь, а файлы с числом больше единицы — в очередь глубокого анализа.

Второй этап запускает полный отчёт без -w и считает типы изменений. Например, приоритет повышают документы, где в поздней версии есть Page, Stream, Annot или Catalog. Это эвристика, а не окончательное решение.

Третий этап извлекает только приоритетные документы в уникальные каталоги. Идентификатор каталога можно составить из первых символов хеша, чтобы одинаковые имена не конфликтовали. Перед каждым запуском проверяют свободное место: каждый набор версий близок по размеру к исходнику, поэтому объём быстро растёт.

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

Практический сценарий: проверка опубликованного PDF

Если нужно понять, не содержит ли публичный PDF прежнюю конфиденциальную редакцию, скачивают файл один раз, сохраняют хеш и отключают автоматическое обновление копии. Сначала считают версии, затем извлекают состояния в изолированной среде. Особое внимание уделяют редакциям до появления закрашенных областей, удалённых страниц и изменённых приложений.

Для каждой ранней версии рендерят страницы и извлекают текст. Если чувствительный фрагмент найден, проверяют, действительно ли он относится к публикации, а не к тестовому шаблону или вложению. Фиксируют страницу, редакцию и способ обнаружения, не распространяя содержимое шире ответственной команды.

Исправленный файл создают из проверенного состояния без истории, затем снова запускают -q, поиск текста, анализ аннотаций и вложений. Число один является только одним из контрольных признаков; итог принимают после независимых проверок.

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

Практический сценарий: исследование подписанного документа

В подписанном PDF каждая подпись может соответствовать определённой ревизии. pdfresurrect помогает увидеть количество обновлений и извлечь отображаемые состояния, но не проверяет криптографию. Сначала сохраняют исходник, затем отдельно получают сведения о подписях специализированной командой.

Номер редакции pdfresurrect и номер подписанной ревизии могут соотноситься, но это нужно доказать по диапазонам байтов и структуре. Добавление второй подписи, отметки времени или разрешённого изменения создаёт новые объекты. Статус M сам по себе не означает нарушение подписи.

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

Если после подписи появилась неожиданная редакция, исследуют новые объекты, допустимые изменения формы и словарь подписи. Вывод о подмене делают только после проверки валидности и политики подписи.

Практический сценарий: повреждённый документ

При повреждении сначала не запускают автоматическое исправление. Сохраняют копию, проверяют размер и конец файла. pdfresurrect может показать, что более ранняя таблица остаётся валидной, даже если поздняя секция обрезана. Тогда извлечённое раннее состояние помогает восстановить читаемую часть.

Если программа падает на поиске xref или не создаёт версии, используют qpdf с проверкой, mutool clean или другой инструмент ремонта на копии. После ремонта повторно сравнивают страницы и объекты с исходником. Ремонт может потерять историю, поэтому исходный файл остаётся основным материалом.

Иногда достаточно вручную определить старый startxref, но любое вмешательство должно быть воспроизводимым и документированным. pdfresurrect автоматизирует типовой случай, однако не заменяет полноценное восстановление сильно повреждённой структуры.

Успешное открытие ранней версии не гарантирует полноту. Проверяют все страницы, шрифты, изображения и вложения: нужный объект мог находиться только в повреждённой поздней секции.

Почему извлечённый файл может содержать более новые байты

Метод -w копирует исходный PDF целиком, а затем добавляет указатель на старую таблицу. Поэтому последующие секции физически остаются в файле после выбранной редакции. Обычный просмотрщик должен игнорировать их как неактуальные, но форензик-инструмент всё равно способен найти эти байты.

Это поведение объясняет большой размер ранней версии и показывает, почему её нельзя считать очищенной публикационной копией. Цель — заставить читатель показать прежнее состояние, а не вырезать всё, что появилось позже.

Для получения компактного производного файла выбранное состояние можно переписать другим инструментом в новый PDF, но тогда меняются структура, номера объектов, метаданные и возможные подписи. Производную копию помечают и не подменяют ею оригинал анализа.

При сравнении хешей нужно учитывать, что два файла, показывающие одинаковую раннюю страницу, могут иметь разные хвостовые данные. Сравнение рендеров и объектов информативнее общего SHA-256 для содержательного вывода.

Почему разные просмотрщики показывают разные результаты

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

Некоторые приложения кэшируют документ по пути и не перечитывают файл после замены. Закройте просмотрщик, очистите вкладку или используйте уникальное имя. Иначе можно принять закэшированную позднюю страницу за результат извлечения.

Рендерер может скрывать аннотации, поля или слои по умолчанию. Для сравнения задают одинаковые настройки: отображение комментариев, заполнение форм, масштаб, цветовой профиль и разрешение. Отличия настроек не должны превращаться в ложные изменения документа.

Если только один просмотрщик показывает раннюю версию, зафиксируйте его поведение и проверьте структуру таблицы. Не делайте вывод, что файл универсально читаем.

Как интерпретировать резкое изменение числа объектов

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

Снижение числа занятых объектов может отражать освобождение записей, но старые байты всё ещё остаются. Проверьте строки D и ранние состояния. Полное сохранение обычно разрушает цепочку и не отображается как обычное уменьшение внутри неё.

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

Линеаризация и xref-потоки искажают простое сравнение счётчиков. Перед выводом убедитесь, что обе версии разобраны одинаковым способом и что пообъектная сводка доступна.

Как работать с именами и путями в сценариях

Всегда заключайте переменную пути в двойные кавычки: pdfresurrect "$file" -q. Без кавычек пробелы и символы подстановки разобьют имя на несколько аргументов. Для обхода файлов используйте нулевые разделители, а не разбор вывода ls.

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

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

При переносе между системами учитывайте различия разделителей пути и регистра. Готовые бинарные пакеты ориентированы на Unix-подобные среды, где регистр имён значим.

Как документировать ограничения результата

В отчёте отдельно указывают, использовал ли файл текстовые xref или потоки, сколько редакций распознано, открылись ли извлечённые состояния и были ли предупреждения. Формулировка должна отличать отсутствие найденной истории от невозможности её разобрать.

Например, корректно написать: распознана одна редакция; по этому методу прежние состояния не обнаружены. Некорректно утверждать: файл никогда не редактировался. Аналогично предупреждение о xref-потоках означает ограничение пообъектного анализа, а не отсутствие объектов.

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

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

Ответы на частые вопросы

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

Почему ранняя версия почти такого же размера? Режим записи копирует весь исходный файл и перенаправляет конечный startxref на старую таблицу. Поздние байты остаются физически внутри копии.

Можно ли удалить историю ключом -s? Экспериментальный код не следует использовать как надёжную редактуру. Создайте новый проверенный документ и убедитесь независимыми средствами, что чувствительные данные отсутствуют.

Почему нет строк объектов? Наиболее частая причина — xref-поток, который программа распознаёт, но не декодирует. Также возможна повреждённая или пустая таблица.

Почему -w ничего не создал при одной версии? Прежних распознанных состояний нет, поэтому извлечение завершается. Обычная сводка первого состояния доступна без режима записи.

Можно ли анализировать зашифрованный PDF? Структурный разбор может увидеть часть таблиц, но содержимое и метаданные могут быть недоступны или неполны. Для полноценной проверки нужен пароль и инструмент с поддержкой шифрования.

Можно ли считать Version 1 оригиналом автора? Это самое раннее состояние, оставшееся в данном файле, но документ мог быть создан из другого файла, полностью пересохранён или преобразован до получения. Происхождение устанавливают по дополнительным данным.

Меняет ли обычный анализ исходник? Режимы чтения и извлечения оставляют оригинальный путь нетронутым; -w создаёт отдельные файлы. Всё равно контролируйте хеш и работайте с копией.

Чем открыть summary? Это обычный текстовый файл. Для поиска можно использовать редактор, grep, awk или скрипт, сохраняя исходную копию без правок.

Почему тип объекта не совпадает с ожидаемым? Тип определяется по доступному словарю и может быть общим или отсутствовать. Номер объекта проверяют другим структурным инструментом.

Итоговый порядок работы

Начните с неизменяемой копии и хеша, затем вызовите -q. При нескольких редакциях сохраните полный отчёт и метаданные, после чего выполните -w в пустом рабочем каталоге. Сверьте число файлов с итогом, откройте версии по порядку и сопоставьте отличия со строками A, M и D.

При предупреждении о xref-потоках переключитесь на peepdf, qpdf или mutool для объектного разбора, не переписывая оригинал. Для визуальных задач используйте PDF-редактор, а для проверки подписи — криптографический валидатор. Каждый инструмент отвечает на свой вопрос.

Не используйте извлечённые версии как очищенные документы и не полагайтесь на экспериментальную очистку для удаления секретов. После исправления создайте новый PDF и повторите проверку истории, текста, аннотаций, вложений и метаданных.

Полезный результат pdfresurrect — не просто число, а воспроизводимая цепочка: исходный хеш, команда, сводка объектов, набор состояний и подтверждённое содержательное отличие. Такой набор позволяет объяснить, что именно было найдено и где заканчиваются возможности метода.

Контрольный лист перед закрытием задания

Проверьте, что исходный хеш записан до открытия документа; команда и рабочий каталог зафиксированы; число редакций сохранено; полный вывод не обрезан; metadata-блоки привязаны к редакциям; каталог -versions был пуст до запуска; число извлечённых файлов совпало с отчётом; каждый файл открывается или имеет записанную ошибку.

Для значимых отличий укажите пару соседних состояний, страницу, номер объекта и метод подтверждения. Для неподдерживаемых xref-потоков запишите предупреждение и инструмент дополнительного анализа. Для линеаризованного файла отдельно отметьте возможную особенность подсчёта объектов.

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

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

Проверка непрерывности цепочки редакций

Последовательность состояний проверяют не только по количеству файлов. В полном отчёте номера редакций должны идти по порядку, а сводные строки — соответствовать созданным PDF. Если нумерация перескакивает, вывод обрезан или один файл не открывается, результат помечают как неполный и возвращаются к исходному журналу. Полезно также сравнить конечные значения startxref: каждое извлечённое состояние должно направлять просмотрщик к своей таблице, а не случайно повторять соседнюю.

Связь /Prev читается от самой поздней таблицы к более ранним. Поэтому физический порядок найденных маркеров в файле и логический порядок редакций не всегда удобно сравнивать глазами. pdfresurrect нормализует результат в нумерованный набор, но при повреждённом хвосте одна ссылка может вести за пределы файла или в середину объекта. В такой ситуации сохраняют предупреждение и подтверждают цепочку независимым структурным инструментом, не исправляя оригинал до завершения анализа.

Для каждой пары соседних состояний составляют короткую запись: число страниц, размер отображаемого документа, список статусов объектов и заметное пользовательское изменение. Такая матрица быстро выявляет аномалию: например, версия открывается так же, как предыдущая, хотя отчёт содержит новые объекты. Это может означать служебное обновление, изменение невидимой аннотации, поля формы, метаданных или ресурса, который текущая страница не использует.

Непрерывность цепочки не доказывает авторство отдельных правок. Она показывает только порядок структурных обновлений внутри конкретного файла. Чтобы связать редакцию с человеком или событием, сопоставляют время получения, цифровые подписи, поля Info, журналы системы и внешнюю переписку. Метаданные создателя рассматривают как подсказку, потому что их можно изменить и они не защищены криптографически.

Переход от номера объекта к содержательному отличию

Номер из строки summary служит координатой для следующего этапа. Сначала находят этот объект в двух соседних состояниях и сравнивают словари. У страницы проверяют ссылки /Contents, /Resources и /Annots; у каталога — формы, имена, метаданные и дополнительные действия; у потока — фильтры, длину и декодированное содержимое. Так статус M превращается из общего сигнала в проверяемое объяснение конкретного изменения.

Если изменился поток содержимого страницы, сравнение сырых сжатых байтов часто малоинформативно: другой уровень сжатия даёт полностью иной результат при одинаковой графике. Сначала декодируют фильтры, затем нормализуют пробелы и числовое представление команд, а визуальный рендер используют как независимую проверку. Для изображений сравнивают декодированный растр и параметры цветового пространства; для шрифтов учитывают, что подмножество может быть пересобрано без изменения видимого текста.

При изменении аннотации важно проверить не только прямоугольник и текст заметки. Словарь может содержать действие, ссылку, вложение, внешний вид, флаги печати и дату модификации. Виджет формы связан с полем через родительские объекты, поэтому одна пользовательская правка нередко распределена по нескольким номерам. Отчёт pdfresurrect помогает очертить набор, но смысл устанавливается после обхода ссылок.

Удалённый объект со статусом D подтверждают в раннем состоянии: он должен быть достижим из каталога или другой рабочей структуры и влиять на документ. Одинокие неиспользуемые байты могут быть остатком промежуточной записи и никогда не отображаться пользователю. В заключении различают три случая: объект был частью ранней версии, объект физически присутствует, но недостижим, либо тип и назначение объекта установить не удалось.

Расчёт места и управление производными файлами

Режим -w способен быстро занять значительный объём. Поскольку каждое состояние строится из полной копии входа с новым конечным указателем, файл размером 100 МБ и десятью редакциями потребует примерно гигабайт только для PDF, не считая рендеров и журналов. Перед пакетной обработкой оценивают произведение размера на число версий, добавляют резерв для временных операций и задают лимит рабочему тому.

Каталоги результатов именуют по хешу или уникальному идентификатору задания. Это предотвращает конфликт одинаковых базовых имён и позволяет проверить происхождение каждого набора. Рядом хранят манифест с исходным SHA-256, точной командой, кодом завершения, числом созданных файлов и их хешами. Если набор переносится, манифест помогает обнаружить потерю или случайную замену одной версии.

Удалять промежуточные копии можно только после того, как существенные различия задокументированы и сохранены необходимые доказательства. Простая очистка по возрасту опасна: раннее состояние может быть единственным местом, где видно удалённое приложение или формулировку. Для рутинной фильтрации разумно сначала хранить только счётчики и полные отчёты, а -w запускать для отобранных документов.

Производные PDF получают ограниченные права доступа. Ранние редакции часто содержат именно те данные, которые автор пытался удалить: персональные сведения, внутренние комментарии, старые цены или скрытые приложения. Архивирование результатов шифруют средствами хранилища, а передачу фиксируют. Эти меры относятся к рабочему процессу вокруг pdfresurrect и не зависят от того, открывается ли конкретная версия в обычном просмотрщике.

Особенности зашифрованных и частично повреждённых PDF

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

При наличии законного пароля безопаснее сделать отдельную расшифрованную производную копию специализированным инструментом и анализировать её параллельно с оригиналом. Расшифровка переписывает структуру и способна уничтожить исходную цепочку, поэтому нельзя заменять ею исходный файл. Сопоставление выполняют по страницам, объектам и известным значениям, сохраняя команды преобразования и хеши обеих копий.

Обрезанный хвост часто нарушает последний startxref, хотя ранняя таблица остаётся в доступной части файла. Если pdfresurrect не находит корректную точку входа, сначала исследуют конец файла и прежние маркеры вручную или средствами qpdf и mutool. Любой ремонт выполняют на копии: автоматический восстановитель может построить новую таблицу и тем самым скрыть исходную последовательность.

Частичное открытие версии не означает, что все её ресурсы целы. Страница может отображать текст, но терять изображение, встроенный шрифт или вложение, находившиеся в повреждённом диапазоне. Проверка включает рендер всех страниц, перечисление вложений, извлечение текста и контроль сообщений просмотрщика. В итоговом описании перечисляют, какие компоненты проверены, а какие остались недоступны.