You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 12:09:00