Native Linux and macOS

Сборки под Windows 11 ARM64 и Delphi ARM64EC описаны на странице Windows on ARM

Нативный бэкенд FPC поддерживает работу библиотеки без GUI на Linux и macOS, где отдельные цели x64 и ARM64 дают настоящие программы ELF и Mach-O; Delphi собирает динамические библиотеки macOS без GUI под обе архитектуры

Используйте существующий API TPDFlib для создания PDF, сохранения и загрузки, извлечения и редактирования текста, структурированного извлечения, переносимых колбэков OCR, растрового рендеринга, метаданных, шифрования, доступа к сетевым диапазонам и нативной подписи PFX

Матрица нативных платформ

ПлатформаНативное окружениеМаршрут сборки
Linux x64Ubuntu WSL 2 или физический x64-хост с LinuxFPC x86_64-linux
Linux ARM64Хост или виртуальная машина с Linux на ARM64, включая MultipassFPC aarch64-linux
macOS x64Mac на IntelНативный FPC x86_64-darwin или Delphi OSX64
macOS ARM64Mac на Apple SiliconНативный FPC aarch64-darwin или Delphi OSXARM64

Используйте FPC 3.3.1 с соответствующими RTL и пакетами и целью, совпадающей с операционной системой и архитектурой вашего приложения

Зависимости времени выполнения

ПровайдерБиблиотекаНазначение
OpenSSL 3libcryptoAES CBC/GCM, дайджесты, идентичности PKCS12, подписи CMS, целостность и явные цепочки привязок доверия
libcurllibcurl с асинхронным DNSHTTP/HTTPS, ограниченный бинарный транспорт, доступ к диапазонам и запросы RFC 3161
CairolibcairoРастровые поверхности изображений, пути, отсечение, контуры глифов и изображения
FontconfiglibfontconfigРеальное сопоставление нативных файлов шрифтов, включая явную подстановку семейств
libxml2Системный libxml2 на macOSРазбор XMP XML в Delphi, редактирование с учётом пространств имён и сериализация
OpenJPEG 2libopenjp2Декодирование и кодирование JPEG 2000

Linux x64 и ARM64 загружают системные библиотеки по SONAME, соответствующим архитектуре; macOS ARM64 по умолчанию берёт библиотеки из /opt/homebrew, macOS x64 — из /usr/local, и обе используют системные libcurl и libxml2

Отсутствующие библиотеки или символы и неподдерживаемые операции дают явные сбои; замена контекста устройства Windows не используется

Подписи и штампы времени

Провайдер PFX по умолчанию поддерживает настоящие идентичности RSA и EC, отсоединённые CMS, CAdES и устаревшие присоединённые профили SHA1; проверка сверяет байты ByteRange PDF и подпись CMS

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

ApplyPAdESSignatureTimeStamp использует настроенный нативный HTTP-транспорт по умолчанию, чтобы получить и прикрепить настоящий токен RFC 3161; заранее зарезервируйте достаточную ёмкость /Contents до исходной подписи

Проверка штампа времени сверяет подписанный токен, отпечаток сообщения, исключительный критический EKU timeStamping, имя TSA, опциональные ожидаемые policy/nonce и доверенную цепочку сертификатов на момент генерации токена

Штампы времени документа также проверяют фактический отпечаток ByteRange PDF; вызывающий может использовать существующий passthrough-сценарий DocTimeStamp и передать токен сам

Метаданные и рендеринг

XMP-провайдеры FPC и Delphi под macOS используют настоящие DOM с учётом пространств имён и сохраняют несвязанные свойства при правках; Delphi использует системные парсер и сериализатор libxml2

DTD-объявления отклоняются XML-читателем независимо от кодировки источника; входные и декодированные символы ограничены, а потоковый проход ограничивает глубину и события узлов до построения DOM

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

Нативное встраивание шрифтов семейств разрешает фактический файл Fontconfig и встраивает полную автономную программу TrueType с CIDFontType2, Identity CIDToGIDMap, инициализированными метриками и ширинами Unicode; текст BMP и переносимые слои OCR переживают сохранение и перезагрузку PDF

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

Ограничения

Требования к компилятору

Перед сборкой приложения проверьте выбранную версию FPC, целевой CPU и целевую операционную систему

fpc -iV
fpc -iTP
fpc -iTO

Для явного выбора конфигурации компилятора используйте -n @/path/to/fpc.cfg; держите пути RTL и пакетов согласованными с версией компилятора и целью

Не добавляйте -FcUTF8: он меняет обработку старших байтов в AnsiString и может повредить бинарные идентификаторы PDF и значения шифрования

Динамическая библиотека C ABI для macOS

Шаблоны локальной конфигурации, полную матрицу выходных каталогов, развёртывание, владение в C ABI и рабочий пример на Python см. на странице Конфигурация и использование dylib

Существующая поверхность экспорта динамической библиотеки из 880 записей собирается нативным Free Pascal на macOS x64 или ARM64 либо кросс-компилируется из Windows с помощью Delphi; оба варианта дают одинаковые имена C-символов

export FPC=/path/to/aarch64-darwin/fpc
export PDFLIB_FPC_CONFIG=/path/to/fpc.cfg
bash Dylib/Build-native.sh release full
python3 Dylib/examples/create_pdf.py Dylib/OSXARM64/FPC-release-full/libPDFlibDylib.dylib /tmp/hello-dylib.pdf

На Mac с x64 выберите нативный компилятор x86_64-darwin и используйте соответствующий выходной путь Dylib/OSX64/FPC-release-full

Не задавайте PDFLIB_FPC_CONFIG, если у компилятора уже есть корректная конфигурация; для отдельной TRIAL-сборки используйте debug trial, а PDFLIB_DYLIB_OUTPUT задаёт внешний выходной каталог

C ABI на системах и Intel, и ARM64 использует 32-битные непрозрачные дескрипторы экземпляров и строки UTF-16 PWideChar; привязки из других языков должны передавать кодовые единицы UTF-16, а не нативное представление wchar_t хоста

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

Экземпляр 0 остаётся псевдонимом экземпляра по умолчанию; явные положительные дескрипторы не переиспользуются, пока загруженная библиотека живёт, а выгрузка освобождает незакрытые экземпляры и буферы

Сериализуйте вызовы, работающие с одним экземпляром, а создание и освобождение экземпляра — относительно других вызовов C ABI; блокировка реестра не защищает экземпляр после поиска

Кросс-компиляция из Delphi

Сборочные скрипты под Windows выбирают dccosx64 или dccosxarm64, требуют локального кэша macOS SDK, раздельного полного и TRIAL-вывода и проверяют заголовок полученного Mach-O, прежде чем публиковать результат сборки

Задайте PDFLIBPAS_MACOS_SDK или передайте sdk path; PDFLIBPAS_MACOS_LINKER может выбрать Mach-O-компоновщик LLVM с именем ld64.lld.exe, если установленный компоновщик по умолчанию не читает файлы .tbd из SDK

Delphi использует файловые API POSIX, именованные ресурсы RCDATA, системные zlib и libcurl, общие нативные провайдеры OpenSSL/Fontconfig/Cairo/OpenJPEG и Apple ImageIO для изображений JPEG

set PDFLIBPAS_MACOS_SDK=C:\SDKs\MacOSX.sdk
set PDFLIBPAS_MACOS_LINKER=C:\LLVM\bin\ld64.lld.exe
Dylib\Build-dylib.bat osxarm64
Dylib\Build-dylib-TRIAL.bat osxarm64 debug
Dylib\Build-dylib.bat osx64
Dylib\Build-dylib-TRIAL.bat osx64 debug

Указатель документации