有界段落编辑

HPDFParagraphReflow 在显式源矩形内选定已加载字形中心,并在同一页面的显式目标矩形内写入新测量的段落

验收能力范围覆盖 Delphi Win32/Win64 与 Windows FPC/Lazarus;实测字体生成使用既有的文档外观构建器及其已安装字体支持

选择、layout 与保留

坐标是未旋转的 PDF 页面用户空间点,y 轴向上;两个矩形必须有限、尺寸为正且不超过 14400 点,并须落在页面 MediaBox 内

选择可以跨越多条原始基线与多个页面内容流;literal、十六进制、TJ、单引号与双引号文本操作数会在选定的字符码边界处重写

保留的前后缀、文本 advance 与原始数值 kerning 调整保持原位;源文本从真实操作数中移除,而不是用背景矩形遮住

嵌套 Form XObject 使用其 Matrix 与 BBox;每次选定的调用及其祖先资源被私有复制,保留共享原始 Form 的其他调用与其他页面

Form BBox 之外的字形中心被排除;部分源字形边界默认拒绝,RejectPartialSourceGlyphs = False 则在中心被选中时显式允许移除整个字符码

Appearance 选择已安装字体、样式、尺寸、颜色、内边距、对齐与溢出策略;目标宽度控制换行,shrink-to-fit 报告真实的 EffectiveFontSize

生成的字形几何被独立解释并对照目标矩形检查;本有界辅助器把旋转固定为零、不透明度固定为一

空替换会删除选定的源文本;设置 RequireSourceText = False 可向空的源区域插入段落

碰撞证据

未选中的非空白文本、XObject 与内联图像、绘制的路径边界与注释矩形会与生成的替换字形边界比较

每个碰撞标识其种类、页面空间边界、可选的相邻文本与替换字形索引;即使返回的碰撞列表达到上限,总数也会保留

路径控制点、变换后的 Form 裁剪边界、描边宽度与 miter 限制产生保守包围盒;绘制范围未知的 shading 保守地占据整个目标矩形

这种几何测试可能高报透明图像、未绘制注释区域、曲线、被裁剪路径与旋转 Form 包络;它不证明逐像素的墨迹分离,也不检查任意裁剪路径、混合组合成或字体轮廓

RejectCollisions = True 在不产生变更的情况下拒绝重叠替换;设为 false 则保留报告并允许调用方自行决定重叠策略

预览、提交与回滚

HPDFPreviewParagraphReflow 返回调用方自有的密封计划、语义替换 layout、指纹与碰撞证据,然后回滚生成的文档对象

HPDFCommitParagraphReflow 重复有界分析,只在源内容、Form 边界、注释几何与替换字体几何仍与预览匹配时才原子应用计划

计划属于同一活跃文档实例;用完请释放,全程保持文档存活,加载另一个文档或更改选定内容后重新生成预览

THPDFParagraphReflowSession 增加已应用的审阅状态:Apply 暴露已编辑文档用于提取或 Render,Commit 发布它,Rollback 或析构恢复原始对象图

会话请串行使用;文档必须比会话存活更久,Pending 为 true 期间不得交错其他对象图事务或编辑调用

回滚恢复内存中的文档状态;已保存的外部文件仍由调用方负责

有限工作与失败行为

默认限制为 64 MiB 已解码内容、64 MiB 生成流、100000000 工作单元、100000 字形、250000 Token、12 层 Form、256 次 Form 调用、256 条返回碰撞与 100000 个克隆资源节点

编码字符串字节在字形解释之前对照剩余字形限制检查,因此多字节字符编码可能保守地消耗超过其可见字形数的预算

已解码与生成限制覆盖辅助器处理的内容;生成流大小在发布前检查,但不代表进程峰值内存限制,也不约束全部已安装字体构建器分配

取消通过内容 Token 化与辅助器循环协作,并在既有字体生成调用周围检查;在调用完成前保留 Token

缺失源、无效输入、碰撞、过期计划、不受支持内容、耗尽预算、取消与普通失败都返回 false 并带显式状态,保留原始对象图

选定竖排或单字文本、循环或未解析 Form、不受支持的绘制 XObject 类型以及含签名字段的文档会被拒绝;保留签名的增量编辑需要单独的工作流

示例

Options := HPDFDefaultParagraphReflowOptions;
Options.Appearance.FontName := 'Arial';
Options.Appearance.FontSize := 11;
Source.Left := 55; Source.Bottom := 659;
Source.Right := 350; Source.Top := 714;
Target := Source;
Plan := nil;
try
  if HPDFPreviewParagraphReflow(Document, 0, Source, Target,
    'The Supplier must deliver signed monthly reports.', Options,
    Plan, Report, CancellationToken) then
    if HPDFCommitParagraphReflow(Document, Plan, Report, CancellationToken) then
      Document.SaveLoadedDocument('reviewed-contract.pdf');
finally
  Plan.Free;
end;

验收与保存输出

专用 Delphi 与 FPC runner 使用真实已加载 PDF fixture,覆盖多基线段落、部分操作数、嵌套共享 Form、被裁剪 Form 文本、宽度与字体变更、碰撞种类、取消与对象图回滚

重复的文件/文件与流/文件保存保留已编辑对象图;全新未变更的已加载文档保持其精确源字节,注入的输出写失败之后可以成功重试

Tests/Fixtures/ParagraphReflow/loaded-repeat-save.pdf 隔离保存回归且不使用段落辅助器:加载、插入标记、保存两次,然后独立读取第二个文件

运行 Tests/Delphi/Run-ParagraphReflowTests.ps1 -Platform Win64 或 Tests/FPC/Run-ParagraphReflowTests.ps1 -Platform Win64,另一架构选择 Win32

可选的 Python 验证器 Tests/Fixtures/ParagraphReflow/verify_output.py 用 PyMuPDF 提取真实已保存 Unicode 文本并 Render 已编辑页面;每个 runner 都抑制自动启动阅读器

相关主题

有界段落编辑 · Options · Report