如何加速PyPDF2多PDF文件合并?现有方案响应过慢求替代方法
原代码问题修正
首先你的代码存在路径拼接错误,这可能导致文件读取异常或不必要的性能损耗,修正后的代码如下:
import os from PyPDF2 import PdfMerger source_dir = r"C:\Users\Aparns\Downloads\speeddata" merger = PdfMerger(strict=True) for item in os.listdir(source_dir): # 兼容大小写后缀,且路径用os.path.join保证格式正确 if item.lower().endswith(".pdf"): file_path = os.path.join(source_dir, item) merger.append(file_path) # 直接生成目标文件,无需重复拼接源目录路径 output_path = os.path.join(source_dir, "Complete.pdf") merger.write(output_path) merger.close()
如果修正后合并速度仍无法满足需求,可尝试以下更高效的替代实现:
替代合并方案
1. 使用PyMuPDF(fitz)
PyMuPDF是目前Python生态中处理PDF速度最快的库之一,合并操作效率远高于PyPDF2,同时支持复杂PDF格式的兼容处理。
先安装依赖:
pip install pymupdf
合并代码示例:
import os import fitz # PyMuPDF别名 source_dir = r"C:\Users\Aparns\Downloads\speeddata" output_path = os.path.join(source_dir, "Complete.pdf") # 初始化空的合并文档 merged_pdf = fitz.open() for item in os.listdir(source_dir): if item.lower().endswith(".pdf"): file_path = os.path.join(source_dir, item) # 打开单个PDF并插入到合并文档 with fitz.open(file_path) as single_pdf: merged_pdf.insert_pdf(single_pdf) # 保存并关闭文档 merged_pdf.save(output_path) merged_pdf.close()
2. 使用pdfrw
pdfrw是轻量级PDF读写库,专注于PDF结构解析与生成,合并操作的性能优于PyPDF2,适合简单合并场景。
先安装依赖:
pip install pdfrw
合并代码示例:
import os from pdfrw import PdfReader, PdfWriter source_dir = r"C:\Users\Aparns\Downloads\speeddata" output_path = os.path.join(source_dir, "Complete.pdf") writer = PdfWriter() for item in os.listdir(source_dir): if item.lower().endswith(".pdf"): file_path = os.path.join(source_dir, item) # 读取单文件页面并添加到写入器 writer.addpages(PdfReader(file_path).pages) # 写入合并后的PDF writer.write(output_path)
3. 调用系统命令行工具
如果系统已安装qpdf或pdftk这类专业PDF工具,可通过Python的subprocess调用,速度通常是最快的(依赖系统工具性能)。
以qpdf为例(需先安装qpdf并加入系统PATH):
import os import subprocess source_dir = r"C:\Users\Aparns\Downloads\speeddata" output_path = os.path.join(source_dir, "Complete.pdf") # 收集所有PDF文件路径 pdf_files = [os.path.join(source_dir, f) for f in os.listdir(source_dir) if f.lower().endswith(".pdf")] # 调用qpdf执行合并 subprocess.run( ["qpdf", "--empty", "--pages"] + pdf_files + [output_path], check=True )
内容的提问来源于stack exchange,提问作者user20289810
相关产品推荐
相关产品推荐

