在 Delphi 中使用 PDFium Component 读取 PDF 字体属性
在 Delphi 中使用 PDFium Component 检查 PDF 内部的字体:读取字形所属家族名称、基本名称、字重、斜体角度,以及字体是否已嵌入,适用于 Delphi、C++Builder 和 Lazarus 项目
losLab 软件开发博客
Software Development Blog
在 Delphi 中使用 PDFium Component 检查 PDF 内部的字体:读取字形所属家族名称、基本名称、字重、斜体角度,以及字体是否已嵌入,适用于 Delphi、C++Builder 和 Lazarus 项目
在信任一份 PDF 之前,先枚举它的风险面,了解 PDFium 如何在 Delphi 中读取文档 JavaScript、启动动作以及签名权限,用于安全审计,适用于 Delphi、C++Builder 和 Lazarus 项目
在 Delphi 中用 PDFium 组件搭建一个功能完整的 PDF 查看器:把 TPdf 与 TPdfView 关联起来,完成文档加载渲染,再加上翻页、缩放与适应视图,适用于 Delphi、C++Builder 和 Lazarus 项目
用 PDFium 组件在 Delphi 中把一整个文件夹的扫描图片合并成单个 PDF:创建文档、一图一页、按需缩放,最后统一保存,适用于 Delphi、C++Builder 和 Lazarus 项目
在 Delphi 中使用 PDFium 组件把 PDF 页面渲染为 JPEG 图像:把 DPI 换算为像素尺寸,将每页绘制成位图,再用 TJPEGImage 完成编码,适用于 Delphi、C++Builder 和 Lazarus 项目
在 Delphi 中使用 PDFium 组件从零创建 PDF:掌握 CreateDocument、AddPage、AddText 和 CreatePath 的用法,以及坐标系和字体嵌入方面的常见陷阱
在 Delphi 中使用 PDFium 创建高亮和下划线注释:QuadPoints 顺序、为什么 FPDFAnnot_SetAttachmentPoints 返回 false,以及 Append 修复 PDFium Component 通过 创建文本标记注释,包括高亮、下划线、删除线和波浪线:您在 记录上设置
诊断 Delphi 中 pdfium.dll 的加载失败:修复 32/64 位 ERROR_BAD_EXE_FORMAT 193 错误、识别过时的 DLL,并在多线程间安全加载 PDFium 组件
在 Delphi 中检测 XFA 表单,并用 PDFium 组件把 template、datasets 和 config 数据包提取为原始 XML,静态包读取无需 V8 运行时支持
在 Delphi 中使用 PDFium 组件导入和导出 XFDF 表单数据与批注:ISO 19444-1 往返处理、18 种批注子类型,以及区域设置安全的数字格式,适用于 Delphi、C++Builder 和 Lazarus 项目
在 Delphi 中使用 PDFium 组件从 PDF 中提取嵌入图片:读取 BitmapCount、逐个获取 Bitmap[],处理静默失败情况,并保存为 JPEG 或 BMP,适用于 Delphi、C++Builder 和 Lazarus 项目
在 Delphi 中使用 PDFium 组件提取 PDF 文本:通过 Character[] 进行原始字形访问、用 ReadablePageContent 提取段落结构,并防范 Active 静默失败
Pascal 封装 C 库时,调用约定、整数宽度、异常边界和句柄所有权都必须明确。本文梳理 PDFium Component 绑定中的 cdecl、FPC Win64 size_t、异常传播、双重释放、托管记录和 DLL 导出清理问题,并说明修复方法,帮助 Delphi 与 Lazarus 集成避免崩溃
在 Delphi 和 Lazarus 中使用 PDFium 组件读取 PDF 签名:检查 SubFilter、ByteRange 和 CMS 字段,并检测 PAdES B-B 到 B-LTA 的基线级别
在 Delphi 中使用 PDFium 组件添加长期 PAdES 签名:RFC 3161 时间戳、DSS 验证存储,以及用于 B-T、B-LT 和 B-LTA 的 DocTimeStamps
在 Delphi 中使用 PDFium 组件合并 PDF:搞懂 ImportPages、页码范围字符串、插队位置,对付装死烂文件,还有搞清表单字段到底能不能一起合过去。 用 PDFium 组件去合并 PDF,大门只有一扇: 。不管你要怎么合,套路永远是那老一套:先造个空荡荡的接收文档(destination),挨个去开
使用 PDFium 在 Delphi 中把多个页面拼到一张纸上、原位重新排序,或按索引导入页面子集。本文解释 ImportNPagesToOne、MovePages 和 ImportPagesByIndex 的尺寸单位、索引语义、返回句柄和释放责任,避免泄漏与双重释放,适合打印排版、页面编辑器和文档抽取工具
为什么子字符串键查找会损坏 Delphi 中的 PDF 字典解析:遵循 ISO 32000-1 的完整名称 Token 匹配以及针对恶意 PDF 的资源上限限制 子字符串搜索(例如 )是读取 PDF 字典的错误工具,因为 PDF 名称键共享前缀: 是 的前缀,而 是 的前缀;ISO 32000-1 §7.3.5
让 Delphi 的 PDF 查看器真正配合屏幕阅读器:从标签结构树提取阅读顺序、词级 TTS 高亮光标,以及未加标签文档的诚实回退与状态提示
PDFiumPas 如何在 Delphi 中把 AcroForm 字段从一个 PDF 移植到另一个:GraftPdfAcroForm 克隆整张字段对象图,重映射控件页码,移植映射按事务回滚,歧义情形一律失败即拒
PDFiumPas 在 Delphi 中降采样 PDF 图像时按图像细节选盒式、双线性、双三次或 Lanczos 核,颜色以感知 alpha 的形式累加,并有严格工作内存预算兜底,超预算图像原样保留并计入报告
在 Delphi 中构建一个 PDF 注解评审面板:按页一次性建立好索引、应对外观流对颜色的否决,以及不留残影地重新着色、删除和新增评审标记
耗时的 PDF 渲染应当移出 UI 线程,了解 PDFium 绑定如何在 Delphi 中借助可取消的 futures,在后台线程上安全运行渲染任务,适用于 Delphi、C++Builder 和 Lazarus 项目
PDFium Delphi 组件如何按水平带渲染超大页面:负 Y 偏移如何保持整页几何关系,以及 PNG 和 TIFF 如何流式输出并控制峰值内存
缓慢的页面渲染不应冻结界面或必须运行到底,了解 PDFium 如何在 Delphi 中通过 IFSDK_PAUSE 实现可取消的渐进式渲染,适用于 Delphi、C++Builder 和 Lazarus 项目
在 PDFium Component 中,当 /V 从控件批注读取时复选框会展平成未勾选状态,因为按 ISO 32000-1 规定 /V 应属于父字段字典,适用于 Delphi、C++Builder 和 Lazarus 项目
PDFium Component 在 Delphi 中用 CID Type 2 字体在字形级别写入文本,生成 CID 到 GID 的映射与 ToUnicode 映射,使已成形文本仍可被提取
PDFium Component 把 signedAttrs 按 DER SET OF 排序,因为 X.690 11.6 要求成员按各自 DER 编码升序输出;自验证永远抓不到第三方验证器拒绝的问题
PDFium 组件定位原生库的四段有序搜索链:DLLs 目标子目录、可执行文件旁的备用布局、扁平布局与系统目录,以及编译器目标宏里的一个大写字母如何在 Linux 上悄悄毁掉整条查找链
Delphi 与 FPC/Lazarus 之间的四处隐藏差异会打中同一份 PDFium 代码:记录临时变量的生命周期、范围检查、E2010 的 TBytes 转型,以及 AnsiString 的字节丢失
PDFium Component 使用经过校验的快照与紧凑的双向差量,为 Delphi 中的 PDF 编辑加入文档级撤销、重做与崩溃恢复能力
了解 PDFium Component 如何在 Delphi 中直接从一段 TBytes 字节范围加载嵌入式 PDF,涵盖防溢出边界检查与借用缓冲区的生命周期规则,适用于 Delphi、C++Builder 和 Lazarus 项目
FPDFText_GetUnicode 返回完整的 32 位码点,而 WideChar 只能容纳 16 位,因此 Delphi 中的 PDFium Component 可能损坏 Emoji 和罕见 CJK 表意字符
PDFium Component 在 Delphi 中遇到加密 PDF 时会拒绝执行不安全的增量更新、合规标记注入以及 PAdES 签名操作,以符合规范要求,适用于 Delphi、C++Builder 和 Lazarus 项目
PDFium 组件如何在解析欧洲 eIDAS 可信列表之前先完成真实性验证,让新抓取的列表与缓存快照通过同一个验证器,并把合格状态与普通证书链信任分开记录、彼此互不覆盖,使两类结论始终可见
PDFiumPas 通过解析活动交叉引用修订链和 Adobe Extension Level 声明,让 Delphi 应用能按 1.3 至 1.7 的精确版本保存 PDF 且不破坏一致性
了解 WaitForIdle 和 padSynchronize 回调如何让 PDFium Component 中的 Delphi 主线程死锁,以及队列容量、关闭顺序与 TPdf 所有权的相关限制
在 Delphi 或 FPC 函数返回含托管字段的记录时,用 FillChar 清零 Result 会跳过字符串释放,在循环调用中悄悄造成内存泄漏,适用于 Delphi、C++Builder 和 Lazarus 项目
说明程序填好的 PDF 表单为何在 Acrobat 中显示为空白,以及如何用 FormFill 子系统、键盘字段遍历和 GenerateFormAppearances 修复它,适用于 Delphi、C++Builder 和 Lazarus 项目
Delphi 与 FPC PDF 查看器中的三层打印循环在点击 Cancel 后仍继续渲染,原因是 Free Pascal 会在循环开始时就锁定 for 循环的上限值,适用于 Delphi、C++Builder 和 Lazarus 项目
Free Pascal 下非 ASCII PDF 标题会在 XMP 数据包中变成无效 UTF-8;这里解释字符串代码页规则,以及 PDFium 中的 SetCodePage 修复
使用 PDFiumPas 在 Delphi 中写出 ISO/TS 32003 AESV4-GCM 加密 PDF:R7 密钥派生、独立的 PDF MAC 完整性令牌与 ValidatePdfMac 状态检查
把 Delphi 的 PDF 查看器移植到 Lazarus 与 Free Pascal:字符串编码陷阱、运行期构建窗体、PDFium 二进制加载,以及 Windows 之外的语音朗读
非 Windows 目标上 PDFium VCL 通过动态绑定八个符号的 libcurl 发送 RFC 3161 时间戳查询,空 Expect 头与 CURLOPT_NOSIGNAL 两个设置决定传输在负载下会不会挂死
给 Delphi 的 PDF 查看器加上暗色与低视力阅读模式:渲染之后的反色处理、两种互相矛盾的灰度,以及在每种滤镜下都保持可见的叠加层颜色
PDFium VCL 在运行时用 dlopen 和 dlsym 绑定 Security 框架符号,让 macOS 钥匙串签名后端在任何平台都可编译,并把每个无法解析的符号名字逐一报出来
PDFium Component 通过 PageObjectMarks、AddPageObjectMark 与 PageObjectMarkedContentID 从普通 Delphi 代码读取并写入 BDC 标签、类型化属性列表与 MCID,把标签化 PDF 与 PDF/UA 所依赖的内容层结构直接暴露出来
了解 PDF 行向量约定如何让 Delphi 中的 Multiply 变成后乘、PreMultiply 变成前乘,为什么 PreTranslate 需要用到线性部分,以及轴心辅助函数的组合方式
PDFium Component 在 Delphi 中重建 ISO 32000 名称树与编号树:平衡节点、正确的 /Limits、稳定的根对象身份,以及写入后重新读取、逐条比对的自校验增量保存
了解为什么仅执行 FlateDecode 仍会让 PDF 对象流保持差分数据,以及 PDFiumPas 如何在 Delphi 中还原 PNG 和 TIFF Predictor 编码
PDFium Component 从 Delphi 为扫描版 PDF 添加隐形 OCR 文本层,通过设备到页面的变换映射单词四边形,完全不触碰图像本身
PDFium VCL 通过 IPdfCmsVerifier 把 OpenSSL CMS 验证器插入 PAdES 校验;共享内容 BIO、no-verify 标志与空库 CRL 检查这三个 OpenSSL 行为,不处理就会静默产出自信却错误的判定
PDFiumPas 的 SaveAsRedacted 在操作符级拆分只被部分覆盖的文字、矩形路径和轴对齐图像,按原字体与矩阵重建幸存部分,再剪枝无引用资源;无法诚实重建的字符一律失败即拒
当 pdfium.dll 比绑定层版本更旧时,一个缺失的导出就足以让加载崩溃,了解 PDFium Component 如何在 Delphi 中对可选导出做门控并安全降级,适用于 Delphi、C++Builder 和 Lazarus 项目
PDFiumPas 如何在 Delphi 中于页面移动或消失后重写 PDF 大纲项:有符号 Count、兄弟链维护、ApplyPageMap 按页面计划重定向目标,增量保存后再独立重载核验,坏树拒绝交付
为什么在 Delphi 中执行 FPDFPage_TransFormWithClip 之后 PDFium 页面对象句柄读到的还是旧坐标,以及修复它所需的重载顺序和 getter 哨兵值 当 重写一个页面时,你手上已经持有的每一个 句柄,描述的依然是变换之前的那次解析结果。面向 Delphi 和 C++Builder
用一份快照策略约束 Delphi 里每个 PDF 解析器:PDFium Component 把递归深度、token 数、对象数、解码字节、膨胀比和截止时间等限制集中到一处,操作中途阈值不会漂移
用 PDFium Component 在 Delphi 中分流来件 PDF:读取 Info 字典与 XMP 元数据、识别加密、JavaScript 与 XFA,并尽早把有风险的文件路由出去
在 Delphi 中使用 PDFium Component 生成通过 veraPDF 验证的 PDF/A 归档文件:SaveAsPdfA、XMP 与 ICC OutputIntent 注入、a/b/u 一致性及相关陷阱
PDFium Component 校验 ISO 19005-1 Annex C 的 127 字节名称、8191 元素数组、4095 条字典与 28 层嵌套限制,并报告符号化 TrueType 字体携带的 /Encoding 条目,全程基于字节扫描无需加载 PDFium DLL 即可拿到判定结论
使用 PDFium 元件 (PDFium Component) 在 Delphi 中建置 PDF/A 预检检查器:透过标記扫描 (token-scan) 29 個验证問题、感知各部分的门檻 (part-aware gating)、对象流 (object streams),且无需進行完整的内容解析
PDFDocEncoding 的特殊字符块起点是 $80 而不是 $7F,差一行错位就让 PDFium Component 的 FDF 导入把每个符号都解成表中相邻的字符,一切照常通过
PDFium Component 的 ValidatePdfRCompliance 在 Delphi、C++Builder 与 Lazarus 中按 ISO 23504-1 校验扫描文档 profile,逐页核对恰好单张带状图像、禁止字体与未授权图像编码,并返回合规级别与一组具体可处置的问题清单
使用 PDFium VCL 走訪即时的 PDF 标签树,以捕捉字节等級 (byte-level) 扫描遗漏的 PDF/UA 内容错误:图形替代文字 (Figure Alt)、公式文字 (Formula text) 以及独一无二的注释識別码 (Note IDs)。 你的预检报告指出文件符合 PDF/UA 标準
在 Delphi 中使用 PDFium VCL 生成并验证 PDF/VT-1 可变数据打印文件:DPart 树结构、强制性的 PDF/X-4 配对,以及 ISO 16612-2 的常见陷阱
PDFiumPas 在 Delphi 中通过 PKCS#11 令牌签署 PAdES:Windows 上 CK_ULONG 为 4 字节、LP64 上为 8 字节,打包不同时函数表也会移位
PDFium 组件如何让每次文本整形调用都经过同一个可安装后端:Windows 上默认 Uniscribe,Free Pascal 下用运行时动态绑定 HarfBuzz,库缺失时报降级而不是启动失败
利用 PDFium 组件在 Delphi 中自动化 PDF/A 与 PDF/UA 印前检查:批处理循环、退出代码、JSON 与 HTML 报告,以及为何空结果并不代表通过,适用于 Delphi、C++Builder 和 Lazarus 项目
BuildReflowDocument 把固定版式的 PDF 转成语义化重排模型,ToHtml 再导出自包含 HTML:标题还是标题、列表还是列表,检测到的表格保留表头与跨行跨列,不引用任何外部脚本或样式表
使用 PDFiumPas 的 PreparePadesRemoteSignature 与 CompletePadesRemoteSignature,在 Delphi 中通过 HSM 或云端密钥为 PDF 签名,支持持久化签名会话
用 PDFium 让 Delphi PDF 查看器的缩放与滚动保持流畅:正确的缓存键、位图所有权、渐进式渲染,以及高 DPI 下的位图内存预算
PDFiumPas 的渲染锁可防止并发 UnloadPage 或 ReloadPage 影响光栅化,但直到 v2.26.0,六个 TPdf 和 TPdfView 调用仍未使用它 PDFiumPas 的渲染锁是按文档划分的临界区——由 上的 字段支持的 和 ,用于包围每一次进入 PDFium
用 PDFium Component 加固 Delphi 的 PDF 预览面板:加载时禁用 JavaScript、拦截链接点击、过滤附件,并读取加密权限位
PDFiumPas 如何不加载整个文件就读取单个 PDF 对象:只留稀疏 xref 段描述符,对象流按需惰性解压,混合 XRefStm 正确注册,所有读取都走有界的 1 MiB 窗口,大文件不再按 /Size 分配数组
使用 PDFiumPas 的 GetStructuredText 在 Delphi 中把 PDF 文本提取为区块、行和带样式的文本片段:阅读顺序选择、标签增强信息与失败即关闭的预算控制
ConfigureSystemFontProvider 装上一个 IPdfSystemFontProvider,接管 PDFium 的每次字体映射请求:拿到字体名、字重、斜体标志和字符集后交回你自己的 TrueType 字节,渲染不再看机器上装了什么字体
PDFium Component 在 Delphi 中检测 PDF 页面里带线框和按空白对齐的表格,解析合并单元格与跨行跨列,并将行导出为 CSV 或 JSON
在绘制前必须先获取字符串宽度。本文说明 PDFium 绑定如何在不写入页面的情况下测量文本,用于 Delphi 中的自动换行 绘制一段文本的调用本身很直接:你给 传入字符串、字体、字号和位置,字形就会出现。但它不会告诉你绘制后这段字符串会有多宽,也不会自动在边界处断行。一次 总是把文本放在一个位置
PDFiumPas 在 Delphi 中会缓存 FPDF_TEXTPAGE 句柄,AddText、SetText 或 AddPath 编辑后若不先重新加载,下一次文本查询就会读到旧缓存
使用 PDFium 修复 Delphi 中缩略图重复旋转和适配缩放错误,了解渲染旋转参数为何会叠加,以及 90 或 270 度页面为何必须先交换宽高,适用于 Delphi、C++Builder 和 Lazarus 项目
为什么把 PDF 文本排版从 Windows 移植出去意味着亲自实现 UAX #9 双向算法,以及两个会让星形平面字符损坏成孤立代理对、或让重排序被整体悄悄跳过的实现错误与各自的修复方式
一个 PDF 文本页里并没有行对象,了解 PDFium Component 如何从 FPDFText_GetCharBox 的几何信息聚类出视觉行,并在选取路径间共享辅助函数,适用于 Delphi、C++Builder 和 Lazarus 项目
了解 PDFium Component 如何在 Delphi 中把表单字段索引与批注索引区分开:按子类型过滤控件、只在原生调用边界做映射,并修复无界面模式下的焦点问题,适用于 Delphi、C++Builder 和 Lazarus 项目
在 Delphi 中使用 PDFium 词框同步文本转语音与页面词语高亮:TrackReadingWordAt、渲染顺序、自动滚动,以及需要注意的 Unicode 陷阱,适用于 Delphi、C++Builder 和 Lazarus 项目
PDFium Component 只把 XFA 字段编辑写入内存缓冲区,因此 Delphi 应用保存后会丢失字段值;AcroForm 可以持久化,而 XFA 不行 PDFium Component 中的 会写入当前获得焦点的表单字段实时编辑缓冲区;对于 XFA 表单,这个缓冲区永远不会进入会被序列化到磁盘的
在 Delphi 中使用 PDFium 组件打印 PDF:用 RenderPage 和 rePrinting 渲染页面,通过 StretchDIBits 输出位图,并处理缩放适配与页面旋转
水印或 logo 只画一次,就能盖到每一页上:看看 PDFium 的 Form XObject 如何在 Delphi 中做出可复用的页面图章,以及那条句柄生命周期规则
在 Delphi 中使用 PDFium 组件运行 AcroForm JavaScript:了解为什么字段计算会保持静默、V8 DLL 的具体要求,以及能否决高风险动作的宿主事件,适用于 Delphi、C++Builder 和 Lazarus 项目
用 PDFium Component 在 Delphi 中给 PDF 加上 PAdES B-B 数字签名:自建的 SHA-256、CMS 结构,以及做字节级签名的 Windows CNG 后端
如何在 Delphi 中使用 PDFium 组件按页码、范围或书签拆分 PDF:TPdf.ImportPages、CreateDocument、SaveAs 返回值校验,以及 Active 标志重置 PDFium 组件拆分 PDF 时提供了一个方法 。无论你要抽取单页、按任意边界切分,还是按文档书签结构分段,核心都在于
用 Delphi 为 PDFium 的 FPDF_FILEACCESS 回调编写 TStream 适配器,按需流式加载数 GB 的 PDF,同时正确处理其 4 GiB 文件长度上限
在 Delphi 中使用 PDFium 组件构建并排 PDF 查看器:支持独立的多列面板、通过 TPdfView.Zoom 分别控制缩放,并同步页面导航,适用于 Delphi、C++Builder 和 Lazarus 项目
现代 PDF 将结构放在压缩对象流与 xref 流中,本文说明 Delphi 校验器如何展开 ObjStm 并读取 PDFium 的 xref 流 trailer 你编写了一个小型校验器。它打开 PDF 后定位文件结尾,找到 ,读取偏移量,并期望在该位置发现 关键字,紧跟一张固定宽度交叉引用表
在 Delphi 中验证可印刷的 PDF/X 文件:PDFium Component 的 ValidatePdfX 运行针对 TrimBox、Trapped、OPI、LZW 以及字体嵌入的 ISO 15930 检查 适用于 Delphi 的 PDFium Component 通过 验证适合印刷的 PDF/X
PDFium Delphi 组件如何在 macOS 通过 CMSDecoder 和 SecTrust 验证 PDF 签名:合并 ByteRange、状态映射与 CFRelease 规则
了解为什么 PDF 验证器会拒绝 PAdES 签名:全零 ByteRange 字段、缺失的 D: 日期前缀,以及增量更新后丢失的 /Encrypt,均以 PDFium 组件演示,适用于 Delphi、C++Builder 和 Lazarus 项目
了解 PDFium 组件如何在 Delphi 中处理 PDF 文件附件:AttachmentCount、Attachment、CreateAttachment、DeleteAttachment、路径清理以及就地保存