THotPDF.PreviewLoadedPageTextReplacement 方法
用内嵌 Unicode 字体准备替换文本,测量每个匹配,并返回可审计的计划,而不修改已加载的文档
function PreviewLoadedPageTextReplacement(PageIndex: Integer;
const Needle, Replacement: UnicodeString; MatchCase: Boolean;
const Options: THPDFLoadedTextReplacementOptions;
out Plan: THPDFLoadedTextReplacementPlan): Boolean;
选项与结果
THPDFLoadedTextReplacementOptions.Default 使用 Arial、匹配处原始字号、测得的宽度,以及 1.25 倍字号的高度,并启用原子拒绝
Appearance 选择字体、样式、颜色、对齐和内边距;UseMatchFontSize=False 使用请求的字号,正的 BoxWidth 和 BoxHeight 提供显式的换行框
Appearance.OverflowPolicy 选择 ltopReject、ltopClip 或 ltopShrinkToFit;裁剪只保留生成器能放下的文本,shrink-to-fit 到 MinFontSize 为止
THPDFLoadedTextReplacementPlan 携带请求、选项、源指纹、计数和 THPDFLoadedTextReplacementResults 数组
每个 THPDFLoadedTextReplacementResult 报告字形索引、原始位置、盒子尺寸、生效字号和一个 THPDFLoadedTextReplacementStatus 值:ltrsReady、ltrsApplied、ltrsRejected 或 ltrsRolledBack,并附拒绝或回滚原因
MaxMatches、MaxGlyphs、MaxContentTokens、MaxContentBytes、MaxGeneratedBytes 和外观文本上限约束着源解析、输出和复制的字体资源
几何与原子性
生成的替换会使用文档的字体回退链、ShapingFeatures、脚本 auto-shaping 开关,以及 GSUB script 和 language 选择;预览之前先配置好这些设置,应用计划时保持相同设置
除请求的解析和生成输出预算之外,每个替换外观还把不同的 shaping 字体选择限制在 256 个以内,累计原始字体数据限制在 64 MiB 以内
替换在原始文本流内切换字体,保持周围文本可搜索,并恢复原始的笔矩阵和行矩阵,使后续字形和换行保持原位
支持使用水平、非奇异几何的页面直接文本,包括页面变换、文本缩放、rise、TJ、单引号/双引号操作符,以及同一基线上跨越相邻操作数的匹配
跨越基线的匹配、竖排书写、奇异变换、不平衡内容、缺失字形和包含签名字段的文档都会被拒绝;Form XObject 内的文本不在该 API 的匹配范围内
Atomic=True 时,任何一个被拒绝的匹配都会回滚所有就绪匹配;Atomic=False 时,就绪匹配可以应用而被拒绝的匹配保持不变,只要有一个匹配被拒绝,布尔结果就保持 False
预览使用并回滚一个嵌套的图事务,同时保留调用方已有的事务;即使内容最终恢复,它也可能使文档缓存失效并触发文档修改通知
提交
把计划传给 ApplyLoadedPageTextReplacement,它会在图事务中应用请求之前重新验证内容与字形度量指纹
内容变化之后必须重新计算计划;过期的计划会抛出 EInvalidOpException,不会应用其中的替换
Options := THPDFLoadedTextReplacementOptions.Default;
Options.Appearance.OverflowPolicy := ltopShrinkToFit;
if PDF.PreviewLoadedPageTextReplacement(0, 'Original', NewText,
True, Options, Plan) then
if PDF.ApplyLoadedPageTextReplacement(Plan, Applied) then
PDF.SaveLoadedDocument(TargetPath);