为什么仅仅用黑框是不够的
大多数 PDF 工具允许用户通过在敏感文本上绘制黑色矩形来进行“遮盖”(redact)。矩形在屏幕上隐藏了文字,但底层的字符仍然保留在文件的内容流中。任何人都可以选中隐藏的文本、复制它,或者运行一个简单的脚本来提取它。换句话说,数据仍然存在;黑框仅仅是一个视觉遮盖物。
开发者面临的问题
作者需要一个完全在浏览器中运行的 PDF 编辑器,而无需将文件上传到服务器。这一限制使得无法依靠后端服务来剥离文本。现有的客户端解决方案只是在内容上方添加一个形状,这使得原始文本保持完整。挑战在于如何在永久删除文本的同时,保持操作的高效性和文档的可用性。
选择性页面栅格化:核心思路
该方案并非将整个 PDF 转换为图像——这一步骤会使文件体积膨胀并破坏可搜索性——而是仅对包含遮盖内容的页面进行栅格化。这些页面会变成位图;而其他所有页面仍保持为矢量 PDF,从而保留了文本选择、搜索功能以及较小的文件体积。
这种方法生成的文档感觉很正常:19 个页面保持清晰且可搜索,而那个敏感页面则是一个纯像素图像,隐藏的信息已不再存在。
实现可靠转换的三条实用规则
- 以三倍比例渲染 – 位图以页面正常分辨率的三倍生成。低分辨率的渲染效果在周围的矢量页面旁边会显得模糊,这可能会引起怀疑,或者仅仅是显得不够专业。
- 将所有视觉元素合并到位图中 – 在页面栅格化之前,将注释、签名、水印和遮盖矩形进行复合处理。在同一页面上将矢量注释与栅格图像混合使用可能会干扰 PDF 阅读器,导致显示错误。
- 锚定到视口而非像素 – 注释与页面的视口坐标绑定。当用户缩放时,元素会保持对齐,而不会发生偏移或比例不一致,否则可能会暴露底层的文本。
防止竞态条件
渲染每个页面都是一个异步任务。如果用户快速调整浏览器窗口的大小,多个渲染任务可能会重叠,导致画布上出现损坏或重叠的帧。实现中引入了每页渲染令牌(render token):每个新的渲染请求都会使之前的令牌失效,从而导致旧任务自行取消。其结果是,即使在 UI 快速变化的情况下,也能获得流畅、无故障的体验。
权衡取舍是什么样的
将页面转换为位图可以移除任何隐藏文本,但也会丢弃搜索或复制该页面内容的能力。
未来可能的方向
总结
一个简单的黑框并不会删除数据,它只是将其隐藏。通过仅将需要遮盖的页面转换为高分辨率位图,并让 PDF 的其余部分保持基于矢量的方式,仅限浏览器的编辑器可以永久擦除敏感文本,同时保持文档的快速、可搜索和私密性。这种方法在安全性与可用性之间取得了平衡,但用户在遮盖大量页面时,应注意对文件大小和可搜索性的累积影响。
