介紹

帳單合併是一種工作流程,使用 GroupDocs.Merger for Python 將多個財務文件合併成單一 PDF。財務團隊常需要同時傳送發票、送貨單、服務報告與保固條款,但手動拼接檔案會產生錯誤且浪費時間。GroupDocs.Merger 可自動化此過程,確保每個附件正確排序、可選擇加密,並以一個乾淨的 PDF 交付。

在本教學中您將學會如何:

  • 將純 PDF 發票與任意數量的輔助檔案合併。
  • 處理 JPG 圖片與 DOCX 合約等混合格式。
  • 開啟受密碼保護的發票、加入附件,並重新套用加密。
  • 從大型附件中僅選取特定頁面,以保持最終檔案的精簡。

我在上個季度正好遇到這種情況:我們的會計系統產生了受密碼保護的發票,法律團隊又加入了多頁的保固 DOCX。以下程式碼在不到五分鐘內解決了問題。

什麼時候適合將受密碼保護的發票與其他文件合併?

許多企業為了符合合規要求,會對靜態的發票進行加密。當需要將發票與未加密的附件(收據、條款、圖片)一起傳送給客戶時,必須先移除原始密碼以便合併,然後再對最終的捆綁檔案重新加密。GroupDocs.Merger 允許您透過 LoadOptions 提供解鎖密碼,加入額外檔案,最後使用 AddPasswordOptions 為合併後的 PDF 加密。這樣既能保持機密性,又能交付單一、易於開啟的文件。

前置條件

  • 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:從附件中選取特定頁面

有時只需要附件中的部分頁面(例如只要冗長服務報告的前兩頁)。使用 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 能即時釋放資源。
  • 安全性: 合併後重新加密,以維持原始發票的機密性。
  • 檔案限制: GroupDocs.Merger 支援最高 2 GB 的 PDF;較大的檔案可能需要先分割再合併。

結論

GroupDocs.Merger for Python 提供簡潔的 API,能將分散的帳單文件轉換為單一、專業的 PDF 套件。無論是純 PDF、混合媒體、受密碼保護的發票,或是需要裁剪附件至關鍵頁面,該函式庫都能在幾行程式碼內完成繁重工作。

後續步驟:

  • 文件說明中探索完整的支援格式清單。
  • 了解如何為合併後的 PDF 加入浮水印或數位簽章(API 參考)。
  • 前往 GitHub 查看更多進階範例專案(範例倉庫)。

其他資源