你是否曾經需要與他人分享銀行對帳單?或許你需要專案的使用者分享一份給你進行問題排除。
我遇到了這個問題。我正在開發一個可擴展的工具,用於將英國銀行對帳單轉換為關聯式資料庫,但我只能存取自己銀行的對帳單。我該如何取得其他銀行的對帳單,而不用要求人們傳送敏感的個人識別資訊給我?
我需要匿名化的銀行對帳單,保留其版面配置和字型編碼,以便對帳單能以與原始文件完全相同的方式處理。我也希望預設情況下能打亂所有內容,但保留日期和交易類型的保護。最後,如果能將同一帳戶的多份對帳單配置為始終打亂為相同的假值,那就太好了!
因此,我建立了一個 Python 工具,能夠正確地執行此操作——在保留 PDF 外觀完全不變的情況下,打亂敏感資料。
PDF 編輯的問題
傳統的編輯工具通常會做兩件事之一:
- 黑框 — 覆蓋不透明的矩形。文字仍在下方(只要我的解析器處理它就能看到)。實際上不安全。
- 文字替換 — 交換文字,但會破壞字型編碼、版面配置或兩者兼而有之。PDF 不僅看起來不對勁,而且對帳單組成的任何細微變化都可能使我的設定檔失效,讓它們變得毫無用處。
兩者都不是理想的解決方案。我需要的是實際替換 PDF 內容串流中的位元組——告訴 PDF 檢視器要繪製什麼的原始指令——同時保留字型編碼和定位。
為什麼選擇 pikepdf?
我查看了三個 Python PDF 函式庫:
| 函式庫 | 層級 | 為什麼無法運作 |
|---|---|---|
| PyPDF2 | 高階 | 合併、分割、提取——沒有內容串流存取 |
| pdfplumber | 高階 | 我已經使用它進行文字提取,但它不修改內容串流 |
| pikepdf | 低階 | 直接存取內容串流運算子和字型編碼 |
pikepdf 讓你存取原始 PDF 運算子——Tj(顯示文字)、TJ(顯示帶定位的文字)、Tm(設定文字矩陣)。這就是實際文字所在之處,也是我需要進行更改的地方。
運作方式
核心概念很簡單:
- 解析 PDF 的內容串流為運算子
- 掃描 敏感模式(排序碼、帳戶號碼、IBAN、卡號)
- 替換 匹配的位元組為打亂的替代內容
- 寫回 修改後的內容串流
棘手的部分是: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 格式——我能新增的模式越多,這個工具就越有用。
任何問題或意見都非常歡迎。我很想知道你是否認為有更好的方法來解決這個問題,或者我可以對結構進行哪些更改來擴大這個專案的實用範圍。
0 Comments
Log in to join the conversation.No comments yet. Be the first to share your thoughts.