PDF に隠された添付ファイルはありますか? pypdf を使用して配信前に埋め込みファイルをインベントリする
PDF には添付ファイルが埋め込まれている場合があり、同じ名前の添付ファイルが複数のコンテンツに対応している場合があります。配信前に pypdf を使用してインベントリを行う: 抽出順に各添付ファイルに独立した ID を割り当て、元の名前をメタデータとして残し、ディスクへの書き込みや実行を行わず、部品が欠落している配信パッケージを顧客に受け取らせません。
・ ファイル名に「../」などのパス文字が含まれる場合、書き込みに失敗したり、セキュリティ上の危険が生じる可能性があります。
- 20 を超える添付ファイルがある場合、または暗号化または署名が含まれている場合は、自動プロセスを一時停止し、手動レビューに移行する必要があります。
PDF に添付ファイルが埋め込まれている場合があります。納品前に確認されていない場合、お客様が受け取った書類パッケージが紛失している可能性があります。この記事は、PDF 埋め込みファイルをバッチで抽出または検証する必要がある開発者およびドキュメント配信担当者を対象としています。同じ名前の添付ファイルや異常なファイル名が原因でサイレント ファイル損失が発生する理由と、pypdf を使用して添付ファイルを安全にカウントする方法について説明します。
これを読むと、次の 3 つのことができるようになります。各添付ファイルに一意の ID を割り当てること、元の名前をディスクに直接書き込むのではなくメタデータとして保持すること、受諾フォームを使用して自動的に処理できるケースと手動レビューが必要なケースを区別することです。
この記事の例はすべて合成サンプルであり、コードは隔離された環境でのサンプル検査に合格していますが、これはすべての実際のファイルや製品の効果を保証するものではありません。重要書類を扱う前に原本を保管してください。
配信前に PDF 添付ファイルをカウントするにはどうすればよいですか?一文の結論
pypdf を使用して、抽出された順に各添付ファイルに独立した ID を割り当てます。元の名前はメタデータとしてのみ保持され、ディスクに直接書き込まれません。例外は、承認フォームに従って手動で確認されます。
| あなたの状況 | 推奨される実践方法 | 理由 |
|---|---|---|
| PDF 内に同じ名前の添付ファイルが存在する可能性があります | 抽出順に独立した ID を割り当て、すべてのコンテンツを保持 | 同名の添付ファイルはリスト形式で保存されます。名前を直接書き込むと相互に上書きされます。 |
ファイル名に ../ またはパス区切り文字が含まれています | ディレクトリ構造を取り除き、ファイル名のみをメタデータとして取得します | 直接書き込みは失敗する可能性があり、セキュリティ リスクを引き起こす可能性もあります |
| 添付ファイルが多いか、暗号化または署名が存在します | 自動プロセスを一時停止し、専任のレビュー担当者に転送します。 | 添付ファイルが 20 個を超える場合、または暗号化または署名がある場合は、自動化された結果を手動で確認する必要があります。 |
| 納品前に完全性を確認する必要がある | 受付フォームと照らし合わせて項目ごとにチェックします | 自動抽出は配信前の手動検証に代わるものではありません |
同じ名前の添付ファイルがサイレントにファイルを失うのはなぜですか?
ファイルが埋め込まれた PDF を処理する場合、最も隠れた問題はエラーではなく、処理が「正常に」実行された後にファイルが不足することです。
reader.attachmentsをループして元の名前でディスクに直接書き込む場合、PDF にreport.xlsxという名前の 2 つのファイルが埋め込まれている場合、後者のファイルが前のファイルを上書きします。- ファイル名に
../やシステムの予約文字が含まれている場合、書き込みに失敗し、セキュリティ上のリスクが発生する可能性があります。 - 公式の pypdf ドキュメントには、添付ファイル名には任意の文字を含めることができ、同じ名前の添付ファイルはリスト形式で保存されると記載されています。
したがって、サニタイズされていないバッチ抽出ロジックは、非標準の PDF に遭遇した場合には信頼性が低くなります。
合成サンプルを使用して検証可能な境界入力を構築する
抽出ロジックの堅牢性を検証するには、出所不明の本番ファイルに依存するのではなく、管理された合成サンプルを構築する必要があります。例では、PDF に 3 つの添付ファイルが含まれていると想定しています。
- 通常ファイル
data.csv; - 最初のものと同じ名前ですが、内容が異なる
data.csv。 - ファイル名には、パス トラバーサル特性を持つ
..\secret.txtが含まれています。
これら 3 つの添付ファイルは、それぞれ通常の抽出、同名の競合、およびパスの異常という 3 つのタイプの状況をカバーします。
安全な抽出とファイル名のサニタイズ例を実行します。
依存関係についてはインポート リストを参照してください。このコードはメモリ内で入力を構築し、ディスクに書き込んだり、添付ファイルのコンテンツを実行したりしません。
from io import BytesIO
from pypdf import PdfReader, PdfWriter
writer = PdfWriter()
writer.add_blank_page(width=200, height=200)
writer.add_attachment("data.csv", b"row-one")
writer.add_attachment("data.csv", b"row-two")
writer.add_attachment("../secret.txt", b"synthetic secret")
out = BytesIO()
writer.write(out)
out.seek(0)
reader = PdfReader(out)
records = []
for name, contents in reader.attachments.items():
for content in contents:
records.append({"id": len(records), "source_name": name, "bytes": content})
assert len(records) == 3
assert len({r["id"] for r in records}) == 3
assert {r["bytes"] for r in records if r["source_name"] == "data.csv"} == {b"row-one", b"row-two"}
assert any(r["source_name"] == "../secret.txt" for r in records)
このコードは単なる論理的なデモンストレーションであり、pypdf のすべての添付機能を完全にカバーしているわけではないことに注意してください。実稼働環境では、大きなファイルのストリーミング読み取りやエンコードの異常などの状況も考慮する必要があります。
📊 コアの比較
| 練習する | 同じ名前の添付ファイル | ファイル名にはパス区切り文字が含まれています | 説明する |
|---|---|---|---|
| 元の名前でディスクに直接書き込みます | 後者は前者をカバーします | 書き込みが失敗し、セキュリティリスクを引き起こす可能性もあります | 静かにファイルを失うのは簡単です |
| 抽出順に独立したIDを割り当てる | 各添付ファイルを個別に保管する | 元の名前はメタデータとしてのみ使用され、パスの書き込みには使用されません。 | 元の名前は今でも追跡できます |
🎯 どの方法があなたに適していますか?
少数の通常の添付ファイルのみを確認する必要がある場合
オリジナルを保存し、サンプル コードとともに抽出し、ファイルの内容を 1 つずつ比較します。
処理中の PDF に同じ名前の添付ファイルが含まれている可能性がある場合
独立した ID を抽出順に割り当て、ローカルのシリアル番号やサニタイズされた名前をグローバル キーとして使用しないでください。
添付ファイルが 20 個を超える場合、または暗号化または署名がある場合
自動プロセスを一時停止し、専用のレビュー担当者に転送します。
❓ よくある質問 (FAQ)
1. 同じ名前の添付ファイルをディスクに直接書き込めないのはなぜですか?
後で書き込まれたファイルは以前に書き込まれたファイルを上書きし、コンテンツが警告なしに失われます。
2. ファイル名にある ../ にはどのようなリスクがありますか?
直接書き込みは失敗する可能性があり、セキュリティ リスクを引き起こす可能性もあります。この記事では、ディレクトリ構造を取り除き、ファイル名のみをメタデータとして保持することを推奨しています。
3. 添付ファイルの内容が空であるか、非常に小さいです。まだ保存しますか?
受諾フォームの自動処理の推奨事項に従って、ログを記録してファイルを保存し、それがプレースホルダーであるか破損しているかを手動で判断する必要があります。
4. このコードはすべての pypdf 添付機能をカバーできますか?
できません。これは単なる論理的なデモンストレーションであり、大きなファイルのストリーミング読み取りやエンコードの例外などの状況は個別に考慮する必要があります。
受け入れ基準と手動レビューの境界
自動抽出は、配信前の手動検証に代わるものではありません。次の表は、一般的な例外とその処理方法を示し、コードで解決できるシナリオと手動介入が必要なシナリオを区別しています。
| 現象を観察する | 自動処理 | 手動レビュー |
|---|---|---|
| 同じ名前の複数の添付ファイル | シリアル番号プレフィックスを追加し、すべてのコンテンツを保持します | バージョンの反復か誤った埋め込みかを確認する |
| ファイル名にはパス区切り文字が含まれています | ディレクトリ構造を削除し、ファイル名のみを取得します | 悪意のあるペイロードが隠蔽されることを目的としているかどうかを確認する |
| 添付ファイルの内容が空であるか、非常に小さいです | ログ、まだファイルを保存 | プレースホルダーであるか破損しているかを判断する |
| ファイル名の文字化けまたは印刷できない文字 | アンダースコアに置換し、インデックスを保持します | 元の PDF メタデータ確認セマンティクスをバックトラッキングする |
| 添付ファイルの種類が拡張子と一致しません | 内容ごとに嗅ぎ分けるか、そのままにしておく | ドメインの専門家によって使用が決定される |
このテーブルは、コード デモンストレーション レベルでの検証に適しています。エンドツーエンドの効果をビジネス コンテキストと組み合わせる必要もあります。たとえば、契約書の添付ファイルが欠落していることは、ファイル名が間違っていることよりも深刻である可能性があります。添付ファイルの数が 20 を超える場合、または暗号化または署名がある場合は、自動プロセスを一時停止し、レビューのために専任担当者に転送する必要があります。
さらに読む
次のステップ
- 合成添付ファイル テスト ケースを CI パイプラインに追加します。
- 過去の配信ドキュメントのサンプルに対して精製抽出スクリプトを実行して、添付ファイルの整合性ベースラインを確立します。
- システム的な損失が見つかった場合は、ネットワークや権限の問題ではなく、名前の競合を優先します。
納品前に文書翻訳と組み合わせる方法
ファイルの分解、暗号化、または添付ファイルの処理は配信の準備の一部であり、翻訳がこれらのチェックに代わることはできません。元のコピーと処理リストを保持した後、翻訳のページ順序、リンク、コンテンツの整合性を評価します。
OmniDoc (製品ポータル)はマルチフォーマット文書翻訳ポータルを提供しており、公式 Web サイトでは OCR、用語集、対訳比較機能が導入されています。ファイルから直接作業を開始したいチームの場合、このパスは実際のサンプルを使用して評価できます。アップロード許可のある感度を下げたファイルを使用し、この記事のチェック項目を使用して結果を確認してください。この記事では、OmniDoc が記事内のオープン ソース ライブラリや内部アルゴリズムを使用しているとは主張していません。また、この例は製品のパフォーマンス テストに代わるものではありません。
📝 概要
配信前に PDF 添付ファイルをカウントする鍵は、各添付ファイルに独立した ID を割り当て、元の名前をメタデータとして保持し、例外がないか手動で確認することです。最初に合成サンプルを使用してプロセスを検証し、次に実際のドキュメントを使用してプロセスを検証します。


