工具分享05 | Python制作PDF合并拆分提取工具V1.0

发布于:2025-08-09 ⋅ 阅读:(14) ⋅ 点赞:(0)


大家好,我是 👉 【Python当打之年(点击跳转)】

本期使用Python的Tkinter制作 PDF合并拆分提取工具,主要功能:

  • 合并功能:将列表中的PDF文件按顺序合并成一个新的PDF文件,可以设置输出文件名称。
  • 拆分功能:拆分单个PDF文件,生成多个新的PDF文件,支持多种页码范围格式(如 “1-3,5,7-9”),可以设置输出目录。
  • 提取功能:提取PDF文件中指定范围页码,生成一个新的PDF文件,同样支持多种页码范围格式(如 “1-3,5,7-9”),可以设置输出文件名称。
    希望对大家有所帮助,如有疑问或者需要改进的地方可以联系小编。

往期分享:
工具分享04 | Python高级图片处理工具
工具分享03 | Python屏幕点击抢票工具,告别拼手速时代
工具分享02 | Python批量文件重命名工具
工具分享01 | Python福彩双色球数据爬取+分析工具

🏳️‍🌈 1. 运行流程

1.1 工具面板

在这里插入图片描述

1.2 PDF文件拆分

在这里插入图片描述

会根据设置的页码范围将PDF文件拆分成几个文件。
例如设置的 1-3,5,7-9 指的是:将文件拆分成第1-3页一个文件,第5页一个文件,第7-9页一个文件,其余部分一个文件,这里一共生成4个文件。

结果:
在这里插入图片描述

打开开看页数:
在这里插入图片描述

1.3 PDF文件合并

在这里插入图片描述
这里使用前面拆分的文件:编码规范中文版_pages_1-3.pdf,编码规范中文版_pages_7-9.pdf,文件页数均为3页,合并后文件页数应为6页

结果:
在这里插入图片描述
打开开看页数:
在这里插入图片描述

1.4 提取PDF页面

在这里插入图片描述
这里我们提取第1-10页:
在这里插入图片描述
打开开看页数:
在这里插入图片描述

1.5 按PDF文件名排序

在这里插入图片描述

1.6 按PDF文件大小排序

在这里插入图片描述

1.7 按PDF文件页数排序

在这里插入图片描述

🏳️‍🌈 2. 绘制

2.1 框架结构布局

def create_widgets(self):
    """创建所有界面组件"""
    # 主框架
    self.main_frame = ttk.Frame(self.root, padding="15", style="MainFrame.TFrame")
    self.main_frame.pack(fill=tk.BOTH, expand=True)

    # 创建菜单
    self.create_menu()

    # 文件选择部分
    self.create_file_section()

    # 功能选择部分
    self.create_function_section()

    # 按钮框架
    self.button_frame = ttk.Frame(self.main_frame, style="MainFrame.TFrame")
    self.button_frame.pack(pady=(15, 0), fill=tk.X)

    self.execute_button = ttk.Button(
        self.button_frame,
        text="执行",
        command=self.start_operation,
        style="Green.TButton",
    )
    self.execute_button.pack(side=tk.LEFT, fill=tk.X, expand=True, padx=(0, 10))

    self.cancel_button = ttk.Button(
        self.button_frame,
        text="取消",
        command=self.cancel_operation,
        style="Red.TButton",
        state=tk.DISABLED
    )
    self.cancel_button.pack(side=tk.LEFT, fill=tk.X, expand=True)

    # 进度条
    self.progress = ttk.Progressbar(
        self.main_frame,
        orient=tk.HORIZONTAL,
        length=100,
        mode='determinate',
        style="Horizontal.TProgressbar",
    )
    self.progress.pack(fill=tk.X, pady=(10, 0))

    # 状态栏
    self.status_var = tk.StringVar(value="准备就绪!")
    self.status_bar = ttk.Label(
        self.root,
        textvariable=self.status_var,
        padding=[15,5]
    )
    self.status_bar.pack(fill=tk.X, side=tk.BOTTOM)

2.2 添加菜单

def create_menu(self):
        """创建菜单系统"""
        menu_bar = tk.Menu(self.root)

        file_menu = tk.Menu(menu_bar, tearoff=0)
        help_menu.add_command(label="联系作者", command=self.about_command)
        menu_bar.add_cascade(label="帮助", menu=help_menu)

        self.root.config(menu=menu_bar)

2.3 文件选择部分

def create_file_section(self):
    """创建文件选择部分"""
    file_frame = ttk.LabelFrame(
        self.main_frame,
        text="PDF 文件",
        padding="10",
        style="Bold.TLabelframe"
    )
    file_frame.pack(fill=tk.BOTH, expand=True, pady=(0, 15))
    list_frame = ttk.Frame(file_frame)
    list_frame.pack(fill=tk.BOTH, expand=True)

    self.file_tree = ttk.Treeview(
        list_frame,
        columns=('size', 'pages', 'path'),
        show='headings',
        selectmode='extended'
    )
    self.file_tree.heading('size', text=' 大小', anchor=tk.W)
    self.file_tree.heading('pages', text=' 页数', anchor=tk.W)
    self.file_tree.heading('path', text=' 路径', anchor=tk.W)

    self.file_tree.column('size', width=80, anchor=tk.W)
    self.file_tree.column('pages', width=60, anchor=tk.W)
    self.file_tree.column('path', width=400, anchor=tk.W)

    self.file_tree.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)

2.4 添加文件

def add_files(self):
        """添加PDF文件到列表"""
        files = filedialog.askopenfilenames(
            title="选择 PDF 文件",
            filetypes=[("PDF 文件", "*.pdf"), ("所有文件", "*.*")]
        )
        if files:
            new_files = [f for f in files if f notin self.pdf_files]
            ifnot new_files:
                self.update_status("没有添加新文件")
                return

            self.pdf_files.extend(new_files)
            self.update_file_list()
            self.update_status(f"已添加 {len(new_files)} 个文件 (总共 {len(self.pdf_files)} 个)")

2.5 文件操作

def merge_pdfs(self):
    output_path = filedialog.asksaveasfilename(
        title="保存 PDF",
        defaultextension=".pdf",
        filetypes=[("PDF 文件", "*.pdf")],
        initialfile=self.output_name.get()
    )

    ifnot output_path or self.operation_cancelled:
        self.update_status("操作已取消")
        return

    try:
        merger = PdfMerger()
        total_files = len(self.pdf_files)
        success_count = 0

        for i, pdf_file in enumerate(self.pdf_files):
            if self.operation_cancelled:
                break

            try:
                with open(pdf_file, 'rb') as f:
                    merger.append(f)
                success_count += 1
            except PdfReadError:
                self.update_status(f"警告: 无法读取文件 {os.path.basename(pdf_file)} - 已跳过")
                continue
            except Exception as e:
                self.update_status(f"警告: 处理文件 {os.path.basename(pdf_file)} 时出错 - {str(e)} - 已跳过")
                continue

        if self.operation_cancelled:
            self.update_status("操作已取消")
            self.reset_progress()
            return

        if success_count == 0:
            self.update_status("处理失败 - 没有有效的PDF文件")
            self.reset_progress()
            return

        with open(output_path, 'wb') as output_file:
            merger.write(output_file)
        merger.close()

    except Exception as e:
        ifnot self.operation_cancelled:
            messagebox.showerror("错误", f"{str(e)}")
            self.update_status("处理 PDF 时出错")

🏳️‍🌈 3. 更多可视化项目源码+数据

点击跳转:【全部可视化项目源码+数据】


以上就是本期为大家整理的全部内容了,赶快练习起来吧,原创不易,喜欢的朋友可以点赞、收藏也可以分享注明出处)让更多人知道。


网站公告

今日签到

点亮在社区的每一天
去签到