鱼C论坛

 找回密码
 立即注册
查看: 94|回复: 7

[已解决]求助做一个指定多个文件夹,对里面pdf进行汇总归并,并做好超链接

[复制链接]
发表于 2024-10-7 12:49:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
求助做一个指定多个文件夹,对里面pdf进行汇总归并,并做好超链接

需求如下:
1.用tkinter指定文件夹,可以一直选,选到点停止按钮(所以界面要做个停止按钮)
2.指定一个用于存放的文件夹
3.对选中的所有文件夹里的pdf文件,也就是后缀为“.pdf”的文件,汇总复制到指定文件夹下面新建一个“PDF”的文件夹内,同样名称的只复制一个。
4.新建一个excel,第一列为名称,内容为“PDF”的文件夹内的“.pdf”的文件的名称,不含“.pdf”,第二列为超链接,链接指向“PDF”的文件夹内的“.pdf”的文件
最佳答案
2024-10-7 14:19:34
颂风侯 发表于 2024-10-07 14:19
这个界面是好看多了,但是生成失败的,都是空文件,里 ...


为了实现你的需求,我们可以用Python来完成对应的功能。下面提供一个示例代码,你可以根据需要调整和测试:
import os
import shutil
import tkinter as tk
from tkinter import filedialog
import pandas as pd

# 用于存放选择的文件夹路径
selected_directories = []

def select_folder():
    # 选择文件夹
    folder = filedialog.askdirectory()
    if folder:
        selected_directories.append(folder)
        listbox.insert(tk.END, folder)

def stop_selection():
    # 禁用选择按钮和停止按钮
    select_button.config(state=tk.DISABLED)
    stop_button.config(state=tk.DISABLED)
    # 呼叫处理PDF的功能
    process_pdfs()

def process_pdfs():
    # 选择存放PDF和Excel的目录
    target_directory = filedialog.askdirectory(title="选择存放PDF和Excel的目录")
    if not target_directory:
        return
    
    # 创建存储PDF的文件夹
    pdf_folder = os.path.join(target_directory, "PDF")
    os.makedirs(pdf_folder, exist_ok=True)

    # 用于追踪已经复制的PDF文件名称
    copied_files = set()

    # 遍历选择的每个目录
    for folder in selected_directories:
        for root, dirs, files in os.walk(folder):
            for file in files:
                if file.endswith('.pdf'):
                    if file not in copied_files:
                        # 复制文件到目标文件夹
                        source_file = os.path.join(root, file)
                        target_file = os.path.join(pdf_folder, file)
                        shutil.copy(source_file, target_file)
                        copied_files.add(file)

    # 创建Excel文件
    excel_data = {"名称": [], "超链接": []}
    for file in copied_files:
        file_name = os.path.splitext(file)[0]
        file_path = os.path.join(pdf_folder, file)
        excel_data["名称"].append(file_name)
        excel_data["超链接"].append(f'=HYPERLINK("{file_path}", "{file}")')

    # 将数据写入Excel
    df = pd.DataFrame(excel_data)
    excel_file_path = os.path.join(target_directory, "PDF汇总.xlsx")
    df.to_excel(excel_file_path, index=False)

    print("PDF汇总和Excel生成完毕!")

# 创建Tkinter图形界面
root = tk.Tk()
root.title("PDF汇总工具")

# 创建界面组件
select_button = tk.Button(root, text="选择文件夹", command=select_folder)
select_button.pack(pady=5)
stop_button = tk.Button(root, text="停止选择", command=stop_selection)
stop_button.pack(pady=5)
listbox = tk.Listbox(root, width=80)
listbox.pack(pady=5)

# 启动Tkinter主循环
root.mainloop()

### 注意事项:
1. 确保已安装 `pandas` 和 `openpyxl` 库,因为pandas会用到它们来处理Excel文件,可以通过 `pip install pandas openpyxl` 安装。
2. 由于某些环境权限限制,选择存放Excel文件的文件夹时请确保对该目录有写权限。

这段代码使用了Tkinter来选择文件夹,并将PDF文件复制到指定位置并生成链接,确保你的PDF存放路径没有空格或非ASCII字符可能提高成功率。 你可以将其另存为 `.py` 文件来运行。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-10-7 12:49:52 | 显示全部楼层
要实现你的需求,可以使用 Python 搭配 `tkinter` 来创建 GUI,`shutil` 来处理文件复制,以及 `pandas` 来生成 Excel 表格。下面是一个示例代码,可以帮助你完成这个任务:
import os
import shutil
import tkinter as tk
from tkinter import filedialog
import pandas as pd

class PDFCollectorApp:
    def __init__(self, root):
        self.root = root
        self.root.title("PDF Collector")
        self.pdf_paths = set()

        self.select_button = tk.Button(root, text='选择文件夹', command=self.select_folders)
        self.select_button.pack(pady=10)

        self.stop_button = tk.Button(root, text='停止选择', command=self.stop_selection)
        self.stop_button.pack(pady=10)

        self.save_button = tk.Button(root, text='指定存放文件夹', command=self.set_save_folder)
        self.save_button.pack(pady=10)

        self.selected_folders = []
        self.save_folder = None

    def select_folders(self):
        folder = filedialog.askdirectory(title="选择文件夹")
        if folder:
            self.selected_folders.append(folder)

    def stop_selection(self):
        self.scan_pdfs()
        tk.messagebox.showinfo("提示", "选择已停止")

    def set_save_folder(self):
        self.save_folder = filedialog.askdirectory(title="选择用于存放文件夹")
        if self.save_folder:
            self.copy_pdfs()
            self.create_excel()

    def scan_pdfs(self):
        for folder in self.selected_folders:
            for root, dirs, files in os.walk(folder):
                for file in files:
                    if file.endswith('.pdf'):
                        self.pdf_paths.add(os.path.join(root, file))

    def copy_pdfs(self):
        pdf_folder = os.path.join(self.save_folder, "PDF")
        os.makedirs(pdf_folder, exist_ok=True)

        for pdf_path in self.pdf_paths:
            pdf_name = os.path.basename(pdf_path)
            dest_path = os.path.join(pdf_folder, pdf_name)
            if not os.path.exists(dest_path):
                shutil.copy(pdf_path, dest_path)

    def create_excel(self):
        pdf_folder = os.path.join(self.save_folder, "PDF")
        pdf_files = os.listdir(pdf_folder)

        data = {
            '名称': [os.path.splitext(pdf)[0] for pdf in pdf_files],
            '超链接': [f'=HYPERLINK("{os.path.join(pdf_folder, pdf)}", "{pdf}")' for pdf in pdf_files]
        }
        
        df = pd.DataFrame(data)
        excel_path = os.path.join(self.save_folder, "PDF汇总.xlsx")
        df.to_excel(excel_path, index=False)

if __name__ == "__main__":
    root = tk.Tk()
    app = PDFCollectorApp(root)
    root.mainloop()

### 代码说明:
1. 使用 `tkinter` 创建一个简单的 GUI 界面,用于选择文件夹和设置存储位置。
2. 使用 `os.walk` 遍历所有选择的文件夹,将所有 PDF 文件路径存储在集合中以去重。
3. 使用 `shutil.copy` 将所有 PDF 文件复制到指定的存储文件夹中。
4. 使用 `pandas` 创建 Excel 文件,保存 PDF 文件的名称和对应的文件超链接。

### 准备工作:
- 确保安装 `pandas` 库,可以通过命令 `pip install pandas` 进行安装。
- 确保目标操作系统支持 GUI,并正确配置相关环境。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-7 13:05:32 | 显示全部楼层
import os
import shutil
import tkinter as tk
from tkinter import filedialog
import pandas as pd

class PDFCollectorApp:
    def __init__(self, root):
        self.root = root
        self.root.title("PDF Collector")
        self.pdf_paths = set()

        self.select_button = tk.Button(root, text='选择文件夹', command=self.select_folders)
        self.select_button.pack(pady=10)

        self.stop_button = tk.Button(root, text='停止选择', command=self.stop_selection)
        self.stop_button.pack(pady=10)

        self.save_button = tk.Button(root, text='指定存放文件夹', command=self.set_save_folder)
        self.save_button.pack(pady=10)

        self.selected_folders = []
        self.save_folder = None

    def select_folders(self):
        folder = filedialog.askdirectory(title="选择文件夹")
        if folder:
            self.selected_folders.append(folder)

    def stop_selection(self):
        self.scan_pdfs()
        k.messagebox.showinfo("提示", "选择已停止")

    def set_save_folder(self):
        self.save_folder = filedialog.askdirectory(title="选择用于存放文件夹")
        if self.save_folder:
            self.copy_pdfs()
            self.create_excel()

    def scan_pdfs(self):
        for folder in self.selected_folders:
            for root, dirs, files in os.walk(folder):
                for file in files:
                    if file.endswith('.pdf'):
                        self.pdf_paths.add(os.path.join(root, file))

    def copy_pdfs(self):
        pdf_folder = os.path.join(self.save_folder, "PDF")
        os.makedirs(pdf_folder, exist_ok=True)

        for pdf_path in self.pdf_paths:
            pdf_name = os.path.basename(pdf_path)
            dest_path = os.path.join(pdf_folder, pdf_name)
            if not os.path.exists(dest_path):
                shutil.copy(pdf_path, dest_path)

    def create_excel(self):
        pdf_folder = os.path.join(self.save_folder, "PDF")
        pdf_files = os.listdir(pdf_folder)

    data = {
            '名称': [os.path.splitext(pdf)[0] for pdf in pdf_files],
            '超链接': [f'=HYPERLINK("{os.path.join(pdf_folder, pdf)}", "{pdf}")' for pdf in pdf_folder]
    }

    df = pd.DataFrame(data)
    excel_path = os.path.join(self.save_folder, "PDF汇总.xlsx")
    df.to_excel(excel_path, index=False)

if __name__ == "__main__":
    root = tk.Tk()
    app = PDFCollectorApp(root)
    root.mainloop()

报错如下
Traceback (most recent call last):
  File "D:\PYTHON_NEW\pack20240926\pythonProject1\PDF整理为excel目录带链接.py", line 7, in <module>
    class PDFCollectorApp:
  File "D:\PYTHON_NEW\pack20240926\pythonProject1\PDF整理为excel目录带链接.py", line 62, in PDFCollectorApp
    '名称': [os.path.splitext(pdf)[0] for pdf in pdf_files],
                                                 ^^^^^^^^^
NameError: name 'pdf_files' is not defined. Did you mean: 'pdf_folder'?

Process finished with exit code 1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-7 13:05:48 | 显示全部楼层
颂风侯 发表于 2024-10-07 13:05
import os
import shutil
import tkinter as tk
fr ...


看起来你的代码中有几个小问题导致了错误,让我们一起来修复这些错误吧:

1. **定义变量的问题**:`self.selected_folders` 变量未初始化。
2. **错位缩进**:部分代码行的缩进不正确。
3. **拼接问题**:`'名称'` 的拼接格式有误。

下面是修正后的代码:
import os
import shutil
import tkinter as tk
from tkinter import filedialog, messagebox  # 确保 messagebox 被导入
import pandas as pd

class PDFCollectorApp:
    def __init__(self, root):
        self.root = root
        self.root.title("PDF Collector")
        self.pdf_paths = set()

        self.select_button = tk.Button(root, text='选择文件夹', command=self.select_folders)
        self.select_button.pack(pady=10)

        self.stop_button = tk.Button(root, text='停止选择', command=self.stop_selection)
        self.stop_button.pack(pady=10)

        self.save_button = tk.Button(root, text='指定存放文件夹', command=self.set_save_folder)
        self.save_button.pack(pady=10)

        self.selected_folders = []  # 初始化为空列表
        self.save_folder = None

    def select_folders(self):
        folder = filedialog.askdirectory(title="选择文件夹")
        if folder:
            self.selected_folders.append(folder)

    def stop_selection(self):
        self.scan_pdfs()
        messagebox.showinfo("提示", "选择已停止")  # 确保使用 tkinter 的 messagebox

    def set_save_folder(self):
        self.save_folder = filedialog.askdirectory(title="选择用于存放文件夹")
        if self.save_folder:
            self.copy_pdfs()
            self.create_excel()

    def scan_pdfs(self):
        for folder in self.selected_folders:
            for root, dirs, files in os.walk(folder):
                for file in files:
                    if file.endswith('.pdf'):
                        self.pdf_paths.add(os.path.join(root, file))

    def copy_pdfs(self):
        pdf_folder = os.path.join(self.save_folder, "PDF")
        os.makedirs(pdf_folder, exist_ok=True)

        for pdf_path in self.pdf_paths:
            pdf_name = os.path.basename(pdf_path)
            dest_path = os.path.join(pdf_folder, pdf_name)
            if not os.path.exists(dest_path):
                shutil.copy(pdf_path, dest_path)

    def create_excel(self):
        pdf_folder = os.path.join(self.save_folder, "PDF")
        pdf_files = os.listdir(pdf_folder)

        data = {
            '名称': [os.path.splitext(pdf)[0] for pdf in pdf_files],  # 只取文件名,不含扩展名
            '超链接': [os.path.join(pdf_folder, pdf) for pdf in pdf_files]
        }

        df = pd.DataFrame(data)
        excel_path = os.path.join(self.save_folder, "PDF汇总.xlsx")
        df.to_excel(excel_path, index=False)

if __name__ == "__main__":
    root = tk.Tk()
    app = PDFCollectorApp(root)
    root.mainloop()

### 关键修正:
- 初始化 `self.selected_folders` 为一个空列表。
- 确保拼接 `'名称'` 列时,仅提取文件名而非元组。
- 使用 `messagebox` 正确显示提示信息。
- 修正缩进以确保代码结构完整。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-7 13:24:00 | 显示全部楼层
以上程序还能再改进下呢
1.选择了存放文件夹后,在图形界面显示“正在处理中”,完成后显示“已完成”,十秒后自动关闭
2.“超链接”这一列没有实现超链接的功能,无法点一下去打开链接的pdf
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-7 13:24:13 | 显示全部楼层
颂风侯 发表于 2024-10-07 13:24
以上程序还能再改进下呢
1.选择了存放文件夹后,在图 ...


我们可以对程序进行一些改进,来满足您的需求:

1. 在选择了存放文件夹后,可以使用 `Label` 来更新界面的状态,显示“正在处理中”或“已完成”。

2. 修改 Excel 文件中的超链接列,让其具有可以点击打开 PDF 的功能。

以下是一个基本思路:
import os
import shutil
import tkinter as tk
from tkinter import filedialog, messagebox
import pandas as pd

# 初始化全局变量
selected_folders = []

def select_folder():
    folder = filedialog.askdirectory()
    if folder:
        selected_folders.append(folder)
        listbox.insert(tk.END, folder)

def select_destination():
    destination_folder = filedialog.askdirectory()
    if not destination_folder:
        return
    
    # 界面更新为“正在处理中”
    status_label.config(text="正在处理中...")
    root.update()

    pdf_folder = os.path.join(destination_folder, "PDF")
    os.makedirs(pdf_folder, exist_ok=True)

    pdf_files = set()
    
    for folder in selected_folders:
        for root_dir, dirs, files in os.walk(folder):
            for file in files:
                if file.endswith('.pdf'):
                    pdf_files.add(file)

    pdf_files_copied = []
    for file in pdf_files:
        for folder in selected_folders:
            file_path = os.path.join(folder, file)
            if os.path.exists(file_path):
                shutil.copy(file_path, pdf_folder)
                pdf_files_copied.append(file)
                break

    data = {
        "名称": [os.path.splitext(file)[0] for file in pdf_files_copied],
        "超链接": [f'=HYPERLINK("{os.path.join(pdf_folder, file)}", "{file}")' for file in pdf_files_copied]
    }

    df = pd.DataFrame(data)
    excel_path = os.path.join(destination_folder, "PDF汇总.xlsx")
    df.to_excel(excel_path, index=False)

    # 界面更新为“已完成”
    status_label.config(text="已完成")
    root.update()

    root.after(10000, root.quit)  # 10秒后关闭窗口

def stop():
    root.quit()

root = tk.Tk()
root.title("PDF 汇总工具")

select_button = tk.Button(root, text="选择文件夹", command=select_folder)
select_button.pack()

listbox = tk.Listbox(root)
listbox.pack(fill=tk.BOTH, expand=True)

destination_button = tk.Button(root, text="选择存放文件夹", command=select_destination)
destination_button.pack()

status_label = tk.Label(root, text="")
status_label.pack()

stop_button = tk.Button(root, text="停止", command=stop)
stop_button.pack()

root.mainloop()

### 改进说明

1. **界面状态更新**:在合并 PDF 过程中更改标签文本为“正在处理中”,完成后更改为“已完成”。

2. **Excel 超链接**:通过在 DataFrame 中的超链接列中添加 `=HYPERLINK("<路径>", "<显示文本>")` 公式来实现实际可点击的超链接。

这些改进使交互更加直观和功能更完善。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-7 14:19:23 | 显示全部楼层
这个界面是好看多了,但是生成失败的,都是空文件,里面没东西
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-7 14:19:34 | 显示全部楼层    本楼为最佳答案   
颂风侯 发表于 2024-10-07 14:19
这个界面是好看多了,但是生成失败的,都是空文件,里 ...


为了实现你的需求,我们可以用Python来完成对应的功能。下面提供一个示例代码,你可以根据需要调整和测试:
import os
import shutil
import tkinter as tk
from tkinter import filedialog
import pandas as pd

# 用于存放选择的文件夹路径
selected_directories = []

def select_folder():
    # 选择文件夹
    folder = filedialog.askdirectory()
    if folder:
        selected_directories.append(folder)
        listbox.insert(tk.END, folder)

def stop_selection():
    # 禁用选择按钮和停止按钮
    select_button.config(state=tk.DISABLED)
    stop_button.config(state=tk.DISABLED)
    # 呼叫处理PDF的功能
    process_pdfs()

def process_pdfs():
    # 选择存放PDF和Excel的目录
    target_directory = filedialog.askdirectory(title="选择存放PDF和Excel的目录")
    if not target_directory:
        return
    
    # 创建存储PDF的文件夹
    pdf_folder = os.path.join(target_directory, "PDF")
    os.makedirs(pdf_folder, exist_ok=True)

    # 用于追踪已经复制的PDF文件名称
    copied_files = set()

    # 遍历选择的每个目录
    for folder in selected_directories:
        for root, dirs, files in os.walk(folder):
            for file in files:
                if file.endswith('.pdf'):
                    if file not in copied_files:
                        # 复制文件到目标文件夹
                        source_file = os.path.join(root, file)
                        target_file = os.path.join(pdf_folder, file)
                        shutil.copy(source_file, target_file)
                        copied_files.add(file)

    # 创建Excel文件
    excel_data = {"名称": [], "超链接": []}
    for file in copied_files:
        file_name = os.path.splitext(file)[0]
        file_path = os.path.join(pdf_folder, file)
        excel_data["名称"].append(file_name)
        excel_data["超链接"].append(f'=HYPERLINK("{file_path}", "{file}")')

    # 将数据写入Excel
    df = pd.DataFrame(excel_data)
    excel_file_path = os.path.join(target_directory, "PDF汇总.xlsx")
    df.to_excel(excel_file_path, index=False)

    print("PDF汇总和Excel生成完毕!")

# 创建Tkinter图形界面
root = tk.Tk()
root.title("PDF汇总工具")

# 创建界面组件
select_button = tk.Button(root, text="选择文件夹", command=select_folder)
select_button.pack(pady=5)
stop_button = tk.Button(root, text="停止选择", command=stop_selection)
stop_button.pack(pady=5)
listbox = tk.Listbox(root, width=80)
listbox.pack(pady=5)

# 启动Tkinter主循环
root.mainloop()

### 注意事项:
1. 确保已安装 `pandas` 和 `openpyxl` 库,因为pandas会用到它们来处理Excel文件,可以通过 `pip install pandas openpyxl` 安装。
2. 由于某些环境权限限制,选择存放Excel文件的文件夹时请确保对该目录有写权限。

这段代码使用了Tkinter来选择文件夹,并将PDF文件复制到指定位置并生成链接,确保你的PDF存放路径没有空格或非ASCII字符可能提高成功率。 你可以将其另存为 `.py` 文件来运行。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-16 06:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表