PDFium Delphi Component Docs

CommitIncrementalSave 方法

组件: TPdf  ·  单元: PDFium
把上次提交之后所做的修改追加为一个新的 PDF 修订版

语法

function CommitIncrementalSave(Stream: TStream; out Info: TPdfIncrementalCommitInfo): Boolean;

Stream完整文档(包括基线以及迄今追加的每个修订版)的目标流;传入 nil 将引发 EPdfError
InfoTPdfIncrementalCommitInfo 接收对象与字节计数、旧的和新的 xref 偏移、修订版数量、加密与验证状态,以及文件持久化结果
Result完整且经过验证的输出写入成功时为 True

 

function CommitIncrementalSave(const FileName: string; out Info: TPdfIncrementalCommitInfo): Boolean;

FileName目标文件,通过同一目录下的持久化边车文件原子替换
Info与流重载相同的 TPdfIncrementalCommitInfo 报告,在这些文件阶段成功后设置 Durable 和 ReplacedAtomically
Result经过验证的边车文件替换目标成功时为 True

说明

将活动文档与上次提交时捕获的状态(第一次提交则与基线)进行差异比较,并追加发生更改的对象和一个新的交叉引用节。较早的字节从不会被重写,因此每个先前的修订版都保持字节一致且可恢复

AppendedByteCount 仅是新修订版的大小,而 PreviousOutputByteCount 和 OutputByteCount 界定不可变前缀和完整结果。PreviousXrefOffset 和 OutputXrefOffset 标识修订版链,ChangedObjectCount 报告差异比较发现的对象数量

每个候选结果都会通过稀疏修订版边界检查、严格的独立重新打开、页数与安全处理器检查,以及(若存在)PDF MAC 验证。Encrypted 和 Validated 报告这些属性

文件重载会在目标旁写入临时文件,flush 后关闭并重新打开,再次验证后提交原子替换。Windows 请求 write-through 替换;Unix 在替换前确认目录 flush 可用,并在 rename 后 flush 父目录

替换前失败会保留原目标,并恢复会话基线和修订数。Unix 上 rename 成功后目录 flush 失败,会从内部 FPdfPlatform 单元抛出 EPdfOutputCommitError:输出已经替换,Info.ReplacedAtomically=True、Info.Durable=False,会话保留已提交的基线,避免后续编辑追加到过时输出

Durable 表示平台所请求的各 flush 阶段已成功完成,不认证存储硬件或文件系统断电后的行为。使用同一原子替换机制的其他文件保存 API,也可能在替换后抛出这种已提交输出的异常;调用方应把该阶段与保留原输出的失败区分开

在没有打开会话的情况下调用会引发 EPdfError,因此必须先调用 BeginIncrementalSave

参见

BeginIncrementalSave, EndIncrementalSave, IncrementalSaveActive, SaveAs