PDF 工具箱
PDF 这类文件有个共同点:里面装的常常是身份证、合同、工资条、病历、报价单—— 有法律效力、有身份信息、泄露了没法撤回。 所以这里的三件事放在同一个页面:合并拆分、清元数据、涂黑敏感内容,全部在你自己的浏览器里完成, 文件一个字节都不发出去。
市面上做这三件事的在线工具,几乎都要先把文件传上去,处理完给你一个下载链接。 站方说「两小时后自动删除」——你验证不了。本地处理绕开了整个问题:没有上传,就不存在「对方会不会删」。
三个功能各自是独立的标签页,互不影响;打开时只加载你要用的那一个。
上传 PDF
上传 PDF
合并 / 拆分
合并 / 拆分:把页面原样搬过去
不是洁癖。是因为 PDF 这个文件类型太特殊了。
图片传个风景照无所谓,但 PDF 里装的经常是身份证、银行卡、工资条、合同、病例。 这些文件的共同点:有法律效力、有身份信息、泄露了没法撤回。
你把扫描件传给一个在线工具站,技术上会发生这些事:文件落在对方服务器磁盘上、 可能经过 CDN 中转、可能被写进访问日志、可能被备份到另一个地方。 站方说「自动删除」,你验证不了。这不是说对方一定在骗人,而是你没法确认。
本地处理绕开了整个问题:没有上传,就不存在「对方会不会删」这件事。
本地处理 vs 在线处理
| 对比项 | 本工具(本地) | 典型在线工具 |
|---|---|---|
| 文件去向 | 只在你的内存里 | 上传到对方服务器 |
| 断网能用吗 | 能,页面加载完就行 | 不能 |
| 处理速度 | 看你电脑,不排队 | 看服务器,免费档常排队 |
| 文件大小限制 | 看你内存,通常很宽松 | 免费档常有 10-20MB 卡口 |
| 要不要注册 | 不要 | 常见「注册后才能下载」 |
| 水印 | 没有 | 免费档常见 |
两个模式怎么用
合并:把几个 PDF 放进列表,用 ↑ ↓ 调顺序,然后点合并。 列表顺序就是最终页序,排最前的文件在最前面。
拆分:放进一份 PDF,填要保留的页码。
写 1-3,5 表示「要第 1 到第 3 页,再加上第 5 页」,输出一份新 PDF。
想每页各成一个文件,用「拆成单独文件」——所有单页会打成一个压缩包给你。
页码从 1 开始数,跟你在 PDF 阅读器里看到的一致。
说清几个限制,免得你白等
- 加密的 PDF 打不开。设了打开密码的文件会被直接拒绝。这是故意的——猜密码不是这个工具该干的事。请先用原密码解密,再拿来处理。
- 超大文件可能卡住。处理在内存里做,几百 MB 的文件在老电脑上可能很慢甚至失败。合并很多文件时留意一下内存占用。
- 只搬页面,不重排内容。合并拆分是搬运原页面,不改动页面里的文字和图片。所以合并后各页尺寸可能不一致(原文件多大就多大),这是正常的。
- 不做 OCR,也不压缩画质。扫描件不会因为过一遍这个工具就变清晰。
处理合同、证件这类文件时,建议断网操作一遍,更有说服力:页面加载完就拔网线,功能照常。
元数据清除
为什么「清完要复检」这件事值得单独讲
我拿一个自己造的测试文件验证过这个流程:一个 PDF 同时带 Info 字段和 XMP 流。 只删 Info 字典的话,用文本方式搜文件内容,作者名和软件名依然能在 XMP 里原样搜到。 而大多数在线「PDF 去属性」工具做的正好就是只删 Info。
所以这个工具下载前会再做一次 PDFDocument.load(),把输出文件当陌生文件重新读一遍,
拿 getTitle() / getAuthor() / getProducer() 和 Metadata 流存在性逐项核对,
结果直接打在页面上。你看到的「已清干净」是复检结果,不是我的承诺。
它清不掉什么(先说清楚,省得你白试)
| 内容 | 能不能清 | 说明 |
|---|---|---|
| 文档属性 / XMP | 能 | 本工具的主功能。作者、标题、软件、时间、公司名都在这里。 |
| 内嵌附件 / 书签 | 能 | 勾选后一并移除,附件是最容易夹带原文的通道。 |
| 正文里的可见文字 | 不能 | 那是内容不是元数据。正文里写了名字,清元数据不会让它消失,这个工具不负责改内容。 |
| 扫描件图像里的人脸/证件 | 不能 | PDF 里的图像就是图像,元数据清除动不了像素。 |
| 数字签名 | 不能(会跳过) | 已签名的 PDF 只要字节变化签名就失效。本工具检测到签名会直接跳过并告诉你,不假装成功。 |
| 加密(有密码)的 PDF | 不能 | 需要密码才能解。工具不会尝试绕过——绕过产出的文件容易内容错乱。请先用原软件解除密码。 |
顺序上的一个坑:先清元数据,再加签名
如果你打算把 PDF 发给需要签章的场景,顺序必须是先清元数据、再走签署流程。 反过来做,任何字节改动都会让签名校验失败,文件在对方那里会显示「签名无效」—— 这比元数据泄露更麻烦。工具跳过带签名的文件,就是为了不替你做这个错误决定。
清理之后:为什么值得再复检一次
页面里所有解析、删除、重新保存都由 pdf-lib 在你的浏览器里完成。库文件托管在本站
(/js/pdf-lib.min.js),不走第三方 CDN,所以连「有人打开了这个页面」这件事都不会外泄。
断网状态下,页面加载完之后功能照常可用。
这不是洁癖。会用到这个工具的文件,通常正是身份证、合同、简历、报价单、病历这一类—— 它们共同点是泄露了没法撤回。把这种文件上传到一个不知道谁在运营的服务器上, 本身就是比元数据更大的风险。
隐私涂黑
怎么做的:把文字绘制指令从内容流里摘掉
PDF 的一页正文,本质是一串「画字」指令。一个典型的中文句子在文件里长这样(已解压):
% 定位到某处,开始文本块 BT /F4 20 Tf % 用 F4 字体,20 号 1 0 0 -1 48 88 Tm % 文本矩阵:把坐标原点挪到 (48,88) <EB> Tj % 画第一个字 19.99 0 Td <10> Tj % 右移 19.99,画第二个字 19.99 0 Td <35> Tj % ← 这一句落在你的框里 ET
黑框工具的做法是:在这段指令后面再加一条「画个实心矩形」。 原指令还在,所以文字层还在。
这个工具的做法是:先把流解压,逐条指令算出它画出来的字在页面上的实际包围盒
(要连 cm 变换矩阵、Tm 文本矩阵、字号、字宽、字距 Tc/Tw、
水平缩放 Tz、上标 Ts 一起算,光看坐标是不够的),
凡是包围盒和你框选区域相交的,把那条指令整段从流里剪掉,
重新压缩写回,最后把旧的流对象整个删掉。
最后那一步很多人会漏。只把页面指向新流、不删旧流,旧对象仍然躺在文件里,
只是没人引用它 —— 用 strings file.pdf 之类的办法照样能捞出来。
本工具会检查该流是否被别的页共享引用,只删「仅此页使用」的,避免把别的页弄坏。
凭什么让你相信「真删了」:独立复检
这页有个别的工具没有的环节。处理完之后,工具把输出的文件当成一个陌生文件重新打开,
用 pdf.js(Mozilla 的 PDF 引擎,和我上面算几何的那套代码完全独立)
重新提取文字层,把每个文字条目换算成坐标,再看有没有落在你框选的区域里。
结果直接打在页面上:
- 复检通过 —— N 处框选区域里的文本层已空,提取不到任何残留;
- 复检发现残留 —— 逐页告诉你还剩几个字、长什么样。这时候它会明说别发出去,不会糊过去;
- 复检失败 —— 直接报错,不假装成功。
用两套不同的引擎互为对照,是因为「我自己算的那套」如果算错了,自己验自己是验不出来的。 这一点我觉得比多画十个功能都重要。
它做不到什么(先说清楚,省得你白试)
| 内容 | 能不能处理 | 说明 |
|---|---|---|
| 正文里的文字 | 能,真删 | 本工具的主功能。删除后文本层提取不到,不是被盖住。 |
| 文档属性 / 作者 | 能 | 默认勾选一并清掉。否则正文涂了、属性里还写着作者名。 |
| 扫描件、截图里的字 | 不能 | 那是图像像素,不是文字对象。黑块能盖住它,但像素还在文件里, 把图导出来就看见了。工具检测到该页有图像时会明确警告你。 扫描件要彻底处理,只能重新截图/重印后再遮挡。 |
| 表单域里的填写内容 | 不能 | 那是注释对象(AcroForm),不在页面内容流上,本工具不碰。填过的表单请先在阅读器里「展平」。 |
| 已数字签名的文件 | 不能 | 改任何一个字节都会让签名失效。这是签名的定义,不是工具的缺陷 —— 正确顺序是先涂黑,再签名。 |
| 有打开密码的文件 | 不能 | 本工具不猜密码、不上传。请先在本地解密再来。 |
自动识别:只认四种号码,别指望它认名字
「自动识别号码」会扫全页文字,按格式找出手机号、18 位身份证号、16–19 位银行卡号、邮箱, 自动加上框选。全角数字会先归一化再匹配,所以「138…」这种也能认。
但它认不出姓名、地址、公司名、病情描述——那些没有固定格式,靠正则猜只会又漏又错。 自动识别只是省掉重复拖框的手,标出来之后仍然要你自己逐个人工核对。 页面在自动标记后会这么提醒你,不会让你以为点一下就够了。
典型会用到的场合
- 简历外发:离职证明、银行流水、身份证复印件上的号码和住址;
- 合同给第三方:报价单里的成本价、其他客户的名字、内部审批人工号;
- 投稿 / 评审:双盲评审要求删掉作者和单位,而页眉里往往还有;
- 病历 / 检查报告:转给第二家医院时,先抹掉不想让对方看到的既往记录;
- 发到群里的截图:PDF 转图之前先涂,比事后拿画笔涂更稳。
涂黑与遮挡的区别:文字层里还有没有
解析、改写、复检全部在你浏览器里跑。用到的两个库都托管在本站
(/js/pdf-lib.min.js、/js/pdf.min.js),不走第三方 CDN,
所以连「有人打开过这个页面」都不会外泄。页面加载完之后断网也照常能用。
这不是洁癖。会需要涂黑的文件,共同点正是泄露了没法撤回: 身份证、合同、病历、报价单。把这种文件上传到一个不知道谁在运营的服务器上, 本身的风险就比你要涂掉的那行字更大。