三個函式庫;三項不同的工作;選錯一個會花費您數週的時間來尋求因應對策,而當您只需要一個時卻選擇了全部三個,則會花費您未列入預算的維護開銷;以下直接說明每個 losLab PDF 函式庫的實際功用、適用場景以及它們如何與其他系列元件協作
HotPDF:在 Delphi 中從頭開始撰寫 PDF
HotPDF 是用於產生 PDF 文件的原生 VCL 元件;其模型是命令式且以頁面為中心的:您建構一個 THotPDF 實例、設定文件屬性、呼叫 BeginDoc、繪製到 CurrentPage、根據需要新增頁面,並使用 EndDoc 關閉;順序非常重要,因為 BeginDoc 會在執行時提交加密字典和壓縮設定;在該時間點之後指派的任何內容都會被悄悄忽略,而不會追溯套用
繪圖介面涵蓋了 Delphi 層級的完整 PDF 運算子集:用於定位 Unicode 文字的 TextOut、具有 TrueType 內嵌的 SetFont、向量基本圖形(線段、貝茲曲線、橢圓、矩形)、來自檔案或記憶體的影像置放,以及條碼產生;座標是以左下角為起點的點數,Y 軸向上遞增,這會讓每個人都出錯一次;字型狀態在 AddPage 後無法保留,因此每次分頁後都需要呼叫 SetFont
AcroForm 欄位是一等公民;您只需各呼叫一次,即可將文字欄位、核取方塊、選鈕、下拉式選單、清單方塊和按鈕直接新增至頁面物件;HotPDF 還可以透過 LoadFromFile 載入現有的 PDF 並填寫或讀取欄位值,這使得它在兩個獨立的工作流程中非常有用:建置表單和自動填寫表單
加密也在文件層級進行處理;CryptKeyLength 選擇配置(從 40 位元 RC4 到 AES-256)、ActivateProtection 啟用加密,而 ProtectOptions 設定 ISO 權限旗標;兩個 AES-256 修訂模式(R5 and 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 執行,這是一個您放置在表單上並透過 PdfView.Pdf := Pdf 連結到 TPdf 實例的視覺元件;縮放和符合模式存在於檢視畫面上,而不是文件上;有一個容易讓人混淆的細節:Pdf.PageNumber 和 PdfView.PageNumber 是獨立的屬性;設定其中一個不會更新另一個,而且基於檢視畫面的擷取 API(文字方塊、閱讀單元)使用的是檢視畫面的目前頁面,而不是文件的目前頁面
文字擷取是 PDFium Component 在 losLab 系列產品中沒有直接競爭對手的地方;ReadablePageContent 傳回具有閱讀順序感知功能的結構化文字,PageWordBoxes 提供單字層級的邊界矩形,而 DocumentReadingUnits 則遍歷整個文件;對於無障礙工作,IsTagged 會告訴您是否存在結構樹,而 ValidatePdfUa 則執行 UA 合規性檢查;這些 API 使 PDFium Component 成為任何需要了解現有 PDF 內部內容而非產生新 PDF 的工作流程的自然選擇
表單填寫也可以在 PDFium 端執行,這是透過底層引擎公開的同一個 AcroForm 層來實現的;當來源文件已經存在,且您正在自動完成它,而不是自己建構表單欄位時,這非常適合
PDFlibPas:動作、合規性簽章與直接檔案存取
PDFlibPas(版本 3.73.0)處於複雜度光譜的另一端;它在同一個文件模型之上公開了三個 API 層:與 Quick-PDF 呼叫慣例相容的扁平控制代碼外觀(TPDFlib)、完整的物件樹狀層(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 產生的內容傳送到下游之前進行預覽
這三者都以適用於 Delphi 和 C++Builder 的原生 Pascal 原始碼出貨,除了 VCL 之外沒有任何執行期相依性;PDFium Component 還額外隨附 PDFium DLL,涵蓋了引擎的轉譯和解析工作;每個函式庫的產品頁面都包含其完整的 API 參考和目前的版本歷程記錄
個別函式庫的詳細資訊:HotPDF Component、PDFium Component 與 PDFlibPas