Загруженный PDF в PDF/A-4 с сохранением текста и векторов
HPDFArchivalConversion предлагает профиль сохранения для загруженных документов, чьи видимые шрифты, цветовые пространства и ресурсы рендеринга могут удовлетворить PDF/A-4 без замены содержимого страниц
Конвертер сохраняет исходные текстовые операторы, векторные пути, изображения, геометрию страниц и существующие текстовые слои OCR, разворачивает видимые normal-appearance аннотаций и виджетов в векторные Form XObjects, чинит поддерживаемые проблемы метаданных и структуры и валидирует сериализованный результат до публикации
Этот профиль никогда не растеризует страницу: RasterizedPages остаётся нулём, в том числе когда OCR рендерит временный битмап для распознавания и дописывает невидимый поисковый текст
Приёмочные тесты рантайма покрывают Delphi Win32 и Win64; Windows FPC компилирует реализацию из свежих исходников, а сгенерированные публичные заголовки компилируются C++Builder Win32 и Win64x
Точки входа
function HPDFConvertLoadedToPDFA4Preserving(Source: THotPDF;
Destination: TStream; const SRGBProfile: TBytes;
const Options: THPDFArchivalPreservationOptions;
out Report: THPDFArchivalPreservationReport): Boolean;
function HPDFConvertLoadedToPDFA4PreservingFile(Source: THotPDF;
const TargetFileName: string; const SRGBProfile: TBytes;
const Options: THPDFArchivalPreservationOptions;
out Report: THPDFArchivalPreservationReport): Boolean;
Сначала загрузите источник, держите живым любой входной поток, принадлежащий вызывающему, и предоставьте конвертеру монопольный доступ к документу на время операции
Options := THPDFArchivalPreservationOptions.Default;
if not HPDFConvertLoadedToPDFA4PreservingFile(Source, TargetFileName,
SRGBProfile, Options, Report) then
raise Exception.Create(Report.Conversion.Diagnostic);
Доказательство сохранности
Конвертер снимает копию текущего отредактированного графа источника под графовой транзакцией и откатывает источник после сериализации, а всю работу по конвертации ведёт на независимом загруженном клоне
Исходные декодированные потоки содержимого страниц обязаны остаться побайтово идентичными и достижимыми со своих исходных страниц в исходном порядке после перезагрузки вывода
Деревья ресурсов страниц и сохранённых normal-appearance обходятся с лимитами на объекты и рекурсию; встроенные шрифтовые программы, карты ToUnicode, изображения, ICC-профили и вложенные Form XObjects сохраняют исходные закодированные данные — они проверяются потоковым SHA-256 и на сохранение достижимости со страниц вывода
Независимые потоки содержимого обрамляют исходные операторы страниц охранными графическими состояниями и содержат дописанные операторы appearance, минуя нативный путь дописывания в единственный поток, который переписал бы исходный поток содержимого
TextAndVectorContentPreserved становится true только после успешной нативной валидации вывода и проверок сохранности; сбрасывается при неудаче конвертации или файловой публикации
Работа с appearance
- Видимые normal-appearance
AP/Nотображаются из Form BBox и Matrix в Rect аннотации средствами нативного разворачивания аннотаций с сохранением их собственных шрифтов и ресурсов - Флаги Invisible, Hidden и NoView запрещают отрисовку, даже если normal-appearance существует; Popup-аннотации удаляются без отрисовки
- Ссылки без рамки и без normal-appearance удаляются без отрисовки только когда явно заданная рамка нулевой ширины подтверждает отсутствие видимой границы
SynthesizeMissingAppearancesпо умолчанию true и вызывает нативную генерацию appearance разметки или поля; неподдерживаемые подтипы, неверные прямоугольники или неудачная генерация отвергают конвертацию- Отсутствующие текстовые appearance поддерживают значения ASCII с совместимой нативной кодировкой шрифта; шестнадцатеричные, Unicode или замаскированные текстовые значения требуют явного normal-appearance
- Синтезированные текстовые appearance сверяются с исходными значениями в перезагруженном поисковом тексте после нормализации пробелов; несовместимая кодировка шрифта отвергает публикацию
Наличие существующего normal-appearance поддерживает произвольный текст встроенного шрифта, уже корректно представленный в этом appearance, включая Unicode; конвертер сохраняет этот appearance вместо подстановки системного шрифта
Разворачивание убирает интерактивность аннотаций, редактируемые поля, вычисления, действия и поля подписи, сохраняя видимые appearance; каждая затронутая аннотация и каждый синтезированный appearance дают запись потери со страницей-источником, индексом аннотации и номером объекта, если они доступны
Цвет, шрифты и явные потери
Обязательный ICC-аргумент — sRGB matrix/TRC профиль, принимаемый существующим архивным валидатором; каждый существующий output-профиль обязан иметь ровно те же декодированные байты, что и переданный профиль, иначе конвертация отвергается, чтобы не переинтерпретировать существующее условие вывода
Конвертер добавляет sRGB output intent для PDF/A только при необходимости, синхронизирует реальный сериализатор с заголовком PDF 2.0 и вызывает ограниченный ремонт базовых метаданных и структуры PDF/A-4
Он не встраивает отсутствующие видимые шрифтовые программы, не перекодирует исходный текст, не перекрашивает операторы DeviceCMYK, не заменяет существующее условие вывода и не сплющивает прозрачность страниц в битмап; неразрешённые находки нативного preflight отвергают публикацию
Зашифрованные источники нужно расшифровать до конвертации; поля подписи требуют явного AllowSignatureInvalidation, а существующие встроенные файлы — явного RemoveEmbeddedFiles, поскольку профиль нацелен на базовый PDF/A-4
Losses также сообщает об аннулировании подписей, удалении встроенных файлов, удалении устаревших словарей Info и удалении запрещённых метаданных catalog или presentation
Существующий XMP сохраняется, когда это поддерживается; при генерации метаданных переносятся поддерживаемые сведения title, author, subject и keywords, а выживание произвольных устаревших полей Info не гарантируется
OCR и бюджеты
AddOCRToImagePages по умолчанию false; при включении распознаются страницы без извлекаемого текста и дописывается невидимый текст без замены исходного содержимого и существующих слоёв OCR
Задайте OCREngine движок приложения или оставьте nil для встроенного ограниченного ASCII OCR-движка, чьё покрытие языков и типографики остаётся как у встроенного профиля распознавания
OCROptions управляет разрешением распознавания и бюджетами слов, а конвертер принудительно включает skip-pages-with-text, сохранение существующих слоёв OCR и отказ от новой группы optional-content
Limits берёт THPDFArchivalConversionOptions.Default для количества страниц, количества объектов, байтов подготовленного вывода, работы с отдельным потоком, кумулятивной работы с потоками, отмены и синхронных контрольных точек; лимиты растровых пикселей применяются, только когда OCR рендерит битмапы для распознавания
Дополнительные умолчания: 1 024 записи потерь, 1 048 576 кодовых единиц извлечённого или ожидаемого текста и 4 000 000 токенов содержимого на проход нативной валидации
Хеширование полезных данных ресурсов считает закодированные байты против тех же бюджетов работы с потоками; и проверка источника, и проверка вывода расходуют кумулятивную работу, поэтому большим коллекциям сканов может понадобиться явно увеличенный MaxTotalDecodedBytes, хотя верификация ресурсов использует фиксированный хеш-буфер 64 КиБ
Бюджеты применяются после загрузки источника и ограничивают снимки конвертера и подготовленный вывод по отдельности; при приёме недоверенного ввода настройте лимиты загрузчика
Публикация и валидация
Stream API требует пустого seekable-назначения в позиции ноль и отвергает алиасы источника; подготовленные байты копируются только после успешных перезагрузки, нативной валидации, проверок сохранности и проверок отмены
Сбой записи в назначение запускает сброс «по максимуму усилий»; произвольный пользовательский поток может этот сброс отвергнуть, поэтому для атомарной файловой публикации используйте файловую точку входа
Файловый API проверяет алиасы источника, создаёт монопольный временный файл рядом с целью, сбрасывает его на диск и заменяет цель через MoveFileEx только после прохождения всех проверок; более ранние сбои сохраняют существующую цель и удаляют временный файл
InitialValidationIssues, Repair, Conversion.ValidationIssues, детали OCR, счётчики потоков, счётчики извлечённого текста и явные потери остаются доступны для осмотра
Нативная валидация покрывает поддерживаемые правила HotPDF для PDF/A-4 и не является тотальной сертификацией произвольных PDF; приёмочная регрессия дополнительно использует независимые проверки pypdf и MuPDF плюс валидацию veraPDF PDF/A-4 на сгенерированных appearance и нативных OCR-артефактах
Регрессия на реальном корпусе включает руководства Word и библиотеки со встроенными шрифтами и 380-страничную коллекцию китайских сканов, а торговый отчёт с невстроенными шрифтами и содержимым DeviceCMYK — явный случай отвержения
Команды регрессии
powershell -File Tests/Delphi/Run-ArchivalPreservationTests.ps1 -Platform Win32
powershell -File Tests/Delphi/Run-ArchivalPreservationTests.ps1 -Platform Win64
python Tests/Delphi/Fixtures/ArchivalPreservation/verify_preserving_output.py
verapdf --format xml --flavour 4 Tests/Delphi/generated/ArchivalPreservation/appearance.pdf Tests/Delphi/generated/ArchivalPreservation/ocr.pdf Tests/Delphi/generated/ArchivalPreservation/native-appearance.pdf
Delphi-раннер подавляет запуск просмотрщика и включает фикстуры регрессии и сохранения, и существующего растра; независимая приёмка veraPDF использует реальный профиль валидации PDF/A-4
Смежные темы
Растровая архивная конвертация предоставляет отдельный профиль с явной потерей исходного текста и векторов, когда поддерживается нативный рендеринг