Нативный C ABI в Linux
HotPDFLinuxABI.lpr собирает нативную разделяемую библиотеку x86_64 ELF с именем libhotpdf.so.1, SONAME libhotpdf.so.1 и публичными символами, привязанными к HOTPDF_1.0
Библиотека использует THPDFHeadlessDocument и рендеринг силами CPU и не тянет за собой Windows-компоненты, активный рабочий стол, просмотрщик PDF или процесс Python в рантайме; Python нужен только сборочным и приёмочным скриптам
Сборка и приёмочные тесты
sh Tests/Linux/Build-LinuxABI.sh
sh Tests/Linux/Run-LinuxABIAcceptance.sh
FPC_EXE=/usr/local/bin/fpc HPDF_LINUX_OUTPUT=Tests/Linux/bin/linux-abi331 sh Tests/Linux/Run-LinuxABIAcceptance.sh
Используйте нативный FPC 3.3.1 или новее с соответствующими юнитами FCL и paszlib, компилятором C, binutils, Fontconfig и установленными шрифтами TrueType; среде Python приёмки также нужны pypdf с его AES-провайдером, PyMuPDF, Pillow и NumPy
FPC_EXE, HPDF_LINUX_OUTPUT и PYTHON_EXE задают расположение инструментов; Python-окружение приёмочных тестов по умолчанию — /opt/hotpdf-python/bin/python
FPC обычно пишет анонимный export-блок в ответ линкеру ELF; сборка именует этот блок по закоммиченной карте символов до линковки, потому что второй именованный version script конфликтовал бы с анонимным блоком
Публичный интерфейс
Подключите Lib/hotpdf_abi.h ради раскладки общих записей и констант статусов; hpdf_abi_io_v1_size и hpdf_abi_operation_v1_size сообщают фактические нативные размеры записей
Linux-библиотека экспортирует обнаружение ABI, определение возможностей, создание и уничтожение документов, загрузку и сохранение через callback'и, подсчёт страниц, hpdf_document_execute_json_v1 и точку входа hpdf_document_compare_json_v1 для двух документов
Текущий набор операций узнавайте через hpdf_capabilities_json_to_io, а не считайте его равным набору операций Windows
| Операция | Поведение |
|---|---|
info | Количество страниц, полей форм и подписанных полей |
text.extract | Текст страницы в Unicode в JSON и опциональный вывод в UTF-8, с опциональным массивом pages с нумерацией с нуля |
forms.read | Полностью квалифицированные имена полей, значения в Unicode, полные выборы в списках, типы, флаги и максимальные длины |
forms.fill | Транзакционные обновления текста, списков, multiselect, checkbox и radio, подписи кнопок, согласованные appearances со встроенными шрифтами и инкрементальный вывод PDF |
annotations.export / annotations.import | Ограниченный обмен аннотациями XFDF с append-транзакциями, точным Unicode, бинарными потоками, ссылками popup/reply, шифрованием и политикой аутентифицированной сертификации |
forms.export / forms.import | Ограниченный обмен скалярными и rich FDF/XFDF с четырьмя реальными стилями на каждое выбранное настроенное rich-семейство, транзакции шифрованного PDF, перегенерированные appearances, политики подписи и синхронные фрагментированные callback'и |
render | Вывод PNG через Cairo со страницей, dpi, режимом использования view или print, опциями аннотаций и конфигурацией optional-content по умолчанию |
sign | Инкрементальное подписание PEM или PFX, существующие или вновь созданные поля, видимые appearances и сертификация, включая аутентифицированные входы AES-256 R5/R6 и опции дайджеста, метаданных, профиля и проверенных свидетельств |
signatures.verify | Реальная проверка CMS, длины подписанных ревизий, опциональная явная оценка доверия к CA и валидация подписанной информации об отзыве |
html.import | Нативное создание документов HTML/CSS с шрифтами Unicode, пагинацией, изображениями, гиперссылками и опциональными элементами управления AcroForm |
text.draw | Видимый или невидимый текст страниц Unicode с сохранением исходных потоков страниц и аутентифицированными шифрованными ревизиями |
ocr | Фактическое распознавание Tesseract с ограниченным временем жизни дочернего процесса, результатами по словам и опциональным searchable-слоем PDF |
pages.import | Импорты ресурсов выбранных страниц с независимым входным источником и транзакционными обновлениями назначения |
pdfa.convert | Растровое или текстово/векторное преобразование в PDF/A-4 с опциональным восстановлением шрифтов и требованиями валидации выбранного режима |
compare / compare.contract | Сравнение двух хэндлов: количество страниц, текст страниц, количество объектов, отрендеренные изображения, структурное и полное, плюс семантическое сравнение контрактов с подготовленным выводом для ревью в JSON, HTML или аннотированном PDF |
{"schemaVersion":1,"type":"render","page":0,"dpi":150,"usage":"print","annotations":false,
"limits":{"memoryBytes":268435456,"outputBytes":268435456,"pixels":100000000}}
Нативные сценарии подписания принимают явную идентичность PEM или Base64 PFX, опциональные новые поля подписи и appearances в Unicode, а также разрешения на сертификацию; успешное подписание заменяет загруженный контекст подготовленной подписанной ревизией, а неудачное подписание или публикация сохраняет исходный контекст
Нативные опции подписания связывают реальный выбор SHA256, SHA384 или SHA512, информацию подписи в Unicode, юридическую аттестацию, явные байты доверия, проверенные подписанные свидетельства отзыва, реальные пресеты appearance и заявленный приложением источник транспорта credential или timestamp
Опциональное состояние просмотрщика optional-content через неизменённые записи V1 передаёт явные автоматические применения usage View, Print или Export, зум, язык, контекст пользователя и локальные для операции ручные выборы
Операция render принимает usage: "view" или usage: "print" с умолчанием view; доступные варианты узнавайте через массив renderUsages в capability, записи V1 для callback'ов и операций не изменились
Флаги показа и печати аннотаций следуют выбранному usage, а annotations: false подавляет аннотации в любом режиме; пропуск optionalContent сохраняет статическую конфигурацию по умолчанию, тогда как явный объект активирует документированные автоматические рекомендации и локальные для операции ручные выборки
Tests/Linux/Run-LinuxABIRenderUsage.sh проверяет реальные пиксели PNG для обычных и AES R5/R6 источников, скрытый по умолчанию контент, сбои callback'ов, бюджеты, отмену и восстановление на том же хэндле; зависимости фикстур и опциональный каталог предгенерированных фикстур описаны в Tests/Linux/HeadlessRenderUsage.en-us.md
Callback'и и время жизни
Опции appearance форм принимают текст Unicode, export-значения или полные массивы выбранных значений, явные состояния кнопок, настройки шрифтов и транзакционные лимиты ресурсов
Callback'и чтения и записи могут возвращать частичные передачи; успешная передача обязана продвигаться хотя бы на один элемент и не превышать запрошенное количество
Все callback'и выполняются синхронно в вызывающем потоке, включая проверки отмены внутри разбора документа, рендеринга и криптографических контрольных точек
Входные данные callback'а копируются в монопольно созданный приватный временный файл с режимом 0600, поэтому input callback'и Linux и их user data должны оставаться валидными лишь до возврата вызова загрузки или execute
Операции над общим хэндлом документа сериализуются внутри; каждый активный вызов держит независимую ссылку, поэтому уничтожение хэндла из progress callback делает невозможным последующий доступ, но позволяет текущему вызову безопасно завершиться
Не выполняйте рекурсивно другую операцию на том же хэндле из его callback'а; держите разделяемую библиотеку загруженной, пока все вызовы не вернутся и каждый хэндл не будет уничтожен
Бюджеты и публикация
Входной JSON ограничен 4 МиБ и 64 уровнями вложенности; отвергаются неверный UTF-8, дублирующиеся члены, некорректные числовые лимиты и усечение параметров из Int64 в Int32
Сырой UTF-8 и Unicode-эскейпы несут одинаковые строковые значения, включая дополнительные символы в виде корректных суррогатных пар UTF-16; неспаренные суррогатные эскейпы приводят к отказу до мутации документа или публикации бинарных данных
Лимиты операции включают memoryBytes, outputBytes, resultBytes и pixels; лимиты документа применяются и к ранее загруженным хэндлам, а лимиты управляемой памяти и рендеринга не обещают потолка RSS процесса
Вывод PDF и PNG полностью готовится и проверяется до начала output callback'ов; принадлежащий вызывающему output callback может сохранить частичную передачу после собственного сбоя I/O, но неудавшаяся публикация бинарных данных или результата не фиксирует правки формы и не заменяет ранее загруженный контекст
Успешные мутации PDF фиксируют подготовленный вывод и как текущий документ, и как его приватный снимок источника, поэтому последующий импорт FDF или XFDF с теми же значениями возвращает ровно те же зафиксированные байты PDF с updated=0, сохраняя прежние заполнения форм, typed rich appearances, нарисованный текст и импортированные страницы
Приватные staging-файлы удаляются при замене или уничтожении контекста; успешный инкрементальный вывод форм и подписей сохраняет исходный префикс источника и политику шифрования
Подтверждение корректности
Опциональный ремонт шрифтов для архивов включает ограниченную подстановку и встраивание через Ghostscript с настоящей валидацией PDF/A-4 до callback'ов
Нативный аннотированный PDF для ревью добавляет к семантическому сравнению реальный подготовленный вывод PDF, выделения в Unicode и аутентифицированные разрешения на аннотации P3
Нативное сравнение контрактов даёт ограниченное семантическое сравнение двух хэндлов, HTML для ревью в Unicode и реальную геометрию строк источника
Общее нативное сравнение документов нормализует графы объектов и кодирование потоков, сравнивает реальные пиксели Cairo с явными порогами и сохраняет состояние документа и бюджеты публикации через callback'и
Приёмочный клиент проверяет реальные раскладки C-заголовков и поиск версионированных символов, частичные callback'и, 80 параллельных операций на общем хэндле, отмену, правки в Unicode, откат и подписание зашифрованных документов
Независимые читатели pypdf, MuPDF и OpenSSL проверяют реальные PDF, пиксели PNG, сохранность паролей, словари безопасности, ID документов, точные промежутки ByteRange, валидность подписей и отвержение изменённых подписанных байтов
Headless API документов · Нативный рендеринг · Оставшийся план поставки