Redaction
Redaction
本页介绍了如何永久删除 PDF 页面中的内容。Aspose.PDF 为 TypeScript 提供的 FOSS 提供了两种编辑工作流:一种是先标记后应用的两阶段流程,您可以在提交前进行审查;另一种是一键立即执行的流程。这两种方式均可在 Page 上用于单页,在 Document 上用于整篇文档。
标记并应用编辑
Page.AddRedact() 使用 /Redact 注释标记矩形区域——下方的内容保持不变,仍可复制选择。实际的删除只有在 Page.ApplyRedactions() 运行时才会发生:它会对页面上每个 /Redact 标记进行破坏性地重写内容流,绘制每个标记的覆盖层(其 /IC 填充和 /OverlayText),删除这些标记,并返回已应用的编辑数量。在调用 ApplyRedactions() 之后添加的标记将保持未应用。
page.AddRedact({
rect: [220, 550, 460, 566],
fill: [0, 0, 0],
overlayText: '[REDACTED]',
align: 'center',
fontSize: 9,
textColor: [1, 1, 1],
});
const applied = page.ApplyRedactions();
console.log('Redactions applied:', applied);立即编辑
Page.Redact() 和 Page.RedactText() 将标记与应用合并为一次调用:它们真正删除被覆盖的文本和图像,清理因删除而孤立的资源,并在每个区域上绘制不透明的标记框——无需单独的 ApplyRedactions() 步骤,也无需先进行审查。Page.Redact() 接受一个明确的 Rect 区域列表;Page.RedactText() 查找并编辑所有出现的搜索字符串或 RegExp,方式与 Page.SearchAnnotationText() 搜索相同。两者都接受一个 RedactOptions 对象,用于控制标记的 color,以及是否 scrubMetadata,以及是否 keepAnnotations 与已编辑区域重叠的内容。
由于它们会立即删除内容且没有审查步骤,当需要在提交前检查标记时,请优先使用 AddRedact() + ApplyRedactions();而当区域或搜索词已确定安全可删除时,则使用 Redact() / RedactText()。
编辑整个文档
相同的两种工作流在 Document 上也存在,作用域一次覆盖所有页面:Document.MarkRedactText() 标记所有页面中搜索词的每一次出现,Document.ApplyRedactions() 在文档中应用所有标记,Document.Redact() / Document.RedactText() 则立即编辑单页的区域或整个文档范围的搜索词,效果与它们的 Page 等价。
技巧与最佳实践
- 当编辑需要在生效前可审查时,使用
AddRedact()+ApplyRedactions();当这些区域已确认可以立即安全删除时,使用Redact()/RedactText()。 - 在调用
ApplyRedactions()之前,为页面添加所有的AddRedact()标记——随后添加的标记不会包含在该调用中,且保持未应用状态。 - 当被编辑的内容可能也出现在文档元数据(
/Info或 XMP)中时,在RedactOptions/ApplyRedactionsOptions中传递scrubMetadata: true。 RedactText()和MarkRedactText()使用与SearchAnnotationText()/Search相同的匹配规则,因此在那里的搜索字符串若未匹配成功,同样也无法进行编辑。
常见问题
| 问题 | 原因 | 修复 |
|---|---|---|
| 编辑标记没有效果 | Page.ApplyRedactions() 从未被调用 | 首先对每个标记调用 Page.AddRedact(),然后调用一次 Page.ApplyRedactions() |
| 标记后内容仍可恢复 | 该标记使用了 AddRedact()(仅标记),但未随后调用 ApplyRedactions() | 调用 ApplyRedactions(),或使用 Redact() / RedactText() 进行一次性删除 |
| 已编辑的文本会在提取的文档元数据中重新出现 | scrubMetadata 未设置 | 在 options 对象中传入 { scrubMetadata: true } |
ApplyRedactions() 返回 0 | 调用时页面上不存在 /Redact 标记 | 确认 AddRedact()(或 MarkRedactText())先运行且针对同一页面 |
FAQ
AddRedact 和 Redact 之间有什么区别?
AddRedact() 只标记一个区域——内容仍然存在且可复制选择,直到 ApplyRedactions() 运行。Redact() 在同一次调用中删除内容,无需单独的应用步骤。
我可以通过搜索文本而不是指定坐标来进行 Redact 吗?
是的。RedactText() 查找并立即编辑每个搜索字符串或 RegExp 的出现;MarkRedactText() 也会执行相同操作,但仅标记匹配项,留待后续的 ApplyRedactions() 调用。
Redact 是在整个文档范围内工作,还是一次只对单页进行?
两者皆是。Page.Redact() / Page.ApplyRedactions() 及其兄弟在单页上操作;Document.Redact() / Document.ApplyRedactions() 及其兄弟跨所有页操作。
在被编辑的区域附近的批注也会被删除吗?
只有在你允许的情况下。将 keepAnnotations: true 传入 options 对象,以保留与已编辑区域重叠的注释,而不是将它们与该区域一起删除。
API Reference 摘要
| 类/方法 | 描述 |
|---|---|
Page.AddRedact() | 在矩形区域上标记一个 /Redact 注释,但暂不删除内容 |
Page.ApplyRedactions() | 破坏性地删除页面上所有标记的区域,并返回已应用的计数 |
Page.Redact() | 立即删除给定区域中的内容,无需单独的应用步骤 |
Page.RedactText() | 查找并立即编辑每个搜索字符串或 RegExp 的出现 |
Page.MarkRedactText() | 查找并标记(不应用)每个搜索字符串或 RegExp 的出现位置 |
Document.ApplyRedactions() | 在整个文档中应用每个 /Redact 标记 |
Document.Redact() / Document.RedactText() | 立即在单页上编辑区域,或在所有页面上编辑搜索词 |
Document.MarkRedactText() | 在所有页面上标记搜索词的每一次出现 |