使用pdfrw提取多PDF指定页合并时报Invalid PDF header错误如何解决
报错原因
- 该报错指向你当前目录下部分后缀为
.pdf的文件并非合法PDF文件:这些文件实际是下载异常的HTML网页(比如从网页端另存时错误保存为PDF后缀、下载PDF时网络异常得到的错误页文件),文件头部是HTML的<!doctype html>标识,不符合PDF文件要求的%PDF-开头规范,所以pdfrw无法解析。
排查&修复方案
- 先确认代码执行后打印的
files列表,逐个打开列表内的PDF文件,无法用本地PDF阅读器正常打开的就是损坏/假冒的PDF,删除或重新下载正确版本即可解决报错。 - 可以在代码中增加PDF合法性校验逻辑,避免非法文件导致程序中断,同时补充你需求中缺失的「合并所有提取页为单个PDF」的逻辑。
修复后完整代码
from pdfrw import PdfReader, PdfWriter import os def is_valid_pdf(file_path): """校验文件是否为合法PDF""" if not os.path.isfile(file_path) or not file_path.endswith('.pdf'): return False try: with open(file_path, 'rb') as f: # 合法PDF前4个字节为%PDF return f.read(4) == b'%PDF' except: return False # 只保留合法的PDF文件 files = [f for f in os.listdir('.') if is_valid_pdf(f)] print(f"合法PDF文件清单:{files}") # 初始化合并用的写入器 merge_writer = PdfWriter("合并后的完整文件.pdf") # 要提取的页面区间,(起始页, 结束页),左闭右开,比如(6,8)就是提取第6、7页 parts = [(6, 7)] for pdf in files: pages = PdfReader(pdf).pages title = os.path.splitext(pdf)[0] for part in parts: # 可选:生成分离的单文件提取结果 single_writer = PdfWriter(f'{title}_第{part[0]}页.pdf') for pagenum in range(*part): page = pages[pagenum-1] single_writer.addpage(page) # 同时添加到合并文件的写入器 merge_writer.addpage(page) single_writer.write() # 输出合并后的完整PDF merge_writer.write()
内容的提问来源于stack exchange,提问作者Manas Paul
相关产品推荐
相关产品推荐

