Редактируемые диагностические документы и восстановление
SaveLoadedDocumentDiagnostic даёт детерминированный распакованный вывод для осмотра и контролируемого редактирования текста, а RepairDiagnosticDocument превращает отредактированный файл обратно в структурно корректный PDF
Рабочий процесс round-trip
- Загрузите документ и вызовите
SaveLoadedDocumentDiagnostic - Правьте словари объектов или несжатые байты stream, не пытаясь вручную поддерживать
/Length, строки xref илиstartxref - Вызовите
RepairDiagnosticDocumentс ограничивающими опциями - Изучите
THPDFDiagnosticRepairReportи используйте восстановленный файл, только если метод вернулTrue
Контракт восстановления
- Источник должен начинаться с PDF-заголовка и содержать маркер
%QDF-1.0, который записывает HotPDF - Прошедшие проверку косвенные объекты копируются в физическом порядке без перекодирования строк, словарей или содержимого stream
- Прямые, косвенные, отсутствующие и устаревшие значения stream
/Lengthзаменяются фактической длиной содержимого - Классическая таблица xref, канонический trailer и точное смещение
startxrefперестраиваются по измеренным позициям вывода - Trailer сохраняет корректные значения
/Info,/IDи/Encryptи привязывает/Rootк единственному проверенному Catalog - Целевой файл пишется через соседний временный файл и заменяет запрошенный путь только после успешного прохождения всех проверок
Строгий отказ
Восстановление завершается ошибкой при дублирующихся номерах объектов, нескольких или отсутствующих 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;