【要約】国税庁の PDF は「抽出できない」のではなく AES-256 で暗号化されている [Zenn_Python] | Summary by TechDistill
> Source: Zenn_Python
Execute Primary Source
// Problem
開発者が国税庁のPDFを自動処理しようとした際、予期せぬエラーや空のデータに直面する。具体的には以下の問題が発生する。
- ・pypdfで読み込む際に、暗号化ライブラリの不足によるDependencyErrorが発生する。
- ・テキストが空で返されるため、スキャン画像(OCRが必要な状態)と誤認しやすい。
- ・誤った判断により、不要なOCR処理による計算リソースの浪費を招く。
// Approach
著者はPDFの内部構造を解析し、適切な復号手順を導き出した。以下のステップで解決策を提示している。
- ・/Encrypt 辞書を解析し、AES-256(/V 5 /R 6)であることを特定した。
- ・ユーザーパスワードが空であることを確認し、pypdfにcryptographyを導入して復号した。
- ・qpdf --decrypt を用い、暗号化を解除した汎用的なPDFを作成する手法を示した。
- ・HTML版については、iconvを用いてCP932からUTF-8へ変換する手順を提示した。
// Result
適切な手法により、OCRを使わずに大量のテキストを正確に抽出できた。得られた成果は以下の通りである。
- ・72ページのPDFから、約9.9万文字のテキストを高速に取得した。
- ・pypdf + cryptography の構成により、コード変更なしで抽出が可能になった。
- ・qpdf により、あらゆるツールで扱える非暗号化PDFの作成を実現した。
Senior Engineer Insight
> 現場では「データが取れない」事象に対し、安易にOCRへ逃げる設計が散見される。しかし、本件のように暗号化が原因であれば、OCRは精度とコストの両面で最悪の選択となる。PDFの内部仕様を正しく解釈する実装は、パイプラインの堅牢性とコスト効率を劇的に向上させる。また、官公庁のデータは文字コードの罠も多いため、HTTPヘッダに依存しない堅実な実装が求められる。