Редагувальні діагностичні документи та відновлення
SaveLoadedDocumentDiagnostic створює детермінований, розпакований вивід для інспекції та контрольованого текстового редагування, тоді як RepairDiagnosticDocument перетворює відредагований файл назад у структурно дійсний PDF
Процедура роботи за повним циклом
- Завантажте документ і викличте
SaveLoadedDocumentDiagnostic - Редагуйте словники об'єктів або байти нестиснених потоків без спроби вручну підтримувати
/Length, рядки xref абоstartxref - Викличте
RepairDiagnosticDocumentз обмеженими параметрами - Інспектуйте
THPDFDiagnosticRepairReportі використовуйте відновлену ціль лише тоді, коли метод повертаєTrue
Контракт відновлення
- Джерело має починатися з заголовка PDF і нести маркер
%QDF-1.0, створений HotPDF - Перевірені непрямі об'єкти копіюються у фізичному порядку без повторного кодування рядків, словників або корисних навантажень потоків
- Прямі, непрямі, відсутні та застарілі значення
/Lengthпотоків замінюються виміряною довжиною корисного навантаження - Класична таблиця xref, канонічний трейлер і точний зсув
startxrefперебудовуються з виміряних позицій виводу - Трейлер зберігає дійсні значення
/Info,/IDі/Encryptта прив'язує/Rootдо єдиного перевіреного Catalog - Ціль записується через сусідній тимчасовий файл і замінює запитуваний шлях лише після успіху всіх перевірок
Суворе відхилення
Відновлення закривається на збій для дубльованих номерів об'єктів, кількох або відсутніх об'єктів Catalog, зламаних посилань трейлера, некоментованих байтів між об'єктами, недійсної граматики об'єктів, меж об'єктів або введення, класичних зсувів xref ширших за десять цифр та збоїв суворої перевірки перезавантаження
Маркери всередині перевірених об'єктів пропускаються, тому текст, схожий на об'єкт, у рядках і закодованих корисних навантаженнях потоків не стає записом xref
Обмежена продуктивність
Сканер читає вікна по 1 МіБ з коротким переносом, копіює діапазони об'єктів безпосередньо між файловими потоками та зберігає лише перевірені метадані об'єктів плюс обмежені зонди словників
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;