有界段落编辑
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 都抑制自动启动阅读器