展开菜单
首页 精品内容 本月促销 装机必备 Windows PDF教程 macOS软件 IOS软件 Android AI 专题
全部分类

当前位置:

首页 > 编程开发 > Python结合PyQt5开发一个PDF批量合并工具

Python结合PyQt5开发一个PDF批量合并工具

日常工作中,需要把多个PDF文件合并成一个的场景并不少见。面对网上的在线工具,我们常常会纠结:要么被广告干扰,要么有页数限制,更让人担心的是文件隐私问题。今天,我们就来动手解决这个痛点——用Python和PyQt5,从零打造一款完全本地运行、无广告、无任何限制的PDF批量合并工具。 一、为什么要自己

本文目录

    日常工作中,需要把多个PDF文件合并成一个的场景并不少见。面对网上的在线工具,我们常常会纠结:要么被广告干扰,要么有页数限制,更让人担心的是文件隐私问题。今天,我们就来动手解决这个痛点——用Python和PyQt5,从零打造一款完全本地运行、无广告、无任何限制的PDF批量合并工具。

    一、为什么要自己做?

    在动手之前,不妨先看看市面上的主流方案,它们大致可以分为三类:

    方案缺点
    在线网站(如 SmallPDF)文件上传有大小限制,隐私风险
    Adobe Acrobat正版昂贵,杀鸡焉用牛刀
    命令行脚本对非技术用户不友好

    这么一看,我们的目标就很明确了:打造一个拥有图形界面、支持拖拽操作、且完全在本地运行的轻量级工具。

    二、技术选型

    要实现这个目标,技术栈的选择至关重要。下面这张表清晰地展示了我们的选择与理由:

    需求选型理由
    GUI 框架PyQt5成熟稳定,跨平台,控件丰富
    PDF 操作PyPDF2轻量级,合并功能完善,纯 Python
    多线程QThread与 PyQt5 完美配合,避免界面冻结

    三、安装依赖

    万事开头先装包。打开你的命令行,执行以下命令即可:

    pip install PyQt5 PyPDF2

    当然,更规范的做法是使用 requirements.txt 文件:

    pip install -r requirements.txt

    四、整体架构设计

    整个程序的核心逻辑可以清晰地划分为3个模块:

    pdf_merger.py

    ├── MergeWorker — 后台合并线程

    ├── DragDropListWidget — 支持拖拽的文件列表控件

    └── PDFMergerApp — 主窗口(界面 + 业务逻辑)

    数据流

    整个工具的工作流程,可以概括为以下几步:

    用户操作 → 添加文件到列表 → 点击合并

    ↓

    启动 MergeWorker 线程

    ↓

    逐个 append PDF → 写入输出文件

    ↓

    信号通知主线程 → 更新日志和进度条

    五、核心代码详解

    5.1 后台合并线程 — MergeWorker

    为什么一定要用线程?道理很简单:PDF合并是典型的IO密集型操作,如果放在主线程里执行,整个界面就会“卡死”,用户体验极差。PyQt5的QThread配合信号(Signal)机制,正是解决这个问题的利器。

    class MergeWorker(QThread):
        log_signal = pyqtSignal(str)        # 日志消息
        progress_signal = pyqtSignal(int)   # 进度百分比
        finished_signal = pyqtSignal(bool, str)  # 完成状态
    
        def __init__(self, file_list, output_path):
            super().__init__()
            self.file_list = file_list
            self.output_path = output_path
    
        def run(self):
            merger = PdfMerger()
            total = len(self.file_list)
            try:
                for idx, fpath in enumerate(self.file_list, 1):
                    self.log_signal.emit(f"[{idx}/{total}] 正在添加: {os.path.basename(fpath)}")
                    merger.append(fpath)
                    self.progress_signal.emit(int(idx / total * 100))
    
                merger.write(self.output_path)
                merger.close()
                self.finished_signal.emit(True, self.output_path)
            except Exception as e:
                self.finished_signal.emit(False, str(e))
    

    关键点:

    • 定义了三个信号:日志、进度、完成状态
    • run() 方法在子线程执行,通过信号回传到主线程更新 UI
    • 使用 try/except 捕获异常,合并失败不会崩溃

    5.2 拖拽列表控件 — DragDropListWidget

    PyQt5自带的QListWidget默认不支持从系统文件管理器拖入文件,这显然不够方便。我们需要通过重写几个关键事件来实现这个功能。

    class DragDropListWidget(QListWidget):
        files_dropped = pyqtSignal(list)  # 拖入的路径列表
    
        def __init__(self, parent=None):
            super().__init__(parent)
            self.setAcceptDrops(True)
            self.setDragDropMode(QAbstractItemView.InternalMove)
    
        def dragEnterEvent(self, event):
            if event.mimeData().hasUrls():
                event.acceptProposedAction()
            else:
                super().dragEnterEvent(event)
    
        def dropEvent(self, event):
            if event.mimeData().hasUrls():
                paths = [url.toLocalFile() for url in event.mimeData().urls() if url.toLocalFile()]
                self.files_dropped.emit(paths)
                event.acceptProposedAction()
            else:
                super().dropEvent(event)
    

    关键点:

    • setAcceptDrops(True) 允许接受外部拖拽
    • setDragDropMode(InternalMove) 同时支持列表内部拖拽排序
    • dragEnterEvent 判断拖入的是否为文件 URL
    • dropEvent 提取本地路径,发射自定义信号

    5.3 主窗口 — PDFMergerApp

    主窗口负责整个界面的布局和核心业务逻辑的串联。其核心布局结构如下:

    QMainWindow

    └── QVBoxLayout (根布局)

    ├── QLabel (标题)

    ├── QLabel (副标题)

    ├── QSplitter (垂直分割)

    │ ├── QGroupBox — 文件列表区

    │ │ ├── DragDropListWidget

    │ │ └── QHBoxLayout — 按钮行

    │ └── QGroupBox — 日志区

    │ └── QTextEdit

    ├── QProgressBar (进度条)

    └── QPushButton (合并按钮)

    文件收集逻辑

    为了提升易用性,我们支持同时传入文件和文件夹路径,并自动递归收集所有PDF文件:

    def _collect_pdfs(self, paths):
        pdfs = []
        for p in paths:
            if os.path.isfile(p) and p.lower().endswith(".pdf"):
                pdfs.append(p)
            elif os.path.isdir(p):
                for root, _, files in os.walk(p):
                    for f in sorted(files):
                        if f.lower().endswith(".pdf"):
                            pdfs.append(os.path.join(root, f))
        return pdfs
    

    去重添加

    避免同一个文件被重复添加,保证列表的整洁:

    def _add_to_list(self, new_files):
        added = 0
        for f in new_files:
            if f not in self.pdf_files:
                self.pdf_files.append(f)
                self.file_list_widget.addItem(f)
                added += 1
    

    列表排序

    通过“上移/下移”按钮调整顺序,其核心是交换列表项及其对应的数据:

    def _move_up(self):
        row = self.file_list_widget.currentRow()
        if row > 0:
            item = self.file_list_widget.takeItem(row)
            self.file_list_widget.insertItem(row - 1, item)
            self.file_list_widget.setCurrentRow(row - 1)
            self.pdf_files[row], self.pdf_files[row - 1] = (
                self.pdf_files[row - 1], self.pdf_files[row]
            )
    

    六、样式美化

    功能完备了,界面美观也不能落下。使用Qt的StyleSheet(语法类似CSS),可以轻松统一控件风格:

    QMainWindow {
        background-color: #f5f7fa;
    }
    QGroupBox {
        border: 1px solid #dcdfe6;
        border-radius: 8px;
        background-color: #ffffff;
    }
    #mergeBtn {
        background-color: #3498db;
        color: white;
        font-size: 15px;
        font-weight: bold;
        border-radius: 8px;
    }
    QProgressBar::chunk {
        background: qlineargradient(x1:0, y1:0, x2:1, y2:0,
            stop:0 #3498db, stop:1 #2ecc71);
        border-radius: 5px;
    }

    美化要点:

    • QGroupBox 使用白色背景 + 圆角,呈现卡片效果
    • 合并按钮使用蓝色主题色,hover 和 pressed 有层次感
    • 进度条渐变色(蓝 → 绿),视觉上更有活力
    • 字体使用 Microsoft YaHei,中文显示清晰美观

    七、使用流程

    第一步:启动程序

    python pdf_merger.py

    第二步:添加文件

    三种方式任选,总有一款适合你:

    • 拖拽:直接从文件资源管理器拖入 PDF 文件或文件夹
    • 添加文件:点击按钮,在文件选择对话框中多选 PDF
    • 添加目录:点击按钮,选择一个文件夹,自动扫描其中所有 PDF

    第三步:调整顺序

    • 选中某个文件,用 ⬆/⬇ 按钮调整位置
    • 或者直接在列表中拖拽排序

    第四步:点击合并

    • 点击 “? 开始合并”
    • 选择保存位置和文件名
    • 等待完成,日志区实时显示处理进度

    八、可能遇到的问题与解决

    1. 安装 PyQt5 失败

    网络问题可能导致安装缓慢或失败,可以尝试使用国内镜像源加速:

    # 尝试使用国内镜像
    pip install PyQt5 -i https://pypi.tuna.tsinghua.edu.cn/simple

    2. 合并时报错 “PdfReadError”

    这通常是因为PDF文件本身已损坏或被加密。解决方法也很直接:

    • 排除问题文件(可在日志中看到是哪个文件报错)
    • 使用其他工具先修复或解密该 PDF

    3. 打包为 EXE

    想分发给没有Python环境的同事使用?用PyInstaller一键打包即可:

    pip install pyinstaller
    pyinstaller --onefile --windowed --name "PDF合并工具" pdf_merger.py

    打包后的独立EXE文件会生成在 dist/ 目录下。

    九、进阶扩展思路

    如果你觉得这个基础版本已经满足需求,那当然很好。但如果你想把它打磨得更强大,下面这些扩展方向或许能给你带来灵感:

    方向说明
    支持加密 PDF在 append 前使用 PdfReader 解密
    选择页面范围允许用户选择每个 PDF 的特定页面
    预览功能使用 pdf2image 生成缩略图预览
    保存/加载配置记住上次的文件列表和输出路径
    多语言使用 Qt 的 i18n 机制支持英文等
    打包发布使用 PyInstaller / Nuitka 打包为单文件 EXE

    十、完整项目结构

    整个项目的文件结构非常清晰,一目了然:

    19-批量PDF合并工具/

    ├── pdf_merger.py # 主程序源码

    ├── requirements.txt # 依赖清单

    ├── README.md # 项目说明

    └── blog.md # 本篇开发博客

    总结

    回顾一下,我们通过这篇文章,从零实现了一个功能完整的PDF批量合并工具:

    • PyPDF2 负责 PDF 的读取与合并
    • PyQt5 构建了美观的图形界面
    • QThread 保证了合并过程中界面不冻结
    • 拖拽功能 让操作更加便捷
    • QSS 样式 让界面更加美观

    整个项目只有一个Python文件,代码约300行,结构简洁,逻辑清晰。希望这个小工具能切实提升你的工作效率,也希望这篇教程能为你打开一扇窗,看到用PyQt5进行桌面应用开发的便捷与乐趣。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 Python
    下一篇: 如何学习编程
    相关文章 更多
    精品专题 更多
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    macOS软件

    正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

    IOS软件

    正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

    AI

    正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

    Mac软件 更多
    Aperty macOS版
    Aperty macOS版

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    火山引擎 网页版
    火山引擎 网页版

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    立刻MV 网页版
    立刻MV 网页版

    立刻MV 面向音乐人、内容创作者和品牌团队,帮助用户低成本完成歌曲 MV、歌词视频、AI 分镜、图生视频与最终合成。

    蛙蛙写作 网页版
    蛙蛙写作 网页版

    蛙蛙写作 AI 创作工具,覆盖小说、剧本、文案,一键生成文稿,打通文字转视频全流程,高效解决创作难题。

    讯飞智作 网页版
    讯飞智作 网页版

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    超级简历WonderCV 网页版
    超级简历WonderCV 网页版

    超级简历WonderCV是面向应届生和AI小白的智能求职平台,覆盖简历、面试与职业规划。

    音述AI 网页版
    音述AI 网页版

    音述AI,是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区。

    AionClaw macOS版
    AionClaw macOS版

    AionClaw 是可在桌面端运行的任务型 AI 助手,通过数字专家与技能市场组合办公、创作、数据和开发能力。

    Loomy macOS版
    Loomy macOS版

    Loomy 是科大讯飞推出的桌面 AI 助手,可通过对话、任务与工作目录协助处理办公、内容创作和资料整理。

    AirBuddy 3 macOS版
    AirBuddy 3 macOS版

    AirBuddy 3 是面向 macOS 的蓝牙外设增强工具,可集中查看 AirPods、Beats 与苹果设备电量,提供快速连接、播放控制、电量提醒、桌面小组件和多台 Mac 外设接力等功能。

    AirServer macOS版
    AirServer macOS版

    AirServer macOS版可把 Mac 转换为无线投屏接收端,通过 AirPlay 或 Google Cast 接收手机、平板和电脑画面,并支持多设备同时连接、高清镜像及会话录制,适合家庭娱乐、课堂教学、会议演示和应用展示。

    AnyDesk macOS版
    AnyDesk macOS版

    AnyDesk macOS版是一款适用于远程办公、设备维护和客户支持的远程桌面工具,可连接并操作异地计算机,支持文件传输、无人值守访问、会话权限控制及跨平台协作。

    WINDOWS 更多
    讯飞绘文 网页版
    讯飞绘文 网页版

    讯飞绘文网页版是科大讯飞推出的AI图文创作与内容运营工具,覆盖热点选题、文章生成、稿件校对、智能配图、排版发布和数据复盘等环节,适合自媒体创作者及内容团队在线使用。

    Maya(Autodesk Maya) Windows版
    Maya(Autodesk Maya) Windows版

    Autodesk Maya 是面向影视、电视、动画和游戏行业的专业三维制作软件,集多边形与 NURBS 建模、角色绑定、关键帧和动作捕捉动画、Bifrost 特效模拟、材质开发及 Arnold 渲染于一体,

    Aperty Windows版
    Aperty Windows版

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    火山引擎 网页版
    火山引擎 网页版

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    立刻MV 网页版
    立刻MV 网页版

    立刻MV 面向音乐人、内容创作者和品牌团队,帮助用户低成本完成歌曲 MV、歌词视频、AI 分镜、图生视频与最终合成。

    蛙蛙写作 网页版
    蛙蛙写作 网页版

    蛙蛙写作 AI 创作工具,覆盖小说、剧本、文案,一键生成文稿,打通文字转视频全流程,高效解决创作难题。

    讯飞智作 网页版
    讯飞智作 网页版

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    超级简历WonderCV 网页版
    超级简历WonderCV 网页版

    超级简历WonderCV是面向应届生和AI小白的智能求职平台,覆盖简历、面试与职业规划。

    音述AI 网页版
    音述AI 网页版

    音述AI,是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区。

    AionClaw Windows版
    AionClaw Windows版

    AionClaw 是可在桌面端运行的任务型 AI 助手,通过数字专家与技能市场组合办公、创作、数据和开发能力。

    Loomy Windows版
    Loomy Windows版

    Loomy 是科大讯飞推出的桌面 AI 助手,可通过对话、任务与工作目录协助处理办公、内容创作和资料整理。

    AirServer Windows版
    AirServer Windows版

    AirServer Windows版可把电脑变成AirPlay、Google Cast和Miracast无线投屏接收端,适合会议演示、课堂教学及家庭大屏分享。发送设备通常无需另装客户端,并可同时接收和智能排列多个镜像会话。