Python使用fitz合并PDF报错:save to original must be incremental
搞定PDF合并的错误问题&替代方案
嘿,我来帮你理清楚这个问题,顺便给你几个可行的实现方法~
先说说你遇到的错误根源
你当前的代码有两个关键问题:
- 逻辑搞反了:你把
test2.pdf的内容插入到主文档doc1里,结果最后去保存doc2,这完全不是你要的效果啊!你应该保存合并后的doc1才对。 - 原文件保存的限制:就算你真的要保存打开的原文件(比如
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




