这个页面的代码没跑起来。

直接从文件夹里打开 index.html,浏览器会拦下 JavaScript 模块,于是你选好一份 PDF 之后,页面不会有任何反应。改用 http 把这个文件夹提供出去:

powershell -ExecutionPolicy Bypass -File serve.ps1

然后打开 http://localhost:8080/。

PDF 涂黑 字是删掉的,不是盖上一个黑块

字从文件里删掉,然后再搜一遍这个文件来证明。

语言: 简体中文
查看源码
你的文档在浏览器里处理,无须上传处理。

你选的那份文档,打开、读取、修改、写回,全都在这台机器的内存里完成,用的是从这个地址发来的代码。这里根本没有能做上传的东西,这一页的另一头也没有服务器可以接收。文件不会离开这个标签页,你搜的那些词也不会。

实时检查: 检查中…

离线: 检查中…

别听我们说。打开开发者工具,盯着网络面板,然后涂黑点什么。没有任何一条请求带着页面、词或者文件名。或者干脆断网,照样能涂。

1 选 PDF

2 说清什么要走

把词打进去,姓名、地址、案号都行,它们出现的每一处都会连着所在的那一行列在下面。到第 4 步之前什么都不会被拿走,你没勾的东西也永远不会被拿走。

这些是模式,而一个模式分不清电话号码和案号。卡号和 IBAN 会用它们自己的校验位核对;其余的只是列给你看,绝不替你勾上,而且每一条命中都值得亲眼看一下。

或者去找那些通常比较敏感的东西

3 读这一页,从上面挑词

这是文档里实际存着的文字,顺序是读的人复制时会得到的顺序,而那跟它印出来的顺序不一定一样。点一个词就是拿掉它,再点一下就是留下它。这里划了横线的就是要消失的。

按 Tab 键移到单词,再按 Enter 键或空格键切换是否将其删除。

4 拿掉这些词

在每个词原来的位置画一个黑块 好让读的人看出有东西被拿走了。这里的黑块是装饰,不是涂黑本身,因为它被画出来之前,字早就从文件里没了。把它关掉,词就只是消失,留下它们原来占的那块空。

同样的词也从文档其余部分拿走 书签、批注、便签,以及表单域里填过的内容。从页面上拿掉、却留在某个书签里的词,不算拿掉。文档属性不受这个开关影响,反正都会走;阅读器用来代替页面字符去复制的那段替换文本也一样。这两样都是文档自己在说那个词,不是别处存了一份副本。

丢掉附件和会运行的东西 一份 PDF 可以在自己内部装下整个文件,也可以装下打开时就运行的 JavaScript。这两样都没法拿你要删的词去搜,而读一份文档也用不着它们。

以 Markdown 查看

怎么涂黑一份 PDF,让那些词真的消失

  1. 选 PDF。一次只处理一份文档,这是故意的。涂黑是一件必须一页一页看过去的活,而一个让你在这份文件里勾词、又悄悄把它用到另一份上的工具,正是错的东西被发出去的那条路。文件由浏览器直接从你的硬盘读取。
  2. 说清什么要走。把词打进去,姓名、地址、案号都行,它们出现的每一处都会连着所在的那一行、带一个勾选框列出来。框旁边那些检测项会去找电子邮箱、卡号、IBAN、身份证号和社保号,以及电话号码。它们只是列给你看,绝不替你勾上,因为一个模式分不清电话号码和案号。
  3. 读这一页,从上面挑词。这一栏显示的是文档里实际存着的文字,顺序是读的人复制时会得到的顺序。点任何一个词就是拿掉它,再点一下就是留下它。划了横线的就是要消失的,所以这一步既是挑选也是复核,按下按钮之前每一页都值得这么过一遍。
  4. 拿掉它们,再读那行写着已经查过的字。字被删掉,它们空出来的宽度保留着,你要的话上面画一个黑块,同样的词也会从书签、批注、表单域和文档属性里拿走。然后做好的文件会在这里重新打开、重新搜一遍。要是你拿掉的某个词还搜得到,你拿不到下载,只会拿到一句说明这件事的话。

说得更细的版本

怎么把 PDF 涂黑,让文字真的消失 在 PDF 阅读器里画的黑块,通常把词原封不动地留在了下面,复制粘贴就能拿回去。真正的涂黑拿掉的是什么,词在页面之外藏身的四个地方,以及发出去之前怎么检查一个文件。

常见问题

这跟在 PDF 阅读器里画个黑块有什么不一样?

在阅读器里画的方块是一个批注,一个带位置的对象,存在页面旁边。它下面的文字分毫未动。谁把那块区域选中按复制、谁把文件在别的程序里打开、谁拿任何一个文本提取器过一遍,都能把词拿回去。有些阅读器提供的「redact」命令确实会真的执行删除,也有好几款只提供画方块。这个工具没有什么方块可以挪开:字是从页面的绘制指令里切掉的,而那个黑块,如果你留着它,是事后画在一处早就空了的位置上。

我怎么知道那些词真的没了?

因为这个工具会在你的机器上查一遍,并且把数量给你看。文件写完之后,它会被这一页上同一个读取模块重新打开,每一页重新读,每一个书签、批注、表单域和属性都收集起来,再把你拿掉的每一个词搜一遍。结果那一行会写清原来有多少、现在还剩多少。答案要是不对,这一次就失败,什么都不给下载。你也可以事后自己查:在任何阅读器里按 Ctrl+F 搜那个词。

拿掉一个词,这一页别的地方会移位吗?

不会。文字是靠一支笔在页面上往前推着画出来的,所以删掉五个字符,照常理会把这一行剩下的部分往左拽五个字符。被删部分的确切宽度会从字体自己的度量里量出来,再作为一条字距指令放回去,那条指令只挪笔,不画任何东西。表格的列还是对齐的,合计还在它自己的表头下面。

扫描出来的文档能涂黑吗?

图不能,而且它照实说,不装。扫描件是一页纸的照片,上面的词是像素,没有可拿走的文字。不过扫描件常常还带着一层看不见的文字,是扫描仪的 OCR 写在图上面、为了让这一页可以搜索的。这个工具会找到那一层,从里面拿掉你挑的内容,并在页面上告诉你图没有变。于是搜索和复制再也找不到那个词,而看着这一页的人还是读得到。要处理图本身,图片涂黑会去覆盖像素。

文档里那些不在页面上的部分呢?

也一起处理,因为涂黑漏掉的通常正是那里。同样的词会从书签、批注和便签里拿走,从表单域里填过的内容里拿走,从给屏幕阅读器的文字里拿走,也从阅读器用来代替页面上那些字符去复制的替换文本里拿走。最后这一样存在的意义是让连字和行末断开的词能正确复制,而它里面可以装下一整句话。文档属性和 XMP 包整个删除。附件和文件打开时会运行的东西全部丢弃,因为这两样都没法拿你要删的词去搜。

我的文档会被上传吗?

不会。文件的读取、修改和写出全都由你自己的浏览器在你自己的硬件上完成。这个工具根本没有服务器那一半,页面的 Content-Security-Policy 里写着它能联系的每一个地址,没有一个属于本站。你在搜索框里打的字,是拿来跟这个标签页内存里的文本比对的,它也不去任何地方。

为什么不能像别的工具那样在页面上拖一个框?

因为画出一页来意味着一个完整的 PDF 渲染器,字体、渐变、透明度、混合模式全都要,那是一兆以上的引擎要去取来运行,而本站根本不发这种东西。这件事反倒正合适:拖一个方块选中的是纸上的一块区域,而纸上的一块区域跟它下面的文字不是同一样东西,黑块那个失误正是从这里开始的。你拿到的是文档的文字,按阅读顺序排好,每个词都可以点。而且这也是唯一一种能告诉你「眼前这些词到底是不是文字」的视图,一张页面的图片说不出这一点。

做好的文件到哪儿都打得开吗?

打得开。输出写成 PDF 1.5,或者你给的那份文件所需要的最高版本,而 1.5 是 2003 年以后出的每一个阅读器都懂的。页面上的东西没有一样被重新编码:字体、图片和矢量图形逐字节原样通过,所以留下的文字还跟原来一样可以选中、可以搜索。

它能打开带密码的 PDF 吗?

不能,而且这是故意的。加密的文档会被拒收,并附上一句说明,密码是空的时候也一样,而很多扫描仪和复印机就是那样存的。去掉一个文件的保护,跟从里面拿走几个词是两件事,一个悄悄替你做掉的工具,做的是你没要求过的事。

有大小限制吗?要钱吗?

工具里没有写死任何限制。限制是你自己的机器:处理期间文档放在内存里,所以笔记本吃下几百兆不会有意见,再往上某处就开始吃力了。免费,没有账号,不用登录,也没有试用期。本站靠广告养活,广告那边拿不到关于你文档的任何东西。

断网能用吗?

能。把页面加载一次,然后断网,它照样能用。这也是证明什么都没被上传的最简单办法。要是有个工具把你的文档送出去让别人涂,拔掉网线的那一刻它就停了。