Редактируемые диагностические документы и восстановление

SaveLoadedDocumentDiagnostic даёт детерминированный распакованный вывод для осмотра и контролируемого редактирования текста, а RepairDiagnosticDocument превращает отредактированный файл обратно в структурно корректный PDF

Рабочий процесс round-trip

  1. Загрузите документ и вызовите SaveLoadedDocumentDiagnostic
  2. Правьте словари объектов или несжатые байты stream, не пытаясь вручную поддерживать /Length, строки xref или startxref
  3. Вызовите RepairDiagnosticDocument с ограничивающими опциями
  4. Изучите THPDFDiagnosticRepairReport и используйте восстановленный файл, только если метод вернул True

Контракт восстановления

Строгий отказ

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

Маркеры внутри проверенных объектов пропускаются, поэтому похожий на объекты текст в строках и закодированном содержимом stream не превращается в запись xref

Ограниченная ресурсоёмкость

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

MaxInputBytes, MaxObjectCount и MaxObjectNumber ограничивают сканирование, объём хранимых метаданных и число записей xref до публикации вывода

Пример на Pascal

var
  Options: THPDFDiagnosticRepairOptions;
  Report: THPDFDiagnosticRepairReport;
begin
  Options := THPDFDiagnosticRepairOptions.Default;
  Options.MaxInputBytes := Int64(16) * 1024 * 1024 * 1024;

  if not THotPDF.RepairDiagnosticDocument(
    'edited-diagnostic.pdf',
    'repaired.pdf',
    Options,
    Report
  ) then
    raise Exception.Create(string(Report.Diagnostic));
end;

Связанные API