将文件夹下所有文件合并成一个PDF

朋友有个需求,希望将一个项目文件夹下的所有文件,如pdf、doc、图片等,一次都合并成一个pdf文件,方便文件管理保存

抽空给写了代码,比较简单,大神勿笑,有更好的方案,可以交流哈

做了个很简单的UI,没有打包

import os
import os.path
from PyPDF2 import PdfFileReader, PdfMerger
import tkinter as tk
from tkinter import filedialog, messagebox

# 定义一个函数,用来选择原始文件夹
def select_source_folder():
    global source_folder # 使用全局变量保存原始文件夹路径
    source_folder = filedialog.askdirectory() # 弹出对话框让用户选择文件夹
    if source_folder: # 如果用户选择了文件夹
        source_label['text'] = source_folder # 更新标签显示文件夹路径

# 定义一个函数,用来选择目标文件夹
def select_target_folder():
    global target_folder # 使用全局变量保存目标文件夹路径
    target_folder = filedialog.askdirectory() # 弹出对话框让用户选择文件夹
    if target_folder: # 如果用户选择了文件夹
        target_label['text'] = target_folder # 更新标签显示文件夹路径

# 定义一个函数,用来执行合并PDF的任务
def merge_pdfs():
    global source_folder, target_folder # 使用全局变量获取原始文件夹和目标文件夹路径
    if not source_folder or not target_folder: # 如果有任何一个文件夹路径为空
        messagebox.showerror('错误', '请先选择原始文件夹和目标文件夹') # 弹出错误提示框
        return # 结束函数

    # 初始化PdfMerger对象
    pdf_merger = PdfMerger()

    # 遍历原始文件夹中的每个子文件夹
    for sub_folder in os.listdir(source_folder):
        sub_folder_path = os.path.join(source_folder, sub_folder)
        if not os.path.isdir(sub_folder_path):
            continue

        # 遍历当前子文件夹中的每个PDF文件
        for pdf_file in os.listdir(sub_folder_path):
            pdf_file_path = os.path.join(sub_folder_path, pdf_file)
            if not pdf_file_path.endswith('.pdf'):
                continue

            # 将当前PDF文件添加到PdfMerger对象中
            with open(pdf_file_path, 'rb') as f:
                pdf_merger.append(f)

    # 将所有PDF文件合并为一个文件,保存在目标文件夹中,名字为merged.pdf
    merged_pdf_path = os.path.join(target_folder, 'merged.pdf')
    with open(merged_pdf_path, 'wb') as f:
        pdf_merger.write(f)

    # 关闭PdfMerger对象
    pdf_merger.close()

    messagebox.showinfo('完成', '所有PDF文件已合并') # 弹出完成提示框

# 创建Tkinter窗口对象
window = tk.Tk()
window.title('PDF合并器') # 设置窗口标题

# 创建一个标签,用来显示原始文件夹路径
source_label = tk.Label(window, text='请选择原始文件夹')
source_label.pack()

# 创建一个按钮,用来选择原始文件夹
source_button = tk.Button(window, text='选择原始文件夹', command=select_source_folder)
source_button.pack()

# 创建一个标签,用来显示目标文件夹路径
target_label = tk.Label(window, text='请选择目标文件夹')
target_label.pack()

# 创建一个按钮,用来选择目标文件夹
target_button = tk.Button(window, text='选择目标文件夹', command=select_target_folder)
target_button.pack()

# 创建一个按钮,用来开始合并PDF任务
start_button = tk.Button(window, text='开始合并', command=merge_pdfs)
start_button.pack()

# 进入Tkinter主循环,等待用户操作
window.mainloop()

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
非常感谢您的提问。您可以使用VBA编写一个宏来实现这个功能。以下是一个简单的示例代码: Sub CombinePDFs() Dim folderPath As String Dim outputPath As String Dim objFSO As Object Dim objShell As Object Dim objFolder As Object Dim objFile As Object Dim objPDF As Object Dim i As Integer '选择文件夹路径 With Application.FileDialog(msoFileDialogFolderPicker) .Title = "请选择要合并PDF文件所在的文件夹" .Show If .SelectedItems.Count = 0 Then Exit Sub folderPath = .SelectedItems(1) End With '选择输出路径 With Application.FileDialog(msoFileDialogSaveAs) .Title = "请选择输出PDF文件的保存路径和文件名" .InitialFileName = "CombinedPDFs.pdf" .Show If .SelectedItems.Count = 0 Then Exit Sub outputPath = .SelectedItems(1) End With '创建PDF对象 Set objFSO = CreateObject("Scripting.FileSystemObject") Set objShell = CreateObject("Shell.Application") Set objPDF = CreateObject("AcroExch.PDDoc") '遍历文件夹中的PDF文件 Set objFolder = objFSO.GetFolder(folderPath) For Each objFile In objFolder.Files If objFSO.GetExtensionName(objFile.Path) = "pdf" Then '打开PDF文件 If objPDF.Open(objFile.Path) Then '合并PDF文件 objShell.Namespace(outputPath).CopyHere objPDF, 4 i = i + 1 End If End If Next '关闭PDF对象 objPDF.Close Set objPDF = Nothing Set objShell = Nothing Set objFSO = Nothing '提示合并 MsgBox "已合并" & i & "个PDF文件!", vbInformation, "提示" End Sub 请注意,此代码仅适用于Windows操作系统,并且需要安装Adobe Acrobat软件。如果您使用的是Mac操作系统,则可以使用Preview应用程序来合并PDF文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wh3933

你的

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值