使用Tkinter asksaveasfilename保存合并PDF时文件为空的问题
问题描述
使用Tkinter的askopenfilename一切正常,但改用asksaveasfilename保存合并后的PDF时,生成的文件是空的。原本脚本通过固定路径保存没问题,修改为弹窗询问文件名后出现异常,代码如下:
import tkinter as tk from tkinter.filedialog import askopenfilename, asksaveasfilename import PyPDF4 # import des fichiers root = tk.Tk() root.withdraw() file1 = askopenfilename() file2 = askopenfilename() # import des fichiers pdf pdfFile1 = PyPDF4.PdfFileReader(file1, 'rb') pdfFile2 = PyPDF4.PdfFileReader(file2, 'rb') #création de l'objet pdf newPdf = PyPDF4.PdfFileWriter() # fonction d'extraction des pages du pdf def extract_page(pdfFile): for numPage in range(pdfFile.numPages): page = pdfFile.getPage(numPage) newPdf.addPage(page) # application de la fct sur nos objets-pdf extract_page(pdfFile1) extract_page(pdfFile2) # création du nouveau Pdf et écriture file = asksaveasfilename(defaultextension="\.pdf") pdfCombined = open(file, "wb") newPdf.write(pdfCombined) file.close()
解决方案
你的代码有三个关键问题导致生成空文件:
- 核心合并逻辑未执行:你把
extract_page(pdfFile1)和extract_page(pdfFile2)写在了注释行里,这两行代码根本没运行,导致newPdf对象里没有任何页面,写入自然是空文件。 - 文件关闭对象错误:你调用
file.close(),但file是用户选择的文件名字符串,不是文件句柄,正确的操作是关闭pdfCombined这个文件对象。更推荐用with语句自动管理文件,避免手动关闭的失误。 - 默认扩展名写法错误:
defaultextension="\.pdf"里的转义符多余,直接写defaultextension=".pdf"即可。
修正后的完整代码:
import tkinter as tk from tkinter.filedialog import askopenfilename, asksaveasfilename import PyPDF4 root = tk.Tk() root.withdraw() # 选择要合并的PDF文件 file1 = askopenfilename() file2 = askopenfilename() # 读取PDF文件 pdfFile1 = PyPDF4.PdfFileReader(file1, 'rb') pdfFile2 = PyPDF4.PdfFileReader(file2, 'rb') # 创建PDF写入对象 newPdf = PyPDF4.PdfFileWriter() # 提取并添加页面到新PDF def extract_page(pdfFile): for numPage in range(pdfFile.numPages): page = pdfFile.getPage(numPage) newPdf.addPage(page) # 执行页面提取(关键:取消注释并正确调用) extract_page(pdfFile1) extract_page(pdfFile2) # 选择保存路径并写入文件 save_path = asksaveasfilename(defaultextension=".pdf") # 使用with语句自动关闭文件 with open(save_path, "wb") as pdfCombined: newPdf.write(pdfCombined)
内容的提问来源于stack exchange,提问作者Christopher Pring
相关产品推荐
相关产品推荐

