這個頁面的程式碼沒跑起來。

直接從資料夾裡開啟 index.html,瀏覽器會攔下 JavaScript 模組,於是你選好一份 PDF 之後,頁面不會有任何反應。改用 http 把這個資料夾提供出去:

powershell -ExecutionPolicy Bypass -File serve.ps1

然後開啟 http://localhost:8080/。

PDF 塗黑 字是刪掉的,不是蓋上一個黑塊

字從檔案裡刪掉,然後再搜一遍這個檔案來證明。

語言: 繁體中文
檢視原始碼
你的文件不會上傳。這裡根本沒有伺服器。

你選的那份文件,開啟、讀取、修改、寫回,全都在這臺機器的記憶體裡完成,用的是從這個地址發來的程式碼。這裡根本沒有能做上傳的東西,這一頁的另一頭也沒有伺服器可以接收。檔案不會離開這個分頁,你搜的那些詞也不會。

即時檢查: 檢查中…

離線: 檢查中…

別聽我們說。開啟開發者工具,盯著網路面板,然後塗黑點什麼。沒有任何一條請求帶著頁面、詞或者檔名。或者乾脆斷網,照樣能塗。

1 選 PDF

2 說清什麼要走

把詞打進去,姓名、地址、案號都行,它們出現的每一處都會連著所在的那一行列在下面。到第 4 步之前什麼都不會被拿走,你沒勾的東西也永遠不會被拿走。

這些是模式,而一個模式分不清電話號碼和案號。卡號和 IBAN 會用它們自己的校驗位核對;其餘的只是列給你看,絕不替你勾上,而且每一條命中都值得親眼看一下。

或者去找那些通常比較敏感的東西

3 讀這一頁,從上面挑詞

這是文件裡實際存著的文字,順序是讀的人複製時會得到的順序,而那跟它印出來的順序不一定一樣。點一個詞就是拿掉它,再點一下就是留下它。這裡劃了橫線的就是要消失的。

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 嗎?

不能,而且這是故意的。加密的文件會被拒收,並附上一句說明,密碼是空的時候也一樣,而很多掃描器和影印機就是那樣存的。去掉一個檔案的保護,跟從裡面拿走幾個詞是兩件事,一個悄悄替你做掉的工具,做的是你沒要求過的事。

有大小限制嗎?要錢嗎?

工具裡沒有寫死任何限制。限制是你自己的機器:處理期間文件放在記憶體裡,所以筆記本吃下幾百 MB 不會有意見,再往上某處就開始吃力了。免費,沒有帳號,不用登入,也沒有試用期。本站靠廣告養活,廣告那邊拿不到關於你文件的任何東西。

斷網能用嗎?

能。把頁面載入一次,然後斷網,它照樣能用。這也是證明什麼都沒被上傳的最簡單辦法。要是有個工具把你的文件送出去讓別人塗,拔掉網線的那一刻它就停了。