Технічна стаття

Бібліотеки 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 обгортає рушій PDFium від Google як компонент 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 додатково містить бібліотеку PDFium DLL, яка охоплює роботу рушія з рендерингу та синтаксичного аналізу. На сторінці продукту кожної бібліотеки є повний довідник API та поточна історія версій

Деталі про окремі бібліотеки: компонент HotPDF, компонент PDFium Component та PDFlibPas