wordpress迁移跳转原网站,什么网站可以做h5,做哪个视频网站赚钱的,宁波做网站皆选蓉胜网络linux 平台好像没有带图形界面的PDF处理工具。为了应付日常使用#xff0c;我用豆包写了一个PDF文件合并、删除特定页面的工具。提示词如下#xff1a; 用 python 编写一个PDF合并、删除特定页面的工具。要求#xff1a; - 具有可视化操作界面。 - 界面上方是一个选择PDF文件…linux 平台好像没有带图形界面的PDF处理工具。为了应付日常使用我用豆包写了一个PDF文件合并、删除特定页面的工具。提示词如下 用 python 编写一个PDF合并、删除特定页面的工具。要求 - 具有可视化操作界面。 - 界面上方是一个选择PDF文件的区域。支持多选。选择文件后将文件路径显示于下方。 - 选择文件区域下方是“开始合并”按钮。点击后开始按顺序合并PDF文件。合并完成后弹出合并后的文件已保存的提示框。 - 选择文件区域与“开始合并”按钮合属于一个操作区。与接下来的页面删除操作区要有区域分割的美化设计。 - 页面删除操作区包含一个待删除页码输入框、“删除”按钮.点击“删除”按钮后保存。 - 待删除页码输入框支持一次输入多个页码中间用“”隔开。这句话也在界面上提示用户。 写的很随便。也说明了现在AI 编程已经很方便了不用刻意按某特定格式。
但是很多细节AI 理解的不好还需要多伦对话调整。最明显的就是整个窗口的大小他最初设置的不对隐藏了一些按钮。 具体代码如下
import os
import tkinter as tk
from tkinter import filedialog, messagebox, ttk
from PyPDF2 import PdfReader, PdfWriter
import reclass PDFTool:def __init__(self, root):self.root rootself.root.title(PDF处理工具)self.root.geometry(700x600)self.root.resizable(True, True)# 设置中文字体支持self.root.option_add(*Font, SimHei 10)# 存储选择的PDF文件路径self.pdf_files []# 当前打开的PDF文件self.current_pdf None# 当前PDF的页面数self.page_count 0# 创建主框架self.main_frame ttk.Frame(root, padding10)self.main_frame.pack(filltk.BOTH, expandTrue)# 创建合并操作区域self.create_merge_frame()# 创建分隔线self.separator ttk.Separator(self.main_frame, orienthorizontal)self.separator.pack(filltk.X, pady15)# 创建删除页面操作区域self.create_delete_frame()# 状态栏self.status_var tk.StringVar()self.status_var.set(就绪)self.status_bar ttk.Label(root, textvariableself.status_var, relieftk.SUNKEN, anchortk.W)self.status_bar.pack(sidetk.BOTTOM, filltk.X)def create_merge_frame(self):创建PDF合并操作区域merge_frame ttk.LabelFrame(self.main_frame, textPDF合并, padding10)merge_frame.pack(filltk.BOTH, expandTrue, pady(0, 10))# 选择文件按钮select_btn ttk.Button(merge_frame, text选择PDF文件, commandself.select_pdf_files)select_btn.pack(pady5)# 文件列表区域list_frame ttk.Frame(merge_frame)list_frame.pack(filltk.BOTH, expandTrue, pady5)# 列表框显示已选择的文件self.file_listbox tk.Listbox(list_frame, selectmodetk.EXTENDED, width80, height5)self.file_listbox.pack(sidetk.LEFT, filltk.BOTH, expandTrue)# 列表框滚动条scrollbar ttk.Scrollbar(list_frame, orienttk.VERTICAL, commandself.file_listbox.yview)scrollbar.pack(sidetk.RIGHT, filltk.Y)self.file_listbox.config(yscrollcommandscrollbar.set)# 移动文件顺序的按钮btn_frame ttk.Frame(merge_frame)btn_frame.pack(filltk.X, pady5)up_btn ttk.Button(btn_frame, text上移, commandself.move_up)up_btn.pack(sidetk.LEFT, padx5)down_btn ttk.Button(btn_frame, text下移, commandself.move_down)down_btn.pack(sidetk.LEFT, padx5)remove_btn ttk.Button(btn_frame, text移除, commandself.remove_file)remove_btn.pack(sidetk.LEFT, padx5)# 合并按钮merge_btn ttk.Button(merge_frame, text开始合并, commandself.merge_pdfs)merge_btn.pack(pady10)def create_delete_frame(self):创建PDF页面删除操作区域delete_frame ttk.LabelFrame(self.main_frame, textPDF页面删除, padding10)delete_frame.pack(filltk.BOTH, expandTrue)# 选择PDF文件select_pdf_frame ttk.Frame(delete_frame)select_pdf_frame.pack(filltk.X, pady5)ttk.Label(select_pdf_frame, text选择PDF文件:).pack(sidetk.LEFT)self.pdf_path_var tk.StringVar()pdf_entry ttk.Entry(select_pdf_frame, textvariableself.pdf_path_var, width50)pdf_entry.pack(sidetk.LEFT, padx5, filltk.X, expandTrue)browse_btn ttk.Button(select_pdf_frame, text浏览..., commandself.browse_pdf)browse_btn.pack(sidetk.LEFT)# 页面信息self.page_info_var tk.StringVar()page_info_label ttk.Label(delete_frame, textvariableself.page_info_var)page_info_label.pack(filltk.X, pady5)# 页码输入page_frame ttk.Frame(delete_frame)page_frame.pack(filltk.X, pady5)ttk.Label(page_frame, text待删除页码(用逗号分隔):).pack(sidetk.LEFT)self.pages_to_delete_var tk.StringVar()pages_entry ttk.Entry(page_frame, textvariableself.pages_to_delete_var, width30)pages_entry.pack(sidetk.LEFT, padx5, filltk.X, expandTrue)# 提示信息ttk.Label(delete_frame, text提示: 页码从1开始例如删除第1、3、5页请输入: 1,3,5).pack(filltk.X, pady5)# 删除按钮self.delete_btn ttk.Button(delete_frame, text删除并保存, commandself.delete_and_save_pages)self.delete_btn.pack(pady10)def select_pdf_files(self):选择PDF文件files filedialog.askopenfilenames(title选择PDF文件,filetypes[(PDF文件, *.pdf), (所有文件, *.*)])if files:self.pdf_files.extend(files)self.update_file_listbox()def update_file_listbox(self):更新文件列表框显示self.file_listbox.delete(0, tk.END)for file in self.pdf_files:self.file_listbox.insert(tk.END, os.path.basename(file))def move_up(self):将选中的文件上移selected self.file_listbox.curselection()if not selected:returnfor i in selected:if i 0:self.pdf_files[i], self.pdf_files[i-1] self.pdf_files[i-1], self.pdf_files[i]self.update_file_listbox()# 重新选择for i in selected:if i 0:self.file_listbox.selection_set(i-1)def move_down(self):将选中的文件下移selected self.file_listbox.curselection()if not selected:return# 从后往前处理避免索引变化问题for i in reversed(selected):if i len(self.pdf_files) - 1:self.pdf_files[i], self.pdf_files[i1] self.pdf_files[i1], self.pdf_files[i]self.update_file_listbox()# 重新选择for i in selected:if i len(self.pdf_files) - 1:self.file_listbox.selection_set(i1)def remove_file(self):移除选中的文件selected self.file_listbox.curselection()if not selected:return# 从后往前删除避免索引变化问题for i in reversed(selected):del self.pdf_files[i]self.update_file_listbox()def merge_pdfs(self):合并选中的PDF文件if not self.pdf_files:messagebox.showwarning(警告, 请先选择PDF文件)return# 选择保存位置output_path filedialog.asksaveasfilename(title保存合并后的PDF,defaultextension.pdf,filetypes[(PDF文件, *.pdf), (所有文件, *.*)])if not output_path:returntry:# 创建PDF写入器writer PdfWriter()# 合并所有PDFfor pdf_file in self.pdf_files:reader PdfReader(pdf_file)for page in reader.pages:writer.add_page(page)# 保存合并后的PDFwith open(output_path, wb) as output_file:writer.write(output_file)messagebox.showinfo(成功, fPDF文件已合并并保存至:\n{output_path})self.status_var.set(fPDF已合并: {output_path})except Exception as e:messagebox.showerror(错误, f合并PDF时出错:\n{str(e)})self.status_var.set(合并PDF失败)def browse_pdf(self):浏览并选择要删除页面的PDF文件file_path filedialog.askopenfilename(title选择PDF文件,filetypes[(PDF文件, *.pdf), (所有文件, *.*)])if file_path:self.pdf_path_var.set(file_path)self.current_pdf file_pathself.load_pdf_info()def load_pdf_info(self):加载PDF文件信息try:reader PdfReader(self.current_pdf)self.page_count len(reader.pages)self.page_info_var.set(f当前PDF: {os.path.basename(self.current_pdf)}, 共 {self.page_count} 页)# 确保删除按钮可用self.delete_btn.config(statetk.NORMAL)except Exception as e:messagebox.showerror(错误, f加载PDF文件时出错:\n{str(e)})self.page_info_var.set(加载PDF失败)def delete_and_save_pages(self):删除指定页码的页面并保存if not self.current_pdf:messagebox.showwarning(警告, 请先选择PDF文件)returnpages_input self.pages_to_delete_var.get().strip()if not pages_input:messagebox.showwarning(警告, 请输入要删除的页码)return# 解析页码输入try:pages_to_delete []for page_str in re.split(r[,\s], pages_input):if page_str:page_num int(page_str)if page_num 1 or page_num self.page_count:raise ValueError(f页码 {page_num} 超出范围 (1-{self.page_count}))pages_to_delete.append(page_num - 1) # 转换为0-based索引# 确保页码唯一并排序pages_to_delete sorted(set(pages_to_delete))# 创建PDF读取器和写入器reader PdfReader(self.current_pdf)writer PdfWriter()# 添加不需要删除的页面for i in range(self.page_count):if i not in pages_to_delete:writer.add_page(reader.pages[i])# 选择保存位置output_path filedialog.asksaveasfilename(title保存修改后的PDF,defaultextension.pdf,filetypes[(PDF文件, *.pdf), (所有文件, *.*)])if not output_path:return# 保存修改后的PDFwith open(output_path, wb) as output_file:writer.write(output_file)messagebox.showinfo(成功, f已删除 {len(pages_to_delete)} 页共 {self.page_count - len(pages_to_delete)} 页剩余\nPDF文件已保存至:\n{output_path})self.status_var.set(fPDF已保存: {output_path})# 更新当前PDF为修改后的版本self.current_pdf output_pathself.load_pdf_info()except ValueError as e:messagebox.showerror(输入错误, str(e))except Exception as e:messagebox.showerror(错误, f处理PDF时出错:\n{str(e)})if __name__ __main__:root tk.Tk()app PDFTool(root)root.mainloop()