当前位置:首页>python>用Python打造PDF工具箱(附下载)

用Python打造PDF工具箱(附下载)

  • 2026-09-02 20:18:16
用Python打造PDF工具箱(附下载)
阅读时间:10分钟难度系数:★★☆☆☆适宜人群:Python初学者、办公自动化爱好者、想学习GUI打包的开发者
你是否经常需要合并PDF、拆分指定页面,却担心在线工具泄露隐私?今天我用Python带你在30分钟内打造一款带图形界面的PDF工具箱,还能打包成exe直接发给朋友用。界面如图:

功能一览

  • 合并PDF:选择多个文件,合并成一个

  • 拆分PDF:拆成单页,或提取指定页码范围

  • 删除页面:去掉不需要的页码

  • 美观界面:主窗口居中,关于窗口自动居中

  • 自定义图标:exe带专属图标

  • 内置公众号二维码:点击“关于”即可扫码关注

技术栈

  • Python 3.13

  • pypdf:处理PDF的核心库

  • tkinter:Python自带GUI库

  • Pillow:处理二维码图片(PNG转PhotoImage)

  • PyInstaller:打包成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

参数说明:

  • --onefile:打包成单个exe文件

  • --icon:指定exe图标

  • --add-data:将二维码图片打包进去,Windows用分号分隔,Linux/mac用冒号

使用说明

  1. 双击运行pdf_tool.exe,主窗口居中显示。

  2. 合并PDF:点击按钮 → 选择多个PDF文件 → 选择输出位置 → 完成。

  3. 拆分PDF:选择源文件 → 输入模式(1=拆为单页,2=提取页码范围) → 若选2,输入页码范围(如 1-3,5,7-9) → 选择输出位置。

  4. 删除页面:选择源文件 → 输入要删除的页码范围(如 2-4,6) → 选择输出位置。

  5. 关于:弹出关于窗口,显示二维码和公众号信息。

  6. 退出:点击退出按钮或关闭窗口。

所有操作完成后会有弹窗提示成功或失败。

踩坑记录

图标不显示?

  • 确保ICO文件包含多个尺寸(16、32、48、256),可使用在线转换工具生成。

  • 如果exe图标未及时更新,重启资源管理器或重启电脑。

  • 右键exe → 属性,如果左上角能看到图标,说明嵌入成功,只是文件资源管理器缓存问题。

打包后二维码加载失败?

  • 必须使用 --add-data 将图片打包进去。

  • 代码中必须用 resource_path 获取路径,不能硬编码。

关于窗口位置不对?

  • 需要在 Toplevel 显示前调用 parent.update_idletasks() 确保获取到主窗口的最新位置和大小。

成果展示

最终生成的exe文件大小约25.5MB(包含Python环境和依赖库),但可以脱离Python环境在任何Windows电脑上运行。图标是你自定义的,关于窗口里带有公众号二维码,方便用户关注获取更多工具。

总结与扩展

通过这个项目,你不仅学会了如何用Python操作PDF,还掌握了构建GUI、打包exe、处理资源路径、自定义图标等技能。你可以在此基础上继续扩展,例如增加PDF加密、添加水印、页面旋转等功能,打造属于你自己的PDF神器。

如果你也想拥有这样一个工具,可以直接在公众号后台回复 “PDF工具箱” 获取下载链接。如果你在制作过程中遇到问题,欢迎在评论区留言交流。

关注我的公众号【任意形】,获取更多编程干货和实用工具!

最新文章

随机文章