PyPDF2合并PDF时报Unresolved named destination '_PAGE1'错如何解决
报错原因
该错误是由于待合并的部分PDF文件存在格式不规范的命名目标(即PDF内部跳转书签),旧版PyPDF2处理这类异常书签时没有容错逻辑,因此会抛出对应报错。
方案1:快速修复(无需换库,适合不需要保留原PDF书签的场景)
在merger.append方法中添加import_bookmarks=False参数,禁止导入原PDF的书签,跳过书签解析逻辑即可规避报错。同时对原有代码的遍历逻辑、资源泄漏问题做了优化:
dir_name = r"E:\Data" import os from PyPDF2 import PdfFileMerger, PdfFileReader # 直接遍历根目录下的一级子文件夹,避免原有os.walk逻辑重复遍历的问题 for entry in os.scandir(dir_name): if entry.is_dir(): sub_dir = entry.path merger = PdfFileMerger() for filename in os.listdir(sub_dir): if filename.endswith(".pdf"): filepath = os.path.join(sub_dir, filename) # 加import_bookmarks=False参数禁止导入书签 with open(filepath, 'rb') as f: merger.append(PdfFileReader(f), import_bookmarks=False) output_path = os.path.join(dir_name, f"{entry.name}.pdf") merger.write(output_path) merger.close()
方案2:需要保留原PDF书签的场景
如果需要保留原PDF的书签,建议换用兼容性更强的PyMuPDF(库名fitz)处理PDF合并,该库对格式不规范的PDF容错性远高于PyPDF2。
- 先安装依赖:
pip install pymupdf - 合并代码示例:
import os import fitz dir_name = r"E:\Data" for entry in os.scandir(dir_name): if entry.is_dir(): sub_dir = entry.path merger = fitz.open() # sorted保证PDF按文件名顺序合并 for filename in sorted(os.listdir(sub_dir)): if filename.lower().endswith(".pdf"): filepath = os.path.join(sub_dir, filename) with fitz.open(filepath) as src_pdf: merger.insert_pdf(src_pdf) output_path = os.path.join(dir_name, f"{entry.name}.pdf") merger.save(output_path) merger.close()
额外说明
若仍想使用PyPDF2生态,可卸载旧版安装维护更活跃的新版pypdf:pip uninstall PyPDF2 && pip install pypdf,导入逻辑兼容旧版PyPDF2,自带的容错逻辑也能解决大部分这类报错。
内容的提问来源于stack exchange,提问作者Mohammad Amir
相关产品推荐
相关产品推荐

