Technical Article

Сравнение PDF-библиотек losLab для Delphi: HotPDF, PDFium VCL и PDFlibPas

Три библиотеки. Три разные задачи. Выбор неправильной приведет к неделям поиска обходных путей, а выбор всех трех, когда вам нужна только одна, обойдется в дополнительные затраты на обслуживание, которые вы не планировали. Ниже приведено прямое описание того, что на самом деле делает каждая PDF-библиотека losLab, где она применяется и где передает управление своим собратьям

HotPDF: создание PDF с нуля в Delphi

HotPDF — это нативный VCL-компонент для создания PDF-документов. Он использует императивную и постраничную модель: вы создаете экземпляр THotPDF, задаете свойства документа, вызываете BeginDoc, рисуете на CurrentPage, добавляете страницы по мере необходимости и завершаете работу с помощью EndDoc. Порядок имеет значение, поскольку BeginDoc фиксирует словарь шифрования и настройки сжатия в момент своего запуска; всё, что назначается после этого момента, автоматически игнорируется, а не применяется задним числом

Поверхность для рисования охватывает полный набор операторов PDF на уровне Delphi: TextOut для позиционированного текста Unicode, SetFont с внедрением TrueType, векторные примитивы (линии, кривые Безье, эллипсы, прямоугольники), размещение изображений из файла или памяти, а также генерацию штрихкодов. Координаты указываются в пунктах от нижнего левого угла с увеличением Y вверх, что постоянно сбивает всех с толку. Состояние шрифта не сохраняется после AddPage, поэтому вызов SetFont требуется после каждого разрыва страницы

Поля AcroForm являются полноправными элементами. Вы можете добавлять текстовые поля, флажки, переключатели, поля со списком, списки и кнопки непосредственно на объект страницы с помощью одного вызова для каждого элемента. HotPDF также может загрузить существующий PDF через LoadFromFile и заполнить или прочитать значения полей, что делает его полезным в двух отдельных рабочих процессах: создании форм и автоматизации их заполнения

Шифрование также обрабатывается на уровне документа. CryptKeyLength выбирает схему (от 40-битного RC4 до AES-256), ActivateProtection активирует её, а ProtectOptions устанавливает флаги разрешений ISO. Два режима ревизии AES-256 (R5 и R6, управляемые UseAES256R6) существуют, потому что ревизия 6 исправляет известную уязвимость ревизии 5, но требует просмотрщика с поддержкой PDF 2.0; выбор между ними — это вопрос совместимости, а не удобства

Поддержка цифровых подписей в HotPDF охватывает базовые профили PAdES, поэтому она подходит для рабочих процессов, где подпись должна соответствовать требованиям ETSI EN 319 142. Если ваша задача — только создание выходных данных, HotPDF — это первая библиотека, к которой стоит обратиться

PDFium VCL: рендеринг, просмотр и чтение существующих PDF

PDFium VCL оборачивает движок Google PDFium в качестве VCL-компонента, что придает ему принципиально иную роль по сравнению с HotPDF. В то время как HotPDF пишет, PDFium VCL читает и визуализирует. Основным объектом является TPdf, менеджер документов, который открывает файл, устанавливая FileName и затем Active := True. Ошибки при загрузке не вызывают исключений; Active просто остается False, поэтому его проверка после присвоения не является необязательной

Рендеринг выполняется через TPdfView, визуальный компонент, который вы помещаете на форму и связываете с экземпляром TPdf с помощью PdfView.Pdf := Pdf. Режимы масштабирования и подгонки находятся в представлении, а не в документе. Одна тонкость, о которую люди спотыкаются: Pdf.PageNumber и PdfView.PageNumber — это независимые свойства. Установка одного не обновляет другое, а API извлечения на основе представления (ограничивающие рамки слов, единицы чтения) используют текущую страницу представления, а не документа

Извлечение текста — это область, где PDFium VCL не имеет прямых конкурентов в линейке losLab. ReadablePageContent возвращает структурированный текст с учетом порядка чтения, PageWordBoxes предоставляет ограничивающие прямоугольники на уровне слов, а DocumentReadingUnits обходит весь документ. Для задач доступности IsTagged сообщает о наличии дерева структур, а ValidatePdfUa выполняет проверку соответствия UA. Эти API делают PDFium VCL естественным выбором для любого рабочего процесса, которому нужно понять, что находится внутри существующего PDF, а не создать новый

Заполнение форм также работает на стороне PDFium через тот же слой AcroForm, который предоставляет базовый движок. Это уместно, когда исходный документ уже существует, и вы автоматизируете его заполнение, а не конструируете поля формы самостоятельно

PDFlibPas: манипуляции, подписание на соответствие стандартам и прямой доступ к файлу

PDFlibPas (версия 3.73.0) находится на другом конце спектра сложности. Он предоставляет три уровня API поверх одной и той же модели документа: плоский фасад на основе дескрипторов (TPDFlib), совместимый с соглашением о вызовах Quick-PDF, полный уровень дерева объектов (TPDFDocument) и потоковый парсер (TSmartPDFReader / TSmartPDFWriter), который работает непосредственно с байтами файла без загрузки полного графа объектов

Потоковый уровень — вот что делает PDFlibPas правильным выбором для больших документов. TSmartPDFWriter может добавить инкрементное обновление в файл на диске без реконструкции всей таблицы перекрестных ссылок, что является механизмом, лежащим в основе эффективного пересохранения и штампов долгосрочной валидации PAdES. Для рабочих процессов подписания уровня соответствия нормативным требованиям, где подписанный хэш должен охватывать определенный диапазон байтов и подпись применяется без перезаписи документа, этот уровень является единственным жизнеспособным путем

Манипуляции с документами на уровне TPDFDocument включают слияние с помощью Merge, выборочное копирование страниц через CopyPagesFromDoc со строкой диапазона и управление версиями с помощью SetMinimumVersion и LockSaveVersion. Блокировка версии вызывает ошибку 602, если вы пытаетесь сохранить функцию, которая повысит выходные данные сверх заблокированной версии, что полезно, когда вам нужно гарантировать, что результат останется в пределах конкретной ревизии PDF для архивного соответствия

Поддержка PDF/A (ISO 19005) находится в рабочей среде соответствия PDFlibPas. Учтите, что шифрование и PDF/A взаимно исключают друг друга по спецификации: вы не можете иметь и то, и другое в одном файле. Рабочие процессы, требующие зашифрованной копии для распространения и копии PDF/A для архива, должны производить два отдельных артефакта

Выбор между ними

Типичное дерево решений короткое. Если вы создаете новый документ из данных, используйте HotPDF. Если вы визуализируете или извлекаете текст из существующего документа в приложении Delphi VCL, используйте PDFium VCL. Если вы манипулируете, объединяете или подписываете существующие PDF-файлы на соответствие стандартам в больших масштабах или с семантикой инкрементного сохранения, используйте PDFlibPas. Во многих производственных системах используются два инструмента из трех: например, HotPDF для создания выходных данных и PDFlibPas для применения к ним штампа долгосрочной валидации перед архивированием, или PDFium VCL для предварительного просмотра того, что создал HotPDF, перед отправкой дальше по конвейеру

Все три продукта поставляются в виде нативного исходного кода Pascal для Delphi и C++Builder, без зависимостей времени выполнения, кроме VCL. PDFium VCL дополнительно включает DLL PDFium, которая покрывает работу движка по рендерингу и парсингу. На странице каждого продукта есть полная справка по API и текущая история версий

Подробная информация об отдельных библиотеках: HotPDF Component, PDFium VCL Component и PDFlibPas