Конвертация загруженного PDF в растровый PDF/A-4

HPDFArchivalConversion создаёт новый документ PDF/A-4 из видимого содержимого страниц загруженного документа THotPDF, используя строгий нативный рендеринг и переданный профиль sRGB ICC

Каждая выходная страница содержит сжатое без потерь RGB-растровое изображение с запрошенным DPI, при этом исходные видимые размеры, кадрирование, поворот и UserUnit отражаются в геометрии выходной страницы

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

Точки входа

function HPDFConvertLoadedToPDFA4Raster(Source: THotPDF;
  Destination: TStream; const SRGBProfile: TBytes;
  const Options: THPDFArchivalConversionOptions;
  out Report: THPDFArchivalConversionReport): Boolean;

function HPDFConvertLoadedToPDFA4RasterFile(Source: THotPDF;
  const TargetFileName: string; const SRGBProfile: TBytes;
  const Options: THPDFArchivalConversionOptions;
  out Report: THPDFArchivalConversionReport): Boolean;

Сначала загрузите документ-источник и держите принадлежащие вызывающему коду входные потоки живыми, пока исходный документ не уничтожен

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

При сбое конвертации, рендеринга, валидации, отмены или публикации существующий целевой файл сохраняется, а временный вывод удаляется

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

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

Опции и границы ресурсов

ОпцияПо умолчаниюСмысл
DPI150Запрошенное физическое разрешение, допустимый диапазон от 36 до 1200
MaxPages1000Максимум загруженных исходных страниц
MaxPixelsPerPage40,000,000Максимум пикселей страницы и максимум пикселей отдельного исходного изображения
MaxTotalPixels500,000,000Максимум накопленных выходных растровых пикселей
MaxRasterBytes256 MiBМаксимум выделения растра для страницы или исходного изображения, консервативно проверяется по четыре байта на пиксель
MaxOutputBytes256 MiBМаксимальный размер подготовленного PDF, применяется до выделения потоков и записи
MaxDecodedStreamBytes64 MiBОграничивает каждую цепочку фильтров, суммарный preflight содержимого каждой страницы, отдельные нативные колбэки чтения потока, отдельные закодированные потоки исходных изображений и нативный валидатор вывода
MaxTotalDecodedBytes256 MiBОграничивает дополнительную работу нативных фильтрующих декодеров за конвертацию, суммарный preflight содержимого по страницам и накопленные нативные колбэки чтения потока по страницам
MaxInputObjects200,000Максимум уже загруженных косвенных объектов
CancellationTokennilЗаимствованный токен, проверяется до работы, во время нативного рендеринга и декодирования и перед публикацией
CheckpointnilЗаимствованный синхронный колбэк, вызывается с sender = nil в контрольных точках конвертации и нативных ресурсов; не входите повторно в исходный документ

Лимиты декодирования считают работу декодеров и могут повторно списать тот же фильтрованный поток во время preflight, компиляции display-list и рендеринга; увеличение бюджета — явное решение вызывающего кода

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

Границы конвертации применяются после загрузки источника; при приёме недоверенного ввода настройте собственные лимиты ресурсов загрузчика

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

Предоставьте конвертеру монопольный доступ к документу-источнику, пока он временно применяет эти настройки

Рендеринг и цвет

Каждая страница должна отрендериться без нативной диагностики fallback, отброшенной диагностики или сбоя из-за отсутствующего ресурса; неподдерживаемое содержимое отклоняет конвертацию вместо публикации неполной страницы

Аргумент ICC должен описывать sRGB с распознаваемым представлением matrix/TRC, стандартными основными цветами, адаптированными к D50, и передаточной функцией IEC sRGB; нерелевантные RGB-профили, CMYK-профили, повреждённые профили и профили на основе LUT отклоняются

Вывод объявляет sRGB OutputIntent и XMP-метаданные PDF/A-4; настроенный на источнике пользовательский ICC-конвейер цветопробы или вывода отклоняется, потому что его настройки декодера изображений нельзя безопасно переинтерпретировать как sRGB

Сборка FPC требует нативного кодек-моста с доступным LittleCMS и отклоняет конвертацию, когда этот бэкенд управления цветом отсутствует

У потоков изображений JPEG и JPX, включая закодированные inline-изображения, фактические размеры кодопотока проверяются до нативного декодирования пикселей и должны совпадать со словарём изображения PDF

JPEG принимает ограниченные заголовки 8-битных baseline, extended sequential и progressive; JPX принимает ограниченные заголовки J2K SIZ и JP2-боксы обычной длины с не более чем четырьмя компонентами и точностью компонент не более 16 бит

Закодированные кодеки получают дополнительный консервативный рабочий бюджет 64 байта на исходный пиксель, а метаданные тайлов JPX ограничены и MaxInputObjects, и 1024 байтами на тайл внутри MaxRasterBytes; дефолтный растровый бюджет 256 MiB поэтому допускает не более 4,194,304 закодированных исходных пикселей, и вызывающий код может явно увеличить его для больших изображений

Конвертация JBIG2 отклоняется, потому что её внутренние выделения регионов и символов нельзя ограничить через доступный API заголовков; нетерминальные кодеки изображений, JP2-боксы расширенной длины, неподдерживаемые обёртки и обёрнутые кодек-потоки с DecodeParms тоже отклоняются

Параметры факса CCITT должны сохранять объявленные положительные размеры изображения; переопределения DecodeParms.Columns и Rows, расходящиеся со словарём, включая неизвестное Rows=0, отклоняются до нативного декодирования

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

Потеря информации и качества

THPDFArchivalConversionReport сообщает состояние успеха и отмены, счётчики исходных и отрендеренных страниц, растровые пиксели, выходные байты, количество удалённых аннотаций/форм/вложений, диагностику сбоя и находки нативной валидации

FailureKind различает afkNone, afkConversion, afkBudget и afkCancelled; типизированные сбои бюджета конвертера также передают BudgetMetric, BudgetObserved и BudgetLimit

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

Операция archive.pdfa4.raster в JSON и C ABI требует явного принятия потери информации, сохраняет хэндл источника, доставляет проверенный PDF и отчёт о потерях и применяет консервативные лимиты бюджета задачи

Проверка соответствия

Конвертер перечитывает свой подготовленный вывод и перед публикацией требует ValidatePDFA4 с базовым профилем PDF/A-4; нативный валидатор покрывает свой документированный ограниченный набор правил и не является доказательством выполнения всех требований ISO 19005-4

Для независимой приёмки можно взять veraPDF с --flavour 4; регрессионная фикстура с невстроенным текстом, прозрачностью, RGB-изображением, ссылкой, виджетом подписи и вложением прошла veraPDF 1.30.2 без проваленных правил и проверок

Запустите Tests/Delphi/Run-HotPDFArchivalTests.bat — это сфокусированный регрессионный набор без GUI