如何使用Python实现多个PDF文件的无压缩合并?
无压缩合并PDF的Python解决方案
问题原因
你当前使用的PyPDF2库默认开启了内容流压缩优化,合并输出时会自动压缩PDF内容,导致输出文件质量下降。
方案1:调整现有PyPDF2代码关闭压缩
直接修改PyPDF2的压缩参数即可实现无压缩合并,修改后代码如下:
from pathlib import Path import PyPDF2 merged_object = PyPDF2.PdfFileMerger() # 关闭全局压缩 merged_object.compress_content_streams = False for file_item in list_of_pdfs: file_path = Path(file_item) if file_path.suffix.lower() != '.pdf': file_path = file_path.with_suffix('.pdf') merged_object.append(PyPDF2.PdfFileReader(str(file_path.resolve()), strict=False)) # 输出路径需要指定完整的PDF文件名,不要仅传入目录 merged_object.write("merged_output.pdf") merged_object.close()
注意:如果使用的是2023年后发布的新版PyPDF2,库内类名已调整为小写格式,将PdfFileMerger替换为PdfMerger、PdfFileReader替换为PdfReader即可。
方案2:使用PyMuPDF(fitz)库实现更高保真的合并
如果PyPDF2调整参数后仍存在压缩问题,可以换用PDF处理精度更高的PyMuPDF库,该库默认不会对源PDF内容做额外压缩,合并后文件和原文件质量完全一致。
首先安装依赖:pip install pymupdf
合并代码如下:
from pathlib import Path import fitz list_of_pdfs = ["file1", "file2.pdf", "file3"] # 替换为你的文件列表 output_path = "merged_output.pdf" # 初始化空白PDF merged_pdf = fitz.open() for file_item in list_of_pdfs: file_path = Path(file_item) if file_path.suffix.lower() != '.pdf': file_path = file_path.with_suffix('.pdf') # 打开单份源PDF with fitz.open(str(file_path.resolve())) as src_pdf: # 全量插入源PDF内容,无压缩 merged_pdf.insert_pdf(src_pdf) # 保存合并结果,关闭压缩开关 merged_pdf.save(output_path, deflate=False) merged_pdf.close()
注意事项
- 输出路径需指定完整的PDF文件名,不要仅传入目录路径,避免写入失败
- 合并前可先校验源PDF可正常打开,避免源文件损坏导致合并异常
- PyMuPDF对加密PDF的兼容性优于PyPDF2,若源文件存在加密情况优先选择方案2
内容的提问来源于stack exchange,提问作者Nathan
相关产品推荐
相关产品推荐

