PyPDF2合并PDF报错TypeError: 参数应为整数或None而非NullObject
PyPDF2批量合并PDF脚本故障修复方案
问题1:路径含空格时sys.argv参数解析异常
- 故障原因:Windows终端(PowerShell/CMD)默认以空格作为参数分隔符,路径中包含空格时会被拆分为多个独立参数,导致sys.argv索引错位。
- 修复方式:执行脚本时,所有路径参数外层统一包裹英文双引号,无论路径是否含空格都建议这么做,可彻底避免传参拆分问题。示例执行命令:
python3.9.exe .\Pdf_combiner.py ".\待合并PDF所在文件夹\" ".\输出文件存放文件夹\"
问题2:原脚本存在路径拼接逻辑缺陷
- 故障原因:原代码直接通过字符串拼接生成文件路径,未适配系统路径分隔符规则,当传入的文件夹路径末尾没有带
\(Windows)或/(类Unix系统)时,会将文件夹名和文件名直接拼接为错误路径,触发文件找不到报错。 - 修复方式:统一使用
os.path.join()方法做路径拼接,不要手动拼接字符串。
问题3:合并特定PDF抛出TypeError: argument should be integer or None, not 'NullObject'报错
- 故障原因:当前安装的旧版PyPDF2对非标准PDF兼容性差,部分生成不规范、存在流数据损坏的PDF会出现流长度字段为空(NullObject)的情况,旧版本未做对应容错处理,直接触发类型错误。
- 修复方式:
- 卸载旧版PyPDF2,替换为目前持续维护、兼容性更强的pypdf(PyPDF2的官方后续迭代版本,已修复数百个非标准PDF解析bug),执行以下命令:
pip uninstall PyPDF2 -ypip install pypdf - 替换原脚本代码,补上非PDF文件过滤、异常跳过逻辑,修复路径拼接问题。修复后的完整可运行代码如下:
- 卸载旧版PyPDF2,替换为目前持续维护、兼容性更强的pypdf(PyPDF2的官方后续迭代版本,已修复数百个非标准PDF解析bug),执行以下命令:
import os import sys from pypdf import PdfWriter # 读取命令行传入的路径参数 input_folder = sys.argv[1] output_folder = sys.argv[2] # 输出文件夹不存在则自动创建 if not os.path.exists(output_folder): os.makedirs(output_folder) print(f"输出文件夹 {output_folder} 已创建") # 获取用户指定的合并后文件名 output_filename = input("请输入合并后的PDF文件名(无需添加.pdf后缀):") # 初始化PDF合并实例 merger = PdfWriter() # 遍历源文件夹,按文件名排序后筛选PDF文件合并 for filename in sorted(os.listdir(input_folder)): # 跳过非PDF格式文件 if not filename.lower().endswith(".pdf"): continue file_full_path = os.path.join(input_folder, filename) # 跳过子文件夹,仅处理文件 if not os.path.isfile(file_full_path): continue try: merger.append(file_full_path) print(f"已添加文件:{file_full_path}") except Exception as e: print(f"文件 {file_full_path} 解析失败,已跳过,错误信息:{str(e)}") # 拼接输出文件完整路径 output_full_path = os.path.join(output_folder, f"{output_filename}.pdf") merger.write(output_full_path) merger.close() print(f"合并完成,文件已保存至:{output_full_path}")
- 补充说明:如果替换库后仍有个别PDF无法解析,可以先用qpdf、Adobe Acrobat等工具对损坏PDF做修复预处理,再执行合并操作。
内容的提问来源于stack exchange,提问作者Amir Golpayegani
相关产品推荐
相关产品推荐

