Руководство по Preflight

В этом руководстве методы API и демо-программы Preflight сгруппированы в практические рецепты. Используйте справочник API, когда вам нужны точные сигнатуры; используйте эту страницу, когда вам нужен рабочий путь для приложения, сценария сборки или задачи CI

Выбор формата вывода

var
  PDF: THotPDF;
begin
  PDF := THotPDF.Create(nil);
  try
    PDF.SavePreflightReport('Input.pdf', 'Input.preflight.txt');
    PDF.SavePreflightReport('Input.pdf', 'Input.preflight.json', '', pfJSON);
    PDF.SavePreflightReport('Input.pdf', 'Input.preflight.html', '', pfHTML);
    PDF.SavePreflightReport('Input.pdf', 'Input.preflight.csv', '', pfCSV);
  finally
    PDF.Free;
  end;
end;

Текстовый вывод стабилен по байтам и удобен для сравнения. JSON подходит для конвейеров данных. HTML автономен, его можно открывать напрямую или сохранять как артефакт CI. CSV использует стабильные столбцы для электронных таблиц и пакетных отчетов

Валидация документов PDF/VT

var
  PDF: THotPDF;
  Report: AnsiString;
begin
  PDF := THotPDF.Create(nil);
  try
    if not PDF.ValidatePDFVT('Input.pdf', Report) then
      WriteLn(string(Report));
  finally
    PDF.Free;
  end;
end;

Отчет PDF/VT фокусируется на идентификации ISO 16612-2 и структуре частей документа: XMP GTS_PDFVTVersion в тексте элемента или в форме атрибута RDF, соответствии даты изменения, базовом маркере PDF/X, намерении вывода, DPartRoot, DPartRootNode, NodeNameList и покрытии DPart на уровне страницы

Применение профиля

var
  PDF: THotPDF;
  Report: AnsiString;
begin
  PDF := THotPDF.Create(nil);
  try
    Report := PDF.CreatePreflightReportWithProfile(
      'Input.pdf', '', 'project-preflight.ini', pfJSON);
  finally
    PDF.Free;
  end;
end;

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

Создание повторно используемого профиля из предустановки

var
  PDF: THotPDF;
  Profile: THPDFPreflightProfile;
begin
  PDF := THotPDF.Create(nil);
  try
    Profile := PDF.GetBuiltInPreflightProfile('compact');
    Profile.DisableWarnings := 'OpenAction,JavaScript,URIAction';
    PDF.SavePreflightProfile(Profile, 'compact-no-actions.ini');
  finally
    PDF.Free;
  end;
end;

Используйте MergePreflightProfiles для объединения предустановки с именами проекта. Используйте DiffPreflightProfiles для просмотра дрейфа профиля перед обновлением общего файла конфигурации

Архивирование отчета вместе с PDF

PDF.EmbedPreflightReportInPDF('Input.pdf', 'Input-with-report.pdf');
PDF.EmbedPreflightReportAsXMP('Input.pdf', 'Input-with-xmp-report.pdf');

Текстовый путь встраивания добавляет читаемый блок комментариев после финального маркера EOF. Путь XMP добавляет полезную нагрузку в формате RDF для архивных процессов, сканирующих пакеты метаданных

Валидация встроенного отчета

var
  OriginalReport: AnsiString;
  CurrentReport: AnsiString;
begin
  if not PDF.LoadAndValidatePreflightReport(
    'Input-with-report.pdf', OriginalReport, CurrentReport) then
    WriteLn(string(PDF.ComparePreflightReports(OriginalReport, CurrentReport)));
end;

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

Запуск консервативного прохода исправления

var
  RepairsApplied: AnsiString;
begin
  if PDF.RepairPDFFromPreflightReport(
    'Broken.pdf', 'Broken-repaired.pdf', RepairsApplied) then
    WriteLn(string(RepairsApplied));
end;

Вспомогательный метод исправления намеренно имеет узкую область действия. Он обрабатывает лишние байты после финального маркера EOF и отсутствующие маркеры EOF, но не перестраивает таблицы перекрестных ссылок и не перезаписывает потоки

Объединение множества отчетов

Reports[0] := PDF.CreatePreflightReport('A.pdf');
Reports[1] := PDF.CreatePreflightReport('B.pdf');
Summary := PDF.AggregatePreflightReports(Reports);

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

Использование утилиты командной строки

HotPDFPreflight Input.pdf -f json -o reports
HotPDFPreflight Input.pdf --pdfvt -o reports
HotPDFPreflight C:\Archive -r --preset compact -f text -o reports --aggregate reports\Aggregate.txt
HotPDFPreflight C:\Archive -r --profile project-preflight.ini -f html -o reports

Интерфейс командной строки повторяет рабочий процесс библиотеки: ввод одного файла или рекурсивный обход директории, вывод в текстовом формате, JSON или HTML, необязательный пароль, необязательный профиль, встроенная предустановка, подробный ход выполнения и общая сводка

Создание статического дашборда

PreflightDashboard C:\Archive C:\Archive\preflight-dashboard

Демо-программа дашборда записывает index.html и отчеты HTML для каждого файла. Веб-сервер не требуется, поэтому вывод можно опубликовать как статический артефакт

Адаптация для потребителей JSON в стиле veraPDF

Report := PDF.CreatePreflightReport('Input.pdf');
JSON := PDF.ConvertPreflightReportToVeraPDFStyle(Report);

Адаптер сохраняет семантику HotPDF, преобразуя ошибки в привычную структуру результатов валидации для инструментов, которые уже используют JSON в стиле veraPDF

Связанные разделы