阅读时间:10分钟难度系数:★★☆☆☆适宜人群:Python初学者、办公自动化爱好者、想学习GUI打包的开发者你是否经常需要合并PDF、拆分指定页面,却担心在线工具泄露隐私?今天我用Python带你在30分钟内打造一款带图形界面的PDF工具箱,还能打包成exe直接发给朋友用。界面如图:功能一览
合并PDF:选择多个文件,合并成一个
拆分PDF:拆成单页,或提取指定页码范围
删除页面:去掉不需要的页码
美观界面:主窗口居中,关于窗口自动居中
自定义图标:exe带专属图标
内置公众号二维码:点击“关于”即可扫码关注
技术栈
核心代码实现
1. PDF合并
from pypdf import PdfWriterdef merge_pdfs(pdf_list, output_path): writer = PdfWriter() for pdf in pdf_list: writer.append(pdf) with open(output_path, "wb") as f: writer.write(f)
2. PDF拆分
拆分为单页
from pypdf import PdfReader, PdfWriterdef split_into_pages(input_pdf, output_dir): reader = PdfReader(input_pdf) for i, page in enumerate(reader.pages): writer = PdfWriter() writer.add_page(page) out_path = f"{output_dir}/第{i+1}页.pdf" with open(out_path, "wb") as f: writer.write(f)
def extract_ranges(input_pdf, output_file, range_str): # 解析 "1-3,5,7-9" 这样的字符串 pages = set() for part in range_str.split(','): if '-' in part: start, end = map(int, part.split('-')) pages.update(range(start, end+1)) else: pages.add(int(part)) # 提取对应页面 reader = PdfReader(input_pdf) writer = PdfWriter() for p in sorted(pages): writer.add_page(reader.pages[p-1]) with open(output_file, "wb") as f: writer.write(f)
3. 删除页面
def parse_page_range(range_str): """解析页码范围字符串,返回set""" pages = set() for part in range_str.split(','): if '-' in part: start, end = map(int, part.split('-')) pages.update(range(start, end+1)) else: pages.add(int(part)) return pagesdef delete_pages(input_pdf, output_file, delete_range): delete_set = parse_page_range(delete_range) reader = PdfReader(input_pdf) writer = PdfWriter() for i in range(1, len(reader.pages)+1): if i not in delete_set: writer.add_page(reader.pages[i-1]) with open(output_file, "wb") as f: writer.write(f)
4. 图形界面主窗口居中
import tkinter as tkroot = tk.Tk()root.title("PDF工具箱")win_width, win_height = 300, 250screen_width = root.winfo_screenwidth()screen_height = root.winfo_screenheight()x = (screen_width - win_width) // 2y = (screen_height - win_height) // 2root.geometry(f"{win_width}x{win_height}+{x}+{y}")root.resizable(False, False)
5. 关于窗口居中于主窗口
def show_about(parent): about_win = tk.Toplevel(parent) about_win.title("关于") about_win.geometry("300x450") about_win.resizable(False, False) # 确保主窗口位置信息更新 parent.update_idletasks() parent_x = parent.winfo_rootx() parent_y = parent.winfo_rooty() parent_w = parent.winfo_width() parent_h = parent.winfo_height() x = parent_x + (parent_w - 300) // 2 y = parent_y + (parent_h - 450) // 2 about_win.geometry(f"+{x}+{y}") # 添加二维码图片和文字 try: from PIL import Image, ImageTk qr_path = resource_path("qrcode.png") # 见下文资源处理 img = Image.open(qr_path) photo = ImageTk.PhotoImage(img) label_img = tk.Label(about_win, image=photo) label_img.image = photo # 保持引用 label_img.pack(pady=10) except Exception as e: tk.Label(about_win, text="二维码加载失败").pack() tk.Label(about_win, text="任意形", font=("Arial", 14, "bold")).pack(pady=5) tk.Label(about_win, text="结构·有限元·编程", fg="gray").pack() tk.Label(about_win, text="扫描二维码关注公众号\n获取更多实用工具", justify="center").pack(pady=10) tk.Button(about_win, text="关闭", command=about_win.destroy).pack(pady=10)
6. 资源路径处理(关键!)
打包成exe后,图片等资源文件需要特殊处理,否则会找不到。
import sysimport osdef resource_path(relative_path): """获取资源的绝对路径,兼容开发环境和打包后的exe""" try: base_path = sys._MEIPASS # PyInstaller创建的临时文件夹 except Exception: base_path = os.path.abspath(".") return os.path.join(base_path, relative_path)
qr_path = resource_path("qrcode.png")
7. 打包成exe并添加图标
准备好图标文件 pdf_icon.ico 和二维码图片 qrcode.png,在bash命令行中执行:
pyinstaller --clean --onefile --icon=pdf_icon.ico --add-data "qrcode.png;." pdf_tool.py
参数说明:
使用说明
双击运行pdf_tool.exe,主窗口居中显示。
合并PDF:点击按钮 → 选择多个PDF文件 → 选择输出位置 → 完成。
拆分PDF:选择源文件 → 输入模式(1=拆为单页,2=提取页码范围) → 若选2,输入页码范围(如 1-3,5,7-9) → 选择输出位置。
删除页面:选择源文件 → 输入要删除的页码范围(如 2-4,6) → 选择输出位置。
关于:弹出关于窗口,显示二维码和公众号信息。
退出:点击退出按钮或关闭窗口。
所有操作完成后会有弹窗提示成功或失败。
踩坑记录
图标不显示?
确保ICO文件包含多个尺寸(16、32、48、256),可使用在线转换工具生成。
如果exe图标未及时更新,重启资源管理器或重启电脑。
右键exe → 属性,如果左上角能看到图标,说明嵌入成功,只是文件资源管理器缓存问题。
打包后二维码加载失败?
关于窗口位置不对?
成果展示
最终生成的exe文件大小约25.5MB(包含Python环境和依赖库),但可以脱离Python环境在任何Windows电脑上运行。图标是你自定义的,关于窗口里带有公众号二维码,方便用户关注获取更多工具。
总结与扩展
通过这个项目,你不仅学会了如何用Python操作PDF,还掌握了构建GUI、打包exe、处理资源路径、自定义图标等技能。你可以在此基础上继续扩展,例如增加PDF加密、添加水印、页面旋转等功能,打造属于你自己的PDF神器。
如果你也想拥有这样一个工具,可以直接在公众号后台回复 “PDF工具箱” 获取下载链接。如果你在制作过程中遇到问题,欢迎在评论区留言交流。
关注我的公众号【任意形】,获取更多编程干货和实用工具!