losLab 軟體開發部落格

PDFium 元件

Software Development Blog

PDFium 元件

在 Delphi 中使用 PDFium 稽核 PDF 安全風險

在真正信任一份 PDF 檔案之前,應該先完整列舉其所有潛在風險面。了解 PDFium 如何在 Delphi 中讀取文件內的 JavaScript、啟動動作與簽章權限,供稽核作業使用

PDFium 元件

Build a PDF Viewer in Delphi with PDFium Component

在 Delphi 中使用 PDFium 元件組合出一個可用的 PDF 檢視器:將 TPdf 連接到 TPdfView、載入與算繪文件,然後新增分頁、縮放與符合模式導覽 在 Delphi 中,PDF 檢視器可以歸結為兩個元件以及它們之間的連接; 擁有文件:它開啟檔案、對其進行解密,並回答有關頁數和中介資料的提問;

PDFium 元件

使用 PDFium 元件將多個 PDF 檔案合併為單一文件

在 Delphi 中使用 PDFium 元件合併 PDF 檔案:ImportPages、頁面範圍字串、插入位置、損壞檔案的靜默失敗,以及表單欄位行為 PDFium 元件透過單一方法公開了 PDF 合併功能: ;該模式始終相同:建立一個空的目標文件、依序開啟每個來源檔案、呼叫 複製頁面、關閉來源檔案,然後重複該步驟;當迴

PDFium 元件

使用 PDFium 進行多頁合一拼版與頁面重排

把多個 PDF 頁面統一排到同一張紙上、就地重新排序頁面顯示順序,或擷取指定的子集內容。了解 PDFium 在 Delphi 中的拼版與頁面移動 API,以及它們各自傳回的控制代碼

PDFium 元件

在 Delphi 中安全地解析 PDF 字典:名稱 Token

為什麼子字串鍵值尋找會毀壞 Delphi 中的 PDF 字典解析:依據 ISO 32000-1 的完整名稱 Token 匹配以及針對惡意 PDF 的資源限制 諸如 之類的子字串搜尋是讀取 PDF 字典的錯誤工具,因為 PDF 名稱鍵值(keys)共享前綴: 是 的前綴,而 是 的前綴

PDFium 元件

Delphi 與 PDFium 的註解外觀往返:空外觀從哪來

PDFium Component 在 Delphi 裡讀取註解再寫回時,舊版會替只帶 /N 的 /AP 外觀字典多寫出空的 /R 與 /D 串流,PDF/A 驗證隨之失敗;v3.121.1 起改成只回報真正讀到的外觀,原樣往返不再多寫任何東西

PDFium 元件

用 PDFium Component 在 Delphi 中審閱 PDF 註記

在 Delphi 中打造一個 PDF 註記審閱面板:依頁面替標註建立索引、面對外觀串流的否決仍能存活下來,並在不留下殘影的情況下替註記改色或刪除它們

PDFium 元件

用 PDFium Component 原子化批次填寫 PDF 表單

TPdf.SetFormFieldValues 以頁面與 widget 定址的型別化請求整批填寫 AcroForm:先預檢再對快照套用、單次替換生效,成功即全部生效,任何失敗則原文件與欄位值分毫不動

PDFium 元件

Delphi 分帶 PDF 渲染中的負 Y 偏移

PDFium Delphi 元件如何按水平帶渲染超大頁面:負 Y 偏移如何維持整頁幾何關係,以及 PNG 和 TIFF 如何串流輸出並控制峰值記憶體

PDFium 元件

在 Delphi 中可取消的漸進式 PDF 渲染 (PDFium)

緩慢的頁面渲染作業原本就不應凍結整個使用者操作介面,也不該被迫執行到底才能停止。了解 PDFium 的漸進式渲染如何在 Delphi 中透過 IFSDK_PAUSE 變成可隨時取消

PDFium 元件

PDFium 中 CMS signedAttrs 的 DER SET OF 排序

PDFium Component 依 X.690 11.6 的要求把 signedAttrs 排成 DER SET OF;自我驗證永遠抓不到第三方驗證器會拒絕的缺陷,因為兩端共用同一套編碼規則

PDFium 元件

在任何目標平台上載入 PDFium 原生程式庫

PDFium 元件在各目標平台上尋找原生程式庫的有序搜尋鏈,以及目標巨集中一個大寫字母如何在區分大小寫的 Linux 檔案系統上讓整個查找無聲失靈,附探測程式做法與部署檢查清單的完整教訓

PDFium 元件

別再倒退走 DER 長度位元組:PDFium Component

PDFium Component 一律從內容長度推算巢狀 CMS 的標頭起點,絕不倒退走長度位元組,因為最後一個位元組的 bit 8 只是數值位元,會讓憑證集合的切片整整偏移

PDFium 元件

PDF 表單欄位值為何「還原」:直接欄位陷阱

欄位字典以直接物件存放時,PDFium 可能把 /Annots 裡的副本升級成間接物件,而 /Fields 留下第二份直接副本,寫入看似成功卻讀回舊值;PDFium Component 先統一兩個參照再寫入

PDFium 元件

PDFium Component DocMDP:Widget /P 如何藏住頁面編輯

v3.126.2 之前的 DocMDP 角色圖把 widget 的 /P 回參照當成所有權,頁面內容編輯被評成 P=3 允許的註解變更;v3.126.2 分離導航邊與承載邊、改用不動點傳播,並以 FieldMDP 共享物件判決與 fail-closed 驗收清單收尾

PDFium 元件

PDFium Component Dynamic XFA:頁數其實是差值

動態 XFA 表單重排頁面時,原生頁面事件回報的是增減差值而非總數,v3.126.1 起改讀 FPDF_GetPageCount 並觸發 OnXfaPageCountChanged,同版也修正搬移欄位的輸入熱區,v3.126.2 讓 TPdfView 延後重載頁面,Delphi 檢視器從此頁碼與輸入位置都正確

PDFium 元件

Delphi 中無法靜默修改加密 PDF

依照 ISO 32000-1 第 7.5.6 節的增量更新規範,Delphi 中的 PDFium Component 會拒絕以明文標記或 PAdES 簽章方式修補已加密的 PDF 檔案內容

PDFium 元件

eIDAS 信任清單與合格 PDF 簽章

PDFium 元件如何在剖析歐洲 eIDAS 信任清單之前先驗證其真偽,把合格狀態與一般憑證鏈信任分開記錄,按歷史時間評估服務狀態,並以單調更新不變式與無 DTD 剖析守住安全底線

PDFium 元件

PDFium Delphi 把填色矩形當成表格框線

PDFium Component 的表格抽取從 3.117.0 起把細填色矩形視為框線:薄盒產生一條框線、填色儲存格貢獻四邊,座標再依 RulingSnapTolerance 對齊

PDFium 元件

PDFium Component:PDF 表單 Tab 順序與 /Tabs

PDFium Component 3.223.0 起依每頁宣告的 /Tabs 政策排列表單欄位順序:R、C、S 加上 PDF 2.0 的 A 與 W;狀態 overload 回報套用或退回的原因,跨頁焦點導覽也逐頁套用各自政策

PDFium 元件

PDFiumPas 的 FPC 常數加密金鑰修復

PDFiumPas 3.114.8 之前在非 Windows 目標用 RTL 的 Random 產生加密金鑰材料,又從不呼叫 Randomize,每個處理程序都吐出同一位元組序列:FPC 建置逐次寫出相同的檔案金鑰、salt 與 GCM nonce 前綴,現改讀 /dev/urandom 並在失敗時丟例外

PDFium 元件

ISO/TS 32002 的 ECDSA 與 EdDSA 簽章政策檢查

PDFium Component 在 Delphi 裡對每個 ECDSA 與 EdDSA PDF 簽章套用 ISO/TS 32002 演算法設定檔:核准曲線、摘要配對、Ed25519 與 Ed448 的編碼規則一次檢查,不符即回報演算法不匹配

PDFium 元件

Lazarus 與 Free Pascal 的 PDFium PDF 檢視器

把 Delphi 的 PDF 檢視器移植到 Lazarus 與 Free Pascal:字串編碼陷阱、以程式碼建構表單、PDFium 二進位檔的載入,以及離開 Windows 之後的語音朗讀

PDFium 元件

FPC 上 PDFium VCL 的 libcurl 時間戳記後端

PDFium VCL 在非 Windows 目標上經 libcurl 發送 RFC 3161 時間戳記查詢,動態繫結八個符號,另有兩個設定決定它在負載下會不會卡死;驗證不可編譯分支的受控副本手法也一併說明

PDFium 元件

PDFium Library Config:Brotli 什麼時候會悄悄換掉 Skia

FPDF_LIBRARY_CONFIG 的版本是累積的:只為開 Brotli 推到版本 6,零值的 m_RendererType 就被當成明確指定 AGG;指定 DLL 缺少的後端則直接帶走整個行程,PDFium Component 自 v3.125.0 起提前攔下、改為擲出可捕捉的 EPdfError

PDFium 元件

在 Delphi 中使用 PDFium 的低視力 PDF 色彩濾鏡

為 Delphi PDF 檢視器同時加入深色模式與低視力閱讀輔助這兩種顯示模式選項:渲染後色彩反轉處理方式、兩種不同的灰階轉換方式,以及在任何背景下都能持續保持清楚可見的覆疊色彩效果

PDFium 元件

在 Delphi 用 macOS Keychain 身分簽署 PAdES

PDFium VCL 在執行階段以 dlopen 與 dlsym 繫結 Security framework 符號,讓 macOS Keychain 簽署後端在任何平台都編得過,並指名每一個解析不到的符號

PDFium 元件

在 Delphi 中讀寫 PDF 標記內容

標記內容是標記 PDF 與 PDF/UA 背後的 BDC 與 EMC 成對運算子,PDFium Component 從普通 Delphi 程式碼讀取標記名稱強型別屬性表與 MCID,並能把結構樹接回它所描述的頁面內容,供可存取性檢查修復與稽核使用 標記內容是 ISO 32000-1 §14.6

PDFium 元件

PDFium Thread Safety:為什麼每文件一把鎖在 Delphi 行不通

PDFium 的不安全狀態長在整個模組上,不是個別文件:兩條執行緒各開一個 TPdf 照樣可能互相踩壞。PDFium Component 自 v3.125.1 讓批次驗證全程過一把行程層級的鎖,平行渲染則靠每個 worker 各載一份隔離的 DLL 模組

PDFium 元件

在 Delphi 裡為 PDF 簽章抓取 OpenSSL AIA 與 CRL

PDFium VCL 的 OpenSSL 後端會透過 AIA 下載缺席的中繼憑證、透過發佈點抓取 CRL,全程受固定時間、請求數與位元組預算約束,下載的憑證永遠只當鏈材,信任仍然只來自系統存放區與您設定的錨點

PDFium 元件

在 PDFium VCL 用 OpenSSL 驗證 PDF 簽章

PDFium VCL 把 OpenSSL CMS 驗證器接進 PAdES 驗證;底下有三種 OpenSSL 行為,不處理就會默默給出錯誤的判定,介面則拆出三個獨立判定與兩種驗證形狀,後端可按平台替換

PDFium 元件

PDFium Component 操作 PDF 選擇性內容圖層

PDFium Component 用 InspectOptionalContent 列出每個圖層與 PDFium 實際會渲染的可見性,SaveAsOptionalContentConfigured 則寫出一份已驗證的副本、把您選的圖層開關到位,並一併中和掉 Usage 與 /AS 規則,避免編輯被悄悄復原

PDFium 元件

PDFium 選填匯出:Delphi 中的能力關卡

當 pdfium.dll 的版本比綁定程式碼還舊時,單一缺少的匯出函式就足以讓整個載入程序失敗。了解 PDFium Component 如何在 Delphi 中為選填匯出設關卡並安全降級

PDFium 元件

在 Delphi 中編輯 PDF 大綱並重新對應頁面

PDFiumPas 在 Delphi 中如何於頁面移動或消失後重寫 PDF 大綱項目:帶正負號的 /Count、兄弟鏈結修補、ApplyPageMap 頁面對映、懸空項目處置,以及經過獨立重載驗證的增量儲存

PDFium 元件

Delphi 中 PDFium 頁面物件控制代碼在變換後過期

為何在 Delphi 中 FPDFPage_TransFormWithClip 之後 PDFium 頁面物件控制代碼讀到的是舊座標,以及重新載入順序與 getter 崗哨值的修法 當 重寫一頁時,你手上已持有的每個 控制代碼,描述的依然是變換之前那次剖析。Delphi 與 C++Builder 版的 PDFium

PDFium 元件

PDF/A 實作限制與字型編碼檢查

為什麼 PDF/A 檔案會卡在 ISO 19005-1 Annex C 的容器限制或符號式 TrueType 字型帶有的 Encoding 項目,PDFium Component 在 Delphi 中不載入 PDFium DLL 就能從位元組掃描路徑回報這兩類缺陷並附帶具體的補救建議

PDFium 元件

PDFium Component 檢查 PDF/A 中繼資料等價

ISO 19005-1 要求八個映射的 Info 項目與其 XMP 屬性攜帶相同值:TPdf.InspectPdfAMetadata 讀對 RDF 形狀、按 URI 比對命名空間、把日期當時刻比較,NormalizePdfAMetadata 則以 Info 為事實來源重寫漂移的 XMP 屬性

PDFium 元件

在 Delphi 中驗證 PDF/raster 掃描文件

PDF/R 讓每一頁掃描只帶一張條帶影像,沒有文字也沒有字型,PDFium Component 在 Delphi 與 C++Builder 中驗證 ISO 23504-1 一致性並回報每項拒絕的具體成因與對應的補救路徑 PDF/R,標準化為 ISO 23504-1,是針對掃描文件的 PDF

PDFium 元件

Delphi PKCS#11:CK_ULONG 與打包陷阱

PDFiumPas 在 Delphi 中透過 PKCS#11 權杖簽署 PAdES:Windows 上 CK_ULONG 為 4 位元組、LP64 上為 8 位元組,打包不同時函式表也會移位

PDFium 元件

PDFium Component 分析簽署後修訂變更

TPdf.AnalyzeSignatureRevisions 從原始檔案位元組重建每個增量修訂,按各簽章的 DocMDP 與 FieldMDP 規則為簽署後的物件變更評級,並把影子物件定義獨立列為風險——綠色勾勾只代表簽章驗證通過,不代表後來的存檔是被允許的

PDFium 元件

PDFium Delphi 檢視器:渲染快取與平滑縮放策略

使用 PDFium 讓 Delphi PDF 檢視器的縮放與捲動操作全程能隨時保持流暢:正確的快取鍵設計方式、點陣圖所有權管理、漸進式渲染機制,以及高 DPI 情境下的記憶體預算控制

PDFium 元件

PDFium Delphi 的 RSASSA-PSS-params 編碼

PDFium Component 3.114.20 修正三個 PAdES 簽章後端的 RSASSA-PSS-params 編碼:saltLength 要用 [2] 明確標記,trailerField 等於預設值則必須省略

PDFium 元件

在 Delphi 中用 PDFiumPas 做稀疏延遲 PDF 物件索引

PDFiumPas 如何在不載入整個檔案的情況下讀取單一 PDF 物件:稀疏 xref 區段描述元、延遲物件串流、混合式 XRefStm、1 MiB 有界讀取視窗,以及不隨尾頁物件 /Size 成長的記憶體用量

PDFium 元件

在 Delphi 中量測 PDF 文字以進行版面配置和自動換行

PDF 版面配置需要先知道字串寬度才能繪製。了解 PDFium Component 如何在 Delphi 中不碰頁面的情況下量測文字,用來做自動換行。 把文字放到 PDF 頁面上的呼叫很直覺。您把字串、字型、大小和位置傳給 ,字形就會出現。它不會告訴您該字串一旦繪製出來會有多寬,也不會把長字串拆成多行

PDFium 元件

Delphi 中的 PDFium 雙重旋轉與適合縮放錯誤

使用 PDFium 修正 Delphi 中縮圖重複旋轉造成的顯示問題:說明渲染旋轉參數為何是疊加計算方式,以及 90 或 270 度頁面為何需要交換寬高後才能算出正確的適合縮放比例

PDFium 元件

PDFium Component 修復 NBSP 與軟性連字號萃取

PDFium Component 以 Unicode 碼位為 CID 字型索引,讓每個 CID 恰好對應一條 ToUnicode 映射:抽取出來的空格不再變成 U+00A0、連字符不再變成 U+00AD,記憶體中的文件與存檔之後都一致

PDFium 元件

不靠 Uniscribe 的 PDF 文字 BiDi 內嵌層級

為什麼把 PDF 文字排版搬離 Windows 意味著自己實作 UAX #9 雙向演算法,以及會把增補平面字元拆成未配對代理、或讓重排整段悄悄失效的兩個典型錯誤,與字碼點單位重排等對應修法

PDFium 元件

Delphi 中用 PDFium 字元框做 PDF 文字行選取

PDF 文字頁面本身其實沒有行物件的概念。了解 PDFium Component 如何運用 FPDFText_GetCharBox 幾何資料建構出視覺行,並讓所有選取路徑共用同一個輔助函式

PDFium 元件

PDFium VCL 的 Windows 離線撤銷檢查

PDFium VCL 在 Windows 上離線檢查 PDF 簽章撤銷:在 CertGetCertificateChain 的撤銷階段加上 CERT_CHAIN_REVOCATION_CHECK_CACHE_ONLY,離線的 ValidatePadesTrust 完全不碰網路,乾淨的結果需要每張憑證都有真實的撤銷證據

PDFium 元件

為什麼 Delphi 中 PDFium 的 XFA 欄位編輯儲存後會消失

PDFium Component 只把 XFA 欄位編輯寫入記憶體緩衝區,因此 Delphi 應用程式儲存後會遺失欄位值;AcroForm 可以持續儲存,而 XFA 不可 PDFium Component 中的 會寫入目前取得焦點的表單欄位即時編輯緩衝區;對於 XFA 表單,這個緩衝區永遠不會進入會被序列化到磁碟的

PDFium 元件

在 Delphi 中使用 PDFium 進行 PAdES B-B 簽署 PDF

在 Delphi 中使用 PDFium 元件為 PDF 加入 PAdES B-B 數位簽章:自建 SHA-256、CMS,以及用於位元組級簽署的 Windows CNG 後端 PDFium 元件透過其 方法為 PDF 進行 PAdES B-B 數位簽章:它載入文件、計算已簽署位元組範圍的雜湊值、建立 CAdES

PDFium 元件

在 Delphi 中使用 PDFium 元件分割 PDF 文件

如何在 Delphi 中使用 PDFium 元件按頁面、範圍或書籤分割 PDF:TPdf.ImportPages、CreateDocument、SaveAs 結果檢查,以及 Active 旗標重設 PDFium 元件為您提供了一個用於分割 PDF 的方法: ;其他的一切操作,不論您是隔離單一頁面、在任意邊界上進行剪切,

PDFium 元件

驗證壓縮的 PDF:物件和 XRef 串流

現代 PDF 將結構隱藏在壓縮的物件與 XRef 串流中。瞭解 Delphi 驗證器如何展開 ObjStm 並透過 PDFium 讀取 XRef 串流尾部。 您編寫了一個小型的驗證器。它開啟 PDF,尋找到末尾,找到 ,讀取偏移量,並期望定位到關鍵字 (其下方有一個固定寬度的交叉參照表)

PDFium 元件

PDFium 元件在 Delphi 中的 PDF/X 驗證

在 Delphi 中驗證可供列印的 PDF/X 檔案:PDFium 元件的 ValidatePdfX 會執行 ISO 15930 檢查,涵蓋 TrimBox、Trapped、OPI、LZW 以及字型內嵌等。 Delphi 的 PDFium 元件透過 驗證可供列印的 PDF/X 文件