如何通过GUI导入并合并多个外部文件夹中的PDF文件?
问题背景
我一直在尝试通过自动化简化一项繁琐的工作:合并来自不同Windows文件夹的2个PDF并保存到另一个独立输出文件夹。
具体需求为:从一个文件夹中选择单个文档,通过循环将其与我选定的另一文件夹内多个不同的首页PDF文件逐一合并,再将合并后的PDF保存到单独的文件夹中,使用tkinter实现文件和文件夹的选择功能。
我正在学习Python,参考教程拼凑出了当前脚本,现在遇到的问题是:选定一个文件夹后,之前选定的文件夹路径就丢失了,运行程序时无法定位到第一个文件夹。
原有代码
from tkinter import Tk, Button import os import sys from PyPDF2 import PdfFileMerger, PdfFileReader from tkinter.filedialog import askdirectory from tkinter.filedialog import askopenfilename from tkinter import messagebox root = Tk() root.title('Batch PDF Single to Many Merger') root.configure(background="light green") root.minsize(width=500,height=100) root.resizable(width=False,height=False) def open_coverletter_folder(): global coverletter_directory coverletter_directory=askdirectory() f = open(coverletter_directory, 'rb') print(coverletter_directory) def open_cvselect(): global cv_select cv_select=askopenfilename() f1 = open(cv_select,'rb') print(cv_select) def pdfoutputfolder(): global output_directory output_directory=askdirectory() print(output_directory) def globconvert(): pdf_file = ['coverletter_directory',"rb",'cv_select',"rb"] combine = PdfFileMerger() for pdf in pdf_file: combine.append(pdf) combine.write('Cover+CV.pdf') combine.close() cover_btn = Button(root,text="Choose Cover Folder",width=25, command=open_coverletter_folder,bg="blue",fg="white") cover_btn.grid(row=1,column=0,padx = 15,pady =15) CV_btn = Button(root,text="Choose CV",width=25, command=open_cvselect,bg="blue",fg="white") CV_btn.grid(row=1,column=1,padx = 15,pady =15) output_btn = Button(root,text="Choose Output Folder",width=25, command=pdfoutputfolder,bg="brown",fg="white") output_btn.grid(row=1,column=2) convert_btn = Button(root,text="Convert PDFs",width=25, command=globconvert,bg="black",fg="white") convert_btn.grid(row=2,column=0) exit_btn = Button(root,text="Exit Application",width=25, command=root.destroy,bg="Purple",fg="white") exit_btn.grid(row=2,column=1) root.mainloop()
问题修正
原有代码存在以下核心错误:
- 选择封面文件夹的函数中错误使用
open()打开文件夹,文件夹不是可读取的文件对象,该操作会直接抛出异常 - 合并函数
globconvert中将变量名写为字符串,实际读取的是字符串文本而非之前存储的路径变量 - 没有遍历封面文件夹下的所有PDF文件,不满足「单个CV与多个封面逐一合并」的需求
- 输出路径未被调用,合并后的文件默认存储到脚本运行目录,而非选定的输出文件夹
- 选中CV后打开的文件句柄未关闭,会导致文件占用,后续操作报错
修正后可运行代码
from tkinter import Tk, Button import os from PyPDF2 import PdfFileMerger from tkinter.filedialog import askdirectory, askopenfilename from tkinter import messagebox root = Tk() root.title('批量PDF合并工具') root.configure(background="light green") root.minsize(width=650,height=120) root.resizable(width=False,height=False) # 全局变量初始化 coverletter_directory = "" cv_select = "" output_directory = "" def open_coverletter_folder(): global coverletter_directory coverletter_directory = askdirectory(title="选择封面PDF所在文件夹") print(f"封面文件夹路径:{coverletter_directory}") def open_cvselect(): global cv_select cv_select = askopenfilename(title="选择CV文件", filetypes=[("PDF文件", "*.pdf")]) print(f"CV文件路径:{cv_select}") def pdfoutputfolder(): global output_directory output_directory = askdirectory(title="选择输出文件夹") print(f"输出文件夹路径:{output_directory}") def globconvert(): # 先校验所有路径是否已选择 if not all([coverletter_directory, cv_select, output_directory]): messagebox.showerror("错误", "请先选择封面文件夹、CV文件和输出文件夹") return # 遍历封面文件夹下所有PDF文件 cover_files = [f for f in os.listdir(coverletter_directory) if f.lower().endswith('.pdf')] if not cover_files: messagebox.showwarning("提示", "封面文件夹下未找到PDF文件") return for cover_name in cover_files: cover_path = os.path.join(coverletter_directory, cover_name) combine = PdfFileMerger() # 先加封面,再加CV combine.append(cover_path) combine.append(cv_select) # 输出文件名:原封面名_合并CV.pdf output_name = f"{os.path.splitext(cover_name)[0]}_合并CV.pdf" output_path = os.path.join(output_directory, output_name) combine.write(output_path) combine.close() messagebox.showinfo("完成", f"所有PDF合并完成,共处理{len(cover_files)}个文件") cover_btn = Button(root,text="选择封面文件夹",width=25, command=open_coverletter_folder,bg="blue",fg="white") cover_btn.grid(row=1,column=0,padx = 15,pady =15) CV_btn = Button(root,text="选择CV文件",width=25, command=open_cvselect,bg="blue",fg="white") CV_btn.grid(row=1,column=1,padx = 15,pady =15) output_btn = Button(root,text="选择输出文件夹",width=25, command=pdfoutputfolder,bg="brown",fg="white") output_btn.grid(row=1,column=2,padx = 15,pady =15) convert_btn = Button(root,text="开始合并PDF",width=25, command=globconvert,bg="black",fg="white") convert_btn.grid(row=2,column=0,padx = 15,pady =15) exit_btn = Button(root,text="退出应用",width=25, command=root.destroy,bg="Purple",fg="white") exit_btn.grid(row=2,column=1,padx = 15,pady =15) root.mainloop()
内容的提问来源于stack exchange,提问作者PythonPerson
相关产品推荐
相关产品推荐

