Три библиотеки. Три разные задачи. Выбор не той из них обойдется вам в недели обходных путей, а выбор всех трех, когда нужна только одна, приведет к расходам на обслуживание, которые вы не планировали. Вот прямой отчет о том, что на самом деле делает каждая библиотека losLab PDF, где она применяется и где передает работу своим аналогам
HotPDF: создание PDF с нуля в Delphi
HotPDF — это нативный VCL-компонент для генерации PDF-документов. Его модель императивна и ориентирована на страницы: вы создаете экземпляр THotPDF, задаете свойства документа, вызываете BeginDoc, рисуете на CurrentPage, добавляете страницы по мере необходимости и закрываете с помощью EndDoc. Порядок имеет значение, поскольку BeginDoc фиксирует словарь шифрования и настройки сжатия в момент своего выполнения; все, что назначено после этого момента, молча игнорируется, а не применяется задним числом
Поверхность рисования охватывает полный набор операторов PDF на уровне Delphi: TextOut для позиционированного текста Unicode, SetFont с внедрением TrueType, векторные примитивы (линии, кривые Безье, эллипсы, прямоугольники), размещение изображений из файла или памяти и генерация штрих-кодов. Координаты задаются в пунктах от левого верхнего угла, а Y растет вниз — как на канве VCL, и это сбивает с толку тех, кто приходит от сырых потоков содержимого PDF, где начало координат находится слева внизу. Состояние шрифта не переживает AddPage, поэтому после каждого разрыва страниц требуется вызов SetFont
Поля AcroForm являются объектами первого класса. Вы можете добавить текстовые поля, флажки, переключатели, поля со списком, списки и кнопки непосредственно на объект страницы одним вызовом каждый. HotPDF также может загрузить существующий PDF с помощью LoadFromFile и заполнить или прочитать значения полей, что делает его полезным в двух отдельных рабочих процессах: создании форм и автоматизации их заполнения
Шифрование также обрабатывается на уровне документа. CryptKeyLength выбирает схему (от 40-битного RC4 до AES-256), ActivateProtection включает её, а ProtectOptions устанавливает флаги разрешений ISO. Два режима ревизий AES-256 (R5 и R6, управляемые UseAES256R6) существуют потому, что ревизия 5 была расширением Adobe, чья проверка пароля оказалась слабой и была позже признана устаревшей, а ревизия 6 — это форма, стандартизованная в ISO 32000-2. Acrobat X и новее, как и большинство современных просмотрщиков, открывают файлы R6, поэтому R6 — разумный выбор по умолчанию; R5 имеет значение только тогда, когда получатель застрял на старом просмотрщике
Поддержка цифровой подписи в 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, который предоставляет базовый движок. Это уместно, когда исходный документ уже существует и вы автоматизируете его завершение, а не создаете поля формы самостоятельно
PDF Library for Delphi: манипулирование, подписание соответствия и прямой доступ к файлам
PDF Library for Delphi находится на другом конце спектра сложности. Он предоставляет три уровня API поверх одной и той же модели документа: плоский фасад на основе дескрипторов (TPDFlib), совместимый с соглашением о вызовах Quick-PDF, полный уровень дерева объектов (TPDFDocument) и потоковый парсер (TSmartPDFReader / TSmartPDFWriter), который работает непосредственно с байтами файла без загрузки полного графа объектов
Потоковый уровень — это то, что делает PDF Library for Delphi правильным выбором для больших документов. TSmartPDFWriter может добавить инкрементное обновление в файл на диске без реконструкции всей таблицы перекрестных ссылок, что является механизмом, лежащим в основе как эффективного пересохранения, так и меток долгосрочной валидации PAdES. Для рабочих процессов подписания уровня соответствия, где подписанный хеш должен охватывать определенный диапазон байтов, а подпись применяется без перезаписи документа, этот уровень является единственным жизнеспособным путем
Манипуляции с документами на уровне TPDFDocument включают объединение с помощью Merge, выборочное копирование страниц с помощью CopyPagesFromDoc со строкой диапазона и управление версиями с помощью SetMinimumVersion и LockSaveVersion. Блокировка версии вызывает ошибку 602, если вы пытаетесь сохранить функцию, которая вытолкнет вывод за пределы заблокированной версии, что полезно, когда вам нужно гарантировать, что вывод остается в пределах определенной редакции PDF для соответствия архиву
Поддержка PDF/A (ISO 19005) находится в рабочей среде соответствия PDF Library for Delphi. Обратите внимание, что шифрование и PDF/A взаимоисключающи по спецификации: вы не можете иметь и то, и другое в одном файле. Рабочие процессы, которым нужна зашифрованная копия для распространения и архивная копия PDF/A, должны создавать два отдельных артефакта
Выбор между ними
Типичное дерево решений короткое. Если вы генерируете новый документ из данных, используйте HotPDF. Если вы рендерите или извлекаете текст из существующего документа в приложении Delphi VCL, используйте PDFium Component. Если вы манипулируете, объединяете или подписываете существующие PDF-файлы в масштабе или с семантикой инкрементного сохранения, используйте PDF Library for Delphi. Многие производственные системы используют две из трех: HotPDF для создания вывода и PDF Library for Delphi для применения к нему метки долгосрочной проверки перед архивированием, например, или PDFium Component для предварительного просмотра того, что создал HotPDF, перед отправкой дальше
Все три поставляются как нативный исходный код Pascal для Delphi и C++Builder. У HotPDF и PDF Library for Delphi нет зависимостей времени выполнения за пределами VCL; PDFium Component дополнительно поставляет DLL PDFium, на которую возложена работа движка по рендерингу и разбору. Страница продукта каждой библиотеки содержит её полный справочник по API и историю текущих версий
Подробная информация об отдельных библиотеках: HotPDF Delphi Component, PDFium Component и PDF Library for Delphi