介绍

账单合并是一种工作流,使用 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 上查看示例项目,获取更高级的使用场景(示例仓库)。

附加资源