はじめに

請求書の統合は、GroupDocs.Merger for Python を使用して複数の財務書類を 1 つの PDF に結合するワークフローです。財務チームは請求書と納品書、サービスレポート、保証条件などを一緒に送信する必要がありますが、手作業でファイルをつなげるとエラーが発生し、時間が無駄になります。GroupDocs.Merger はこのプロセスを自動化し、すべての添付ファイルが正しい順序で配置され、必要に応じて保護され、きれいな PDF として配信されます。

このチュートリアルでは、以下を学びます。

  • プレーン PDF の請求書を任意の数のサポートファイルと結合する方法。
  • JPG 画像や DOCX 契約書など、混在フォーマットの取り扱い方。
  • パスワードで保護された請求書を開き、添付ファイルを追加し、再度暗号化する方法。
  • 大容量の添付ファイルから必要なページだけを選択して、最終バンドルをコンパクトに保つ方法。

前四半期に、会計システムがパスワード保護された請求書を生成し、法務チームが複数ページの保証 DOCX を追加したという正に同じシナリオに直面しました。以下のコードで 5 分未満で解決できました。

パスワード保護された請求書と他の文書を結合するのはいつ意味がありますか?

多くの企業はコンプライアンス要件を満たすために、請求書を保存時に暗号化します。請求書を顧客に送付し、同時に保護されていない添付ファイル(領収書、条件、画像など)を添える必要がある場合、結合のために元のパスワードを解除し、最終バンドルに再度適用します。GroupDocs.Merger は LoadOptions で解除パスワードを指定し、追加ファイルを結合し、AddPasswordOptions で結合後の PDF を保護できます。これにより、機密性を保ちつつ、1 つの開きやすい文書を提供できます。

前提条件

  • Python 3.8+(.NET ブリッジ経由)
  • GroupDocs.Merger for Python – インストール方法:
pip install groupdocs-merger
  • 請求書 PDF(invoice.pdf)と添付ファイルのパス一覧。
  • (オプション)元の請求書と出力 PDF のパスワード。

手順 1: PDF 添付ファイルの基本的な統合

最もシンプルなケースは、PDF 請求書と他の PDF、画像、Word ファイルを結合することです。API は非 PDF 入力を自動的に PDF に変換してから結合します。

import groupdocs_merger as gm

# Paths to source files
invoice = "invoice.pdf"
attachments = ["delivery_note.pdf", "service_report.pdf"]
output = "billing_package.pdf"

with gm.Merger(invoice) as merger:
    for path in attachments:
        merger.join(path)  # Normalises each file to PDF and appends it
    merger.save(output)

重要ポイント:

  • gm.Merger はホスト文書(請求書)でインスタンス化します。
  • join() は任意のサポート形式を受け付け、ライブラリが変換を処理します。
  • save() は結合された PDF を指定パスに書き出します。

手順 2: 混在フォーマットの添付ファイルの統合

実務の請求パッケージには、スキャン画像(JPG)や法的契約書(DOCX)が含まれることがよくあります。同じコードが機能するのは、GroupDocs.Merger がすべての添付ファイルをオンザフライで PDF に正規化するためです。

attachments = ["receipt.jpg", "warranty_terms.docx", "extra_clause.pdf"]
output = "billing_mixed.pdf"

with gm.Merger(invoice) as merger:
    for path in attachments:
        merger.join(path)  # JPG and DOCX are converted to PDF automatically
    merger.save(output)

なぜ重要か: すべてを PDF に変換することで、受取側が複数のビューアを使い分ける必要がなくなり、シームレスな体験を提供できます。

手順 3: パスワード保護された請求書の取り扱い

請求書が暗号化されている場合は、LoadOptions でパスワードを指定します。結合後は AddPasswordOptions を使って最終 PDF に再度パスワードを設定できます。

import io

invoice_password = "Inv$2026"
output_password = "Bill$2026"

load_options = gm.domain.options.LoadOptions(invoice_password)
buffer = io.BytesIO()

# Open the protected invoice, join attachments, write to memory buffer
with gm.Merger(invoice, load_options) as merger:
    for path in attachments:
        merger.join(path)
    merger.save(buffer)

# Re‑secure the merged document
add_pwd = gm.domain.options.AddPasswordOptions(output_password)
buffer.seek(0)
with gm.Merger(buffer) as merger:
    merger.add_password(add_pwd)
    merger.save(output)

重要ポイント:

  • LoadOptions が元の PDF のロックを解除します。
  • 結合結果は最初にメモリストリーム(BytesIO)に書き込まれます。
  • AddPasswordOptions が最終ファイルに新しいパスワードを適用します。

手順 4: 添付ファイルから特定ページだけを選択

場合によっては、添付ファイルの一部だけが必要になることがあります(例: 長いサービスレポートの最初の 2 ページ)。PageJoinOptions を使って 1 ベースの範囲を指定します。

page_picks = [
    ("service_report.pdf", 1, 2),   # Include pages 1‑2 only
    ("terms_and_conditions.pdf", 3, 3)  # Include only page 3
]
output = "billing_selected_pages.pdf"

with gm.Merger(invoice) as merger:
    for path, first, last in page_picks:
        options = gm.domain.options.PageJoinOptions(first, last)
        merger.join(path, options)
    merger.save(output)

結果: 最終 PDF には請求書と選択されたページだけが含まれ、バンドルが軽量に保たれます。

ベストプラクティスとヒント

  • パフォーマンス: 大量バッチの場合、必要なオプションだけを有効にし(例: 不要なフォーマット変換を回避)、処理を高速化します。
  • メモリ管理: 常に with 文を使用して、Merger がリソースを速やかに解放するようにします。
  • セキュリティ: 結合後に必ず暗号化を再適用し、元の請求書の機密性を維持します。
  • ファイル制限: