Техническая статья

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

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

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 Component: рендеринг, просмотр и чтение существующих PDF

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

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

Извлечение текста — это то, где у PDFium Component нет прямых конкурентов в линейке losLab. ReadablePageContent возвращает структурированный текст с учетом порядка чтения, PageWordBoxes дает ограничивающие прямоугольники на уровне слов, а DocumentReadingUnits проходит по всему документу. Для работы со специальными возможностями IsTagged сообщает вам о наличии дерева структуры, а ValidatePdfUa запускает проверку соответствия UA. Эти API делают PDFium Component естественным выбором для любого рабочего процесса, которому нужно понимать, что находится внутри существующего 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 Component. Если вы манипулируете, объединяете или подписываете существующие PDF-файлы в масштабе или с семантикой инкрементного сохранения, используйте PDFlibPas. Многие производственные системы используют две из трех: HotPDF для создания вывода и PDFlibPas для применения к нему метки долгосрочной проверки перед архивированием, например, или PDFium Component для предварительного просмотра того, что создал HotPDF, перед отправкой дальше

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

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