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);