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 обвива двигателя PDFium на Google като 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 може да добави инкрементална актуализация към файл на диска, без да реконструира цялата таблица с препратки (cross-reference table), което е механизмът, стоящ зад ефективното повторно записване и дългосрочните валидационни печати на 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.