You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python使用fitz合并PDF报错:save to original must be incremental

搞定PDF合并的错误问题&替代方案

嘿,我来帮你理清楚这个问题,顺便给你几个可行的实现方法~

先说说你遇到的错误根源

你当前的代码有两个关键问题:

  1. 逻辑搞反了:你把test2.pdf的内容插入到主文档doc1里,结果最后去保存doc2,这完全不是你要的效果啊!你应该保存合并后的doc1才对。
  2. 原文件保存的限制:就算你真的要保存打开的原文件(比如doc2),PyMuPDF也要求必须加上incremental=True参数做增量保存,但这根本不是你当前需求的核心问题。

修正后的PyMuPDF(fitz)正确写法

按照你的需求——把test2追加到test1,保存为原主文档名称,正确代码应该是这样:

import fitz

# 打开主文档和要追加的文档
doc_main = fitz.open("test1.pdf")
doc_append = fitz.open("test2.pdf")

# 把待追加文档的所有页面插入到主文档的末尾
doc_main.insertPDF(doc_append)

# 保存合并后的主文档,直接覆盖原文件就行
# garbage=4 会清理文档里的无用内容,deflate=True 能压缩文件体积
doc_main.save("test1.pdf", garbage=4, deflate=True)

# 别忘了关闭文档对象,释放资源
doc_main.close()
doc_append.close()

换个库试试:用PyPDF2实现

如果你想换个更直观的工具,PyPDF2也是Python处理PDF的常用选择,代码逻辑更像“合并器”的思路:

from PyPDF2 import PdfMerger

# 创建一个合并器对象
merger = PdfMerger()

# 先加主文档,再加要追加的文档
merger.append("test1.pdf")
merger.append("test2.pdf")

# 把合并后的内容写入原主文档
with open("test1.pdf", "wb") as output_file:
    merger.write(output_file)

# 关闭合并器
merger.close()

小提醒

  • 操作前最好备份一下原PDF文件,万一代码出问题也不会搞丢原内容~
  • 如果你的PDF是加密的,得先解密才能合并,两个库都有对应的解密方法(比如PyMuPDF用doc.authenticate(密码),PyPDF2用decrypt(密码))。

内容的提问来源于stack exchange,提问作者Anfaaa

火山引擎 最新活动