THotPDF.SubsetLoadedFonts Method
Rewrites supported embedded TrueType, OpenType CFF and raw CFF programs so they retain only glyphs reachable from loaded-document content
声明
function SubsetLoadedFonts(
const Options: THPDFLoadedFontSubsetOptions;
out AInfo: THPDFLoadedFontSubsetInfo): Integer; overload;
function SubsetLoadedFonts(
out AInfo: THPDFLoadedFontSubsetInfo): Integer; overload;
Reachability
始终会扫描页面内容,包括显示文本的操作符和资源局部的字体选择
IncludeFormXObjects 会递归纳入被调用的 Form XObject,沿用继承的资源,并带有循环检测和有界的嵌套深度
IncludeAnnotationAppearances 会纳入正常、悬停和按下外观以及状态字典;启用后还会跟随这些外观使用的 Form XObjects
每个字符码先按其声明的编码解析,再经过 Type0 CMap 和 CIDToGIDMap,最终到达稳定的嵌入字形 ID;现有的 CID 映射和 ToUnicode 数据不会被重新编号
TrueType 复合字形保留其递归的组件闭包;COLR v0 层和 COLR v1 字形绘制依赖则保留所有被引用的轮廓
Type 1 简单字体按 Standard、WinAnsi、MacRoman 或 MacExpert 编码加 Differences 解析,然后以 PFB、PDF 拆分二进制或十六进制 PFA 数据重写未使用的 CharStrings,不改变嵌入流的布局
Options
| 字段 | 默认 | Meaning |
|---|---|---|
MinimumSavingsBytes | 1 | 采用某个候选方案所要求的最小编码流缩减量 |
EnforceSignaturePermissions | True | 文档包含签名域时,拒绝一切重写 |
IncludeFormXObjects | True | Trace invoked nested Form XObjects |
IncludeAnnotationAppearances | True | Trace annotation appearance streams and states |
Result and safety
返回值是被重写的嵌入字体程序数量,AInfo 则报告扫描覆盖情况、映射或解码失败、已用字形、节省的字节数以及对签名的影响
只要有任何可达的字符码无法映射、格式不受支持、子集化失败,或编码后的候选方案达不到节省阈值,该字体程序就会保持逐字节不变
Type 1 重写遇到多个二进制 PFB 段、无法解析的显式简单字体编码、缺失的请求字形名或不受支持的 CharString 布局时会失败关闭;未知的 COLR 版本和没有稀疏轮廓表的 sfnt 程序同样保持不变
所有候选都会在改动之前分析,默认签名策略返回零并以RefusedBySignaturePolicy已置位;禁用该策略后允许重写,并会设置SignaturesInvalidated,只要已签名文档发生更改
示例
var
Info: THPDFLoadedFontSubsetInfo;
begin
PDF.LoadFromFile('input.pdf');
if PDF.SubsetLoadedFonts(Info) > 0 then
PDF.SaveToFile('subset.pdf');
end;