Python使用PyPDF2合并多个PDF报缺少page参数TypeError如何解决
问题说明
需要实现多PDF文件合并为单个PDF的功能,基于tkinter实现文件选择交互,调用PyPDF2库完成PDF处理,运行编写的代码时触发TypeError异常,错误提示为缺少参数page,无法定位错误点。
原问题代码
from tkinter import filedialog as fd import tkinter as tk from PyPDF2 import PdfFileReader, PdfFileWriter, PdfFileMerger import os mother = tk.Tk() base_pdf = fd.askopenfilename(filetypes=[('PDF files', '.pdf')], title='Wählen Sie bitte die Basis-PDF-Datei aus') part_pdf = fd.askopenfilenames(title='Wählen Sie bitte die zugehörigen PDF-Dateien aus') pdfs = [base_pdf, part_pdf] x = os.path.basename(base_pdf) y = x.split('.')[0] for pdf in mother.splitlist(pdfs): pdf_writer = PdfFileWriter pdf_reader = PdfFileReader(pdf) for page in range(pdf_reader.getNumPages()): pdf_writer.addPage(pdf_reader.getPage(page)) with open(y + '_Beipack.pdf', 'wb') as target: pdf_writer = PdfFileWriter() pdf_writer.write(target) print('My PDF Merger', 'Glückwunsch, die PDF-Datei wurde erfolgreich erstellt!')
错误点定位
- 触发
缺少参数page报错的直接原因:循环内写pdf_writer = PdfFileWriter时漏了实例化的括号,相当于把PdfFileWriter类本身赋值给了变量,而不是创建一个写入器实例。后续调用addPage时是直接调用类的实例方法,实例方法默认第一个参数需要接收实例对象(self),传入的页面对象被识别为self参数,就会提示缺少必须的page参数。 - 文件列表拼接逻辑错误:
askopenfilenames返回的本身就是多文件路径的元组,把base_pdf字符串和这个元组包成新列表[base_pdf, part_pdf],遍历的时候会把整个多文件元组当成一个文件路径传入,后续读取PDF时会直接报文件不存在错误。 - 写入器作用域错误:循环内反复给
pdf_writer赋值,最后写文件的时候又重新创建了一个全新的空PdfFileWriter实例,之前循环里读取的所有页面根本没有被传入最终用来写文件的写入器,就算不报错最后生成的也是空PDF。 - 冗余逻辑问题:已经导入了专门用来合并PDF的
PdfFileMerger类,不需要手动逐页复制页面,直接调用合并接口逻辑更简单;另外tkinter根窗口创建后没有隐藏,运行时会在后台留一个空白的tk窗口;文件类型匹配规则写的.pdf没有通配符,可能导致文件选择时无法正常过滤PDF文件。
修复后可运行代码
from tkinter import filedialog as fd import tkinter as tk from PyPDF2 import PdfFileMerger import os # 初始化tk根窗口并隐藏,避免残留空白后台窗口 root = tk.Tk() root.withdraw() # 选择基础PDF base_pdf = fd.askopenfilename( filetypes=[('PDF files', '*.pdf')], title='Wählen Sie bitte die Basis-PDF-Datei aus' ) if not base_pdf: exit() # 选择要追加的PDF part_pdfs = fd.askopenfilenames( filetypes=[('PDF files', '*.pdf')], title='Wählen Sie bitte die zugehörigen PDF-Dateien aus' ) # 按顺序组装待合并文件列表:基础PDF在前,后续追加的PDF在后 pdf_list = [base_pdf] + list(part_pdfs) # 生成输出文件名 base_name = os.path.basename(base_pdf).split('.')[0] output_path = f"{base_name}_Beipack.pdf" # 初始化PDF合并器完成合并 merger = PdfFileMerger() for pdf_path in pdf_list: merger.append(pdf_path) # 写出合并后的文件 with open(output_path, 'wb') as f: merger.write(f) merger.close() print('My PDF Merger', 'Glückwunsch, die PDF-Datei wurde erfolgreich erstellt!')
内容的提问来源于stack exchange,提问作者POPZMOKE
相关产品推荐
相关产品推荐

