介绍
账单合并是一种工作流,使用 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、混合媒体、受密码保护的发票,还是需要裁剪附件至关键页面,库都能在几行代码内完成繁重的工作。
后续步骤: