Загруженный 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 поддерживает произвольный текст встроенного шрифта, уже корректно представленный в этом 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

Смежные темы

Растровая архивная конвертация предоставляет отдельный профиль с явной потерей исходного текста и векторов, когда поддерживается нативный рендеринг