Cover image for How to anonymise sensitive data in PDF documents with Python

Jason Farrar

你是否曾經需要與他人分享銀行對帳單?或許你需要專案的使用者分享一份給你進行問題排除。

我遇到了這個問題。我正在開發一個可擴展的工具,用於將英國銀行對帳單轉換為關聯式資料庫,但我只能存取自己銀行的對帳單。我該如何取得其他銀行的對帳單,而不用要求人們傳送敏感的個人識別資訊給我?

我需要匿名化的銀行對帳單,保留其版面配置和字型編碼,以便對帳單能以與原始文件完全相同的方式處理。我也希望預設情況下能打亂所有內容,但保留日期和交易類型的保護。最後,如果能將同一帳戶的多份對帳單配置為始終打亂為相同的假值,那就太好了!

因此,我建立了一個 Python 工具,能夠正確地執行此操作——在保留 PDF 外觀完全不變的情況下,打亂敏感資料。

PDF 編輯的問題

傳統的編輯工具通常會做兩件事之一:

  1. 黑框 — 覆蓋不透明的矩形。文字仍在下方(只要我的解析器處理它就能看到)。實際上不安全。
  2. 文字替換 — 交換文字,但會破壞字型編碼、版面配置或兩者兼而有之。PDF 不僅看起來不對勁,而且對帳單組成的任何細微變化都可能使我的設定檔失效,讓它們變得毫無用處。

兩者都不是理想的解決方案。我需要的是實際替換 PDF 內容串流中的位元組——告訴 PDF 檢視器要繪製什麼的原始指令——同時保留字型編碼和定位。

為什麼選擇 pikepdf?

我查看了三個 Python PDF 函式庫:

函式庫 層級 為什麼無法運作
PyPDF2 高階 合併、分割、提取——沒有內容串流存取
pdfplumber 高階 我已經使用它進行文字提取,但它不修改內容串流
pikepdf 低階 直接存取內容串流運算子和字型編碼

pikepdf 讓你存取原始 PDF 運算子——Tj(顯示文字)、TJ(顯示帶定位的文字)、Tm(設定文字矩陣)。這就是實際文字所在之處,也是我需要進行更改的地方。

運作方式

核心概念很簡單:

  1. 解析 PDF 的內容串流為運算子
  2. 掃描 敏感模式(排序碼、帳戶號碼、IBAN、卡號)
  3. 替換 匹配的位元組為打亂的替代內容
  4. 寫回 修改後的內容串流

棘手的部分是:PDF 字型編碼。不同的銀行使用不同的編碼策略:

  • Latin-1(單一位元組,簡單明瞭)
  • ToUnicode CMap(將字元代碼對應到 Unicode——現代 PDF 中常見)
  • Identity-H(CID 字型,多位元組——某些銀行軟體使用)

該工具處理這三種編碼,因此無論銀行使用哪種 PDF 產生器,打亂的文字都能正確渲染。

使用方式

一個函式,一個導入:

from bank_statement_anonymiser import anonymise_pdf

anonymise_pdf("statement.pdf", "anonymised.pdf")

Enter fullscreen mode Exit fullscreen mode

就是這樣。輸出 PDF 看起來與輸入相同,但敏感資料已被打亂。

哪些內容會被匿名化

該工具針對以下模式:

  • 排序碼(英國特定:XX-XX-XX 格式)
  • 帳戶號碼(英國 8 位數帳戶)
  • IBAN(國際銀行帳戶號碼)
  • 卡號(Visa、Mastercard 模式)
  • 商家名稱(可透過設定檔配置)

哪些內容不會被匿名化

  • 交易金額(因為我的依賴專案會根據總對帳單變動驗證交易行的金額)
  • 日期(涵蓋交易日期和對帳單日期的各種格式)
  • 交易類型(在 never_anonymise_system.toml 中指定,包含支援銀行的已知交易類型)

配置

你可以透過傳遞自己的 TOML 設定檔進一步自訂要匿名化的內容:

# always_anonymise.toml — 強制替換這些模式
"12-12-12" = "99-99-99"
"Jason Farrar" = "John Doe"

Enter fullscreen mode Exit fullscreen mode

# never_anonymise.toml — 保護這些片語
exclude = [
    "Balance Brought Forward",
    "Account Summary",
]

Enter fullscreen mode Exit fullscreen mode

系統使用基於排除的方法:預設情況下所有內容都會被打亂,然後你可以指定要保護的內容。

限制

這是英國特定的。排序碼、帳戶號碼和 IBAN 格式的正規表達式模式已包含英國銀行的格式。目前已成功測試於:

  • HSBC
  • Natwest
  • TSB
  • Halifax

它可能也適用於其他銀行,所以請試試看並告訴我!
其他銀行可能需要新增新的正規表達式模式,而且幾乎肯定會使用不同的交易類型。也可能存在我尚未遇過的其他字型編碼。
非常歡迎任何貢獻!

安裝

pip install uk-bank-statement-anonymiser

Enter fullscreen mode Exit fullscreen mode

有關安裝和使用的進一步說明,請參閱 README

開源

採用 MIT 授權。所有處理都是本地的——沒有網路請求、沒有帳戶、沒有資料收集。

GitHub: github.com/boscorat/uk-bank-statement-anonymiser

你是否也遇到過類似的 PDF 匿名化挑戰?我很想了解其他銀行的 PDF 格式——我能新增的模式越多,這個工具就越有用。

任何問題或意見都非常歡迎。我很想知道你是否認為有更好的方法來解決這個問題,或者我可以對結構進行哪些更改來擴大這個專案的實用範圍。