Конвертация загруженного 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, но произвольное устройство или пользовательский поток могут отклонить его и сохранить частичную запись; когда публикация файла должна быть атомарной, используйте файловую точку входа
Опции и границы ресурсов
| Опция | По умолчанию | Смысл |
|---|---|---|
DPI | 150 | Запрошенное физическое разрешение, допустимый диапазон от 36 до 1200 |
MaxPages | 1000 | Максимум загруженных исходных страниц |
MaxPixelsPerPage | 40,000,000 | Максимум пикселей страницы и максимум пикселей отдельного исходного изображения |
MaxTotalPixels | 500,000,000 | Максимум накопленных выходных растровых пикселей |
MaxRasterBytes | 256 MiB | Максимум выделения растра для страницы или исходного изображения, консервативно проверяется по четыре байта на пиксель |
MaxOutputBytes | 256 MiB | Максимальный размер подготовленного PDF, применяется до выделения потоков и записи |
MaxDecodedStreamBytes | 64 MiB | Ограничивает каждую цепочку фильтров, суммарный preflight содержимого каждой страницы, отдельные нативные колбэки чтения потока, отдельные закодированные потоки исходных изображений и нативный валидатор вывода |
MaxTotalDecodedBytes | 256 MiB | Ограничивает дополнительную работу нативных фильтрующих декодеров за конвертацию, суммарный preflight содержимого по страницам и накопленные нативные колбэки чтения потока по страницам |
MaxInputObjects | 200,000 | Максимум уже загруженных косвенных объектов |
CancellationToken | nil | Заимствованный токен, проверяется до работы, во время нативного рендеринга и декодирования и перед публикацией |
Checkpoint | nil | Заимствованный синхронный колбэк, вызывается с 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, отклоняются до нативного декодирования
Эти проверки ограничивают известные профили заголовков и выделений памяти, принимаемые этим конвертером, и не обещают полную песочницу памяти процесса для каждого нативного декодера
Потеря информации и качества
- Векторное содержимое, шрифты, прозрачность и цветовые пространства источника превращаются в RGB-пиксели страницы; увеличенный DPI улучшает визуальную детализацию, но наращивает расход памяти и размер файла
- Выходной текст нельзя искать или выделять, а текстовый слой или OCR-вывод не синтезируются
- Аннотации, внешние виды аннотаций, поля форм, внешние виды виджетов и видимые внешние виды подписей опускаются, а не запекаются в растр страницы
- Цифровые подписи, встроенные файлы, скрипты, действия, закладки, слои как интерактивные элементы управления, структурные теги и исходная идентичность документа не сохраняются
- Результат не сохраняет векторную редактируемость, исходную валидность подписей, доступность PDF/UA или семантику документа-источника
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