前言 Introduction

在傳輸或分享 PDF 文件時,有時會需要移除或改變文字的可搜尋/可複製性,以避免資訊被輕易提取。
儘管 PDF 本身支援設定權限來限制複製或編輯,但這些權限通常可以被輕易繞過。舉例像 ILovePDF 等線上服務都能輕易移除這些限制。
因此,本文旨在進一步破壞 PDF 中文本的結構,使其無法輕易被搜尋或複製,達到更高的混淆效果(本文不討論加密、密碼保護與數位簽章等認證保護機制)。然而,這些方法會在可恢復性、可存取性、檔案大小與閱讀體驗等方面產生權衡。 同樣需要注意的是,這些方法並非絕對安全,仍有可能被 OCR 等高級技術手段破解。

方法概覽

本文涉及混淆 PDF 文字的幾種常見方法如下表所示:

方法說明優點缺點
平面化 (Flattening)將 PDF 內容轉換為圖片,然後再將圖片嵌入回 PDF。- 簡單易實現
- 文字層級完全破壞
- 極大幅增加檔案大小。
- 文件中的影像與文字將一併被轉換與壓縮,可能影響閱讀體驗。
- 文字無法被選取,不利於添加註解。
文字轉外框 (Text to Outlines)將所有文字轉換為向量圖形外框。- 相對文件平面化,檔案大小較小且可維持向量品質。
- 適用於需要保持高解析度的文件。
- 文字層級完全破壞
- 大幅增加檔案大小。
- 文字無法被選取,不利於添加註解。
移除 ToUnicode 表格移除 PDF 中的 ToUnicode 表格,使文字無法被正確映射到 Unicode 字符。- 保持文字層級,對檔案大小影響最小。
- 文字仍可被選取,但無法正確複製。
- 若要進一步提升混淆效果,可能需要專門軟體進行處理。
浮水印覆蓋 (Watermark)在文字上添加透明或半透明的浮水印,干擾文字的選取與複製。儘管不對文字層級進行破壞,但可與其他方法結合使用,提升混淆效果。- 幾乎不影響檔案大小。
- 操作最為簡單。
- 可與其他方法結合使用。
- 混淆效果有限,文字仍可被選取與複製。
- 可能影響閱讀體驗。

工具說明

  • Ghostscript 是一款強大的開源 PDF 處理工具,支援多種操作系統。
    為提供 PDF 轉檔、合併、分割、渲染等常見 PDF 操作的命令列工具。但其參數較為複雜,為簡化說明,本文直接提供命令列範例,適用於 Windows 環境 (gswin64c)。若使用其他作業系統,請將命令中的 gswin64c 替換為對應的 Ghostscript 可執行檔名稱 (如 Linux 為 gs)。
    以下代碼以 Ghostscript 版本 10.06.0 為基準撰寫,其他版本/構建可能會存在差異,請參考官方文件。
  • qpdf 是一款專注於 PDF 結構操作的開源工具,支援加密、解密、拆分、合併等功能。

方法實作 Methods Implementation

平面化 (Flattening)

平面化是將 PDF 內容轉換為圖片,然後再將圖片嵌入回 PDF 的過程。
這種方法會完全破壞文字層級,使其無法被搜尋或複製。
使用 Ghostscript 進行平面化的基礎命令如下:

# 使用 Ghostscript 實作 PDF 平面化。其中,input.pdf 為輸入檔案名稱,output.pdf 為輸出檔案名稱。
gswin64c -dSAFER -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -dPDFSETTINGS=/printer -dNoOutputFonts -dColorImageResolution=300 -sOutputFile=output.pdf input.pdf

檔案大小由於平面化過程中圖片的嵌入,通常會大幅增加。
為此,可以透過調整圖片壓縮參數來控制檔案大小與品質的平衡。一般操作中,可以使用以下參數來控制圖片品質:

  • dPDFSETTINGS 選項可設定為以下值以控制輸出品質:
    • /screen:適用於螢幕顯示,檔案大小較小,品質較低。
    • /ebook:適用於電子書閱讀器,品質中等。
    • /printer:適用於列印,品質較高。
    • /prepress:適用於專業列印,品質最高。
  • dColorImageResolution 圖片解析度,單位為 DPI,數值越高,圖片品質越好,但檔案大小也會增加。
    • 常見設定為 150 (螢幕)、300 (印刷) 或 600 (高品質印刷)。

然而,由於平面化會將所有內容轉換為圖片,會將原本的影像與文字一併轉換與壓縮,在原始影像品質要求較高的文件中,可能會影響閱讀體驗。

文字轉外框 (Text to Outlines)

將文字轉換為向量圖形外框是另一種常見的混淆方法,在破壞文字層級的同時,能夠保持最高的向量品質。

使用 Ghostscript 進行文字轉外框的基礎命令如下:

# 使用 Ghostscript 實作 PDF 文字轉外框。其中,input.pdf 為輸入檔案名稱,output.pdf 為輸出檔案名稱。
gswin64c -dSAFER -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -dNoOutputFonts -sOutputFile=output.pdf input.pdf

同樣地,文字轉外框會增加檔案大小,但通常檔案大小增幅不如平面化明顯。

移除 ToUnicode 表格

移除 PDF 中的 ToUnicode 表格,使文字無法被正確映射到 Unicode 字符,是一種較為輕量的混淆方法。這種方法能夠保持文字層級,對檔案大小影響小。 本方法原理是將 PDF 轉換為 PostScript 格式,該格式不使用 PDF 的 ToUnicode 表格描述文字。而後再將 PostScript 轉換回 PDF,透過參數 -dToUnicode=false 來避免重新生成 ToUnicode 表格。

使用 Ghostscript 移除 ToUnicode 表格的基礎命令如下:

# 使用 Ghostscript 移除 PDF 中的 ToUnicode 表格。其中,input.pdf 為輸入檔案名稱,out.pdf 為輸出檔案名稱。
# 第一步:將 PDF 轉換為 PostScript 格式
gswin64c -dBATCH -dNOPAUSE -sDEVICE=ps2write -sOutputFile=temp.ps input.pdf
# 第二步:將 PostScript 轉換回 PDF,移除 ToUnicode 表格
gswin64c -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -dEmbedAllFonts=true -dSubsetFonts=true -dCompressFonts=true -dToUnicode=false -sOutputFile="out.pdf" "temp.ps"
# 最後刪除中間檔案
del temp.ps

完成後,輸出的 PDF 將不包含 ToUnicode 表格。可開啟 PDF 文件,嘗試選取並複製文字,會發現複製的內容變成亂碼。

本文亦將此方法撰寫為 bash 腳本如下供參考:

#!/usr/bin/env bash
# 使用 Ghostscript 進行 PDF 混淆處理
# 需求:gswin64c.exe(Ghostscript for Windows 64-bit)
# 並且將此腳本與 gswin64c.exe 放在同一目錄下
# 待處理的 PDF 檔案也需放在同一目錄下
 
read -e -p "請輸入要處理的 PDF 檔案名稱(可用 TAB 補齊):" input_file
 
if [ -z "$input_file" ]; then
echo "未輸入任何檔案名稱,程式結束。"
exit 1
fi
 
if [ ! -f "$input_file" ]; then
echo "找不到檔案:$input_file"
exit 1
fi
 
base_name=$(basename "$input_file")
name_no_ext="${base_name%.*}"
out_temp="out_temp.ps"
out_final="output_${name_no_ext}.pdf"
 
# Generate temporary PostScript file
./gswin64c.exe -dBATCH -dNOPAUSE -sDEVICE=ps2write -sOutputFile="$out_temp" "$input_file"
 
# Generate final PDF without OCR
./gswin64c.exe -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile="$out_final" -dEmbedAllFonts=true -dSubsetFonts=true -dCompressFonts=true -dToUnicode=false -dCompatibilityLevel="1.7" "$out_temp"
 
# Remove temporary PDF if it exists
if [ -f "$out_temp" ]; then
rm -f "$out_temp"
fi
 
echo "完成!輸出檔案:$out_final"

補充-去除 Metadata

前文所述方法主要針對文字內容進行混淆,但有時候 PDF 文件中可能包含敏感的 Metadata(如作者、標題、關鍵字等資訊),這些資訊也可能需要被移除以保護隱私。 可以使用 qpdf 工具來移除 PDF 文件中的 Metadata。

使用 qpdf 移除 Metadata 的基礎命令如下:

# 使用 qpdf 移除 PDF 中的 Metadata。其中,input.pdf 為輸入檔案名稱,output.pdf 為輸出檔案名稱。
qpdf --linearize --remove-metadata --remove-info --object-streams=generate input.pdf output.pdf

執行後,輸出的 PDF 將不包含任何 Metadata 資訊。可開啟 PDF 文件,檢查其屬性以確認 Metadata 已被成功移除。

風險與注意事項

  1. 可還原性:上述方法雖然能有效混淆文字,但仍有可能被 OCR 等技術手段破解。而且,為避免混淆後無法修改內容,建議在混淆前保留原始文件備份。
  2. 可存取性:破壞文字層級可能會影響文件的可存取性,對於需要使用輔助技術(如螢幕閱讀器)的使用者來說,可能會造成困難。
  3. 法律與合規性:在某些情況下,移除文件中的文字資訊可能涉及法律或合規性問題,特別是當文件包含敏感或受保護的資訊時。並且,不得藉此方法來規避版權保護審查或應用於非法用途。