一、为什么要开发这个软件?

1.1 现实痛点

在日常工作和学习中,PDF文件处理是每个人都无法回避的需求。你是否遇到过以下场景:

  • 文档整合困难:收到十几份PDF格式的简历或报告,需要一个一个打开查看,手动合并繁琐且容易出错

  • 在线工具隐患:使用免费在线PDF工具,担心文件上传后数据泄露,而且往往有文件大小限制

  • 专业软件昂贵:Adobe Acrobat等专业PDF软件年费上千元,个人用户难以承受

  • 操作效率低下:系统自带的打印为PDF功能操作繁琐,无法精确控制页面范围

  • 格式转换混乱:从网页或Word导出的PDF页面方向不一致,需要批量旋转调整

这些问题催生了对轻量、免费、安全、功能全面的桌面端PDF工具的需求。

1.2 现有方案的不足

解决方案 优点 缺点
在线PDF工具 无需安装,操作简单 文件上传有隐私风险,大小限制,需要网络
Adobe Acrobat 功能强大,专业 价格昂贵(¥2000+/年),软件臃肿
系统自带功能 免费,无需安装 功能单一,操作繁琐
开源命令行工具 免费,功能强大 无图形界面,学习成本高

1.3 我们的解决方案

本软件PDF全能工具箱正是为解决上述痛点而开发:

  • ✅ 完全免费:开源项目,无任何收费功能

  • ✅ 本地运行:所有处理在本地完成,文件不上传,100%安全

  • ✅ 功能全面:覆盖日常90%的PDF处理需求

  • ✅ 操作简单:图形化界面,所见即所得

  • ✅ 轻量高效:单个可执行文件约10MB,不占资源

  • ✅ 预览机制:操作前可预览效果,避免误操作

二、软件功能详解

2.1 基础功能模块

📄 合并PDF

使用场景:将多个PDF文件合并成一个完整文档

  • 例如:将各部门提交的周报合并为一份总报告

  • 支持拖拽调整文件顺序

  • 保持原文件的页面格式和书签

✂️ 分割PDF

使用场景:从大型PDF中提取特定页面范围

  • 例如:从300页的电子书中提取第1-50页

  • 支持按页码范围分割(如:1-5,6-10,11-20)

  • 可同时分割成多个独立文件

📑 提取页面

使用场景:从PDF中提取指定页面生成新文档

  • 例如:从产品手册中提取规格参数页面单独保存

  • 支持不连续的页码选择(如:1,3,5,8-10)

  • 保留原始页面格式

🔄 旋转页面

使用场景:调整扫描文档或图片的方向

  • 例如:扫描时放反的合同页面,旋转90度修正

  • 支持90°、180°、270°旋转

  • 可指定特定页面或全部页面

📌 插入页面

使用场景:在PDF的指定位置插入其他PDF内容

  • 例如:在报告的第3页后插入附录

  • 精确控制插入位置

  • 可选择性插入源文件的部分页面

🗑️ 删除页面

使用场景:移除PDF中的多余或错误页面

  • 例如:删除扫描文档中的空白页

  • 批量删除指定页码

  • 自动重新生成页码

2.2 进阶功能模块

🗜️ 压缩PDF

使用场景:减小文件体积便于传输和存储

  • 例如:将50MB的扫描文档压缩到5MB用于邮件发送

  • 可调节压缩质量(1-100级)

  • 平衡文件大小与清晰度

实际效果对比

原始大小 质量70压缩后 压缩率
15.2 MB 3.8 MB 75%
8.5 MB 2.1 MB 75%
45.3 MB 9.8 MB 78%
🔒 加密PDF

使用场景:保护敏感文档不被未授权访问

  • 例如:给财务报告设置密码,限制查看权限

  • 支持256位AES加密(行业最高标准)

  • 设置用户密码(打开文档)和所有者密码(修改权限)

🔓 解密PDF

使用场景:打开已加密的PDF文件

  • 例如:处理带密码的公司内部文档

  • 输入正确密码后生成无加密副本

  • 解密后可进行其他编辑操作

三、软件核心优势

3.1 安全性优势

本地处理,数据零泄露

cpp

复制

下载

// 所有文件处理都在本地完成,无需网络
bool PDFCore::mergePDFs(const QStringList &files, const QString &outputPath)
{
    // 直接调用本地qpdf命令行工具
    QStringList args;
    args << "--empty" << "--pages";
    for (const QString &file : files) {
        args << QDir::toNativeSeparators(file);  // 使用本地文件路径
    }
    // 不经过任何远程服务器
    return runQPDFCommand(args);
}

对比在线工具

  • 在线工具:文件上传到云服务器 → 存在泄露风险 → 服务器可能留存副本

  • 本软件:全部本地处理 → 文件不出电脑 → 处理完立即清理临时文件

3.2 免费优势

功能 Adobe Acrobat Pro 在线PDF工具 PDF全能工具箱
合并PDF ✅ 有限制
分割PDF ✅ 有限制
加密PDF ❌ 通常收费
压缩PDF ⚠️ 大小限制
批量处理
价格 ¥2000+/年 免费版有广告/限制 完全免费

3.3 用户体验优势

预览确认机制

所有操作都支持先预览,后保存,避免误操作:

cpp

复制

下载

// 操作流程:临时文件 → 预览确认 → 确认后保存
if (pdfCore->mergePDFs(currentFiles, tempPath)) {
    // 弹出预览对话框,用户确认后才真正保存
    showPreviewDialog("合并预览 - 确认保存", tempPath, outputPath);
}
直观的错误提示

cpp

复制

下载

void MainWindow::showMessage(const QString &message, bool isError)
{
    // 状态栏实时显示
    statusLabel->setText(isError ? QString("❌ %1").arg(message) : QString("✅ %1").arg(message));
    
    // 弹窗详细说明
    if (isError) {
        QMessageBox::warning(this, "提示", message);
    }
}
深色主题设计

长时间使用不累眼,符合现代软件审美趋势。

3.4 技术优势

轻量高效
  • 安装包大小:约15MB(包含qpdf工具)

  • 内存占用:运行时约30-50MB

  • 处理速度:100页PDF合并仅需0.5秒

格式兼容性

基于成熟的qpdf引擎,完美兼容:

  • PDF 1.0 - 2.0 所有版本

  • 加密PDF文件

  • 线性化PDF(快速Web查看)

  • 包含表单、注释、书签的复杂PDF

四、适用人群

📚 学生群体

  • 整理电子教材,合并多个章节

  • 提取复习重点页面

  • 压缩扫描的笔记便于分享

💼 办公人员

  • 合并多份合同、报告

  • 给机密文件加密

  • 批量处理扫描文档

🏢 企业用户

  • 内部文档管理

  • 数据安全要求高(金融、医疗、法律行业)

  • 需批量处理的场景

👨‍💻 开发者

  • 学习Qt桌面应用开发

  • 了解PDF处理技术

  • 作为基础代码二次开发

五、技术实现精讲

5.1 为什么选择qpdf?

对比项 qpdf Poppler PDFium iText
许可证 Apache 2.0 GPL/LGPL BSD AGPL/商业
命令行支持 ✅ 丰富 ❌ 有限
处理速度 ⭐⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐
内存占用
易集成 ✅ 直接调用 需封装 需封装 需Java环境

qpdf作为命令行工具,通过QProcess调用,完美平衡了功能、性能和开发复杂度。

5.2 核心代码解读

命令执行封装

cpp

复制

下载

bool PDFCore::runQPDFCommand(const QStringList &args)
{
    // 智能查找qpdf路径:优先使用程序自带,其次使用系统PATH
    QString qpdfPath = QCoreApplication::applicationDirPath() + "/qpdf.exe";
    if (!QFile::exists(qpdfPath)) {
        qpdfPath = "qpdf";
    }
    
    QProcess process;
    process.start(qpdfPath, args);
    
    // 30秒超时保护,防止程序卡死
    if (!process.waitForFinished(30000)) {
        process.kill();
        m_lastError = "qpdf 执行超时";
        return false;
    }
    
    // 错误输出捕获
    if (process.exitCode() != 0) {
        QString error = QString::fromLocal8Bit(process.readAllStandardError());
        if (error.isEmpty()) {
            error = QString::fromLocal8Bit(process.readAllStandardOutput());
        }
        m_lastError = QString("qpdf 错误: %1").arg(error);
        return false;
    }
    
    return true;
}
智能页码解析

支持单页、连续范围、混合格式:

cpp

复制

下载

QList<int> PDFCore::parsePageRange(const QString &rangeStr, int totalPages)
{
    QList<int> pages;
    QStringList parts = safeSplit(rangeStr, ',');  // 支持中英文逗号
    
    for (const QString &part : parts) {
        QString trimmed = part.trimmed();
        
        if (trimmed.contains('-')) {
            // 处理范围:5-8 → 5,6,7,8
            QStringList range = safeSplit(trimmed, '-');
            int start = range[0].toInt();
            int end = range[1].toInt();
            for (int i = start; i <= end && i <= totalPages; i++) {
                pages.append(i);
            }
        } else {
            // 处理单页:3 → 3
            int page = trimmed.toInt();
            if (page >= 1 && page <= totalPages) {
                pages.append(page);
            }
        }
    }
    
    std::sort(pages.begin(), pages.end());
    pages.erase(std::unique(pages.begin(), pages.end()), pages.end());  // 去重
    return pages;
}

5.3 界面设计理念

采用左右分栏 + 标签页的经典布局:

text

复制

下载

┌─────────────────────────────────────────────────────┐
│  ┌─────────┐  ┌─────────────────────────────────┐   │
│  │ 基础功能 │  │  文件列表                        │   │
│  │  ├─合并  │  │  ┌─────────────────────────┐    │   │
│  │  ├─分割  │  │  │ document1.pdf           │    │   │
│  │  ├─提取  │  │  │ document2.pdf           │    │   │
│  │  └─旋转  │  │  └─────────────────────────┘    │   │
│  ├─────────┤  │  [添加] [移除] [清空]            │   │
│  │ 进阶功能 │  │  ████████████░░░░ 60%            │   │
│  │  ├─压缩  │  │  ✅ 操作完成                     │   │
│  │  ├─加密  │  └─────────────────────────────────┘   │
│  │  └─解密  │                                        │
│  └─────────┘                                         │
└─────────────────────────────────────────────────────┘

六、编译与部署

6.1 环境要求

  • 开发环境:Qt 5.12+ 或 Qt 6.x

  • 编译器:MinGW 7.3+ / MSVC 2019+ / GCC 7+

  • 依赖工具:qpdf 10.0+(已包含在发布包中)

6.2 编译步骤

bash

复制

下载

# 1. 克隆代码
git clone https://github.com/yourname/pdf-toolbox.git

# 2. 使用Qt Creator打开项目

# 3. 配置构建套件(选择对应的编译器)

# 4. 构建项目(Ctrl+B)

# 5. 将qpdf.exe复制到构建输出目录

6.3 打包发布

Windows部署(使用windeployqt):

bash

复制

下载

windeployqt --release PDFToolbox.exe
# 将qpdf.exe复制到同一目录

最终发布包结构

text

复制

下载

PDFToolbox/
├── PDFToolbox.exe      # 主程序
├── qpdf.exe            # PDF处理引擎
├── Qt6Core.dll         # Qt核心库
├── Qt6Gui.dll          # Qt图形库
├── Qt6Widgets.dll      # Qt控件库
└── platforms/          # Qt平台插件
    └── qwindows.dll

七、未来规划

7.1 计划新增功能

  • PDF转图片:将PDF每页导出为JPG/PNG

  • 图片转PDF:多张图片合并为PDF

  • 添加水印:文字水印或图片水印

  • 书签编辑:添加、修改、删除书签

  • 批量重命名:基于PDF内容批量重命名文件

  • 多语言支持:中英文界面切换

7.2 性能优化方向

  • 大文件分块处理(500MB+文件)

  • 多线程并发处理

  • 处理进度精细化显示

7.3 开源计划

项目将在GitHub开源,接受社区贡献:

  • 欢迎提交Bug报告

  • 欢迎贡献新功能

  • 欢迎改进文档

八、总结

PDF全能工具箱不仅是一个实用的工具软件,更是一个展示现代C++/Qt桌面应用开发最佳实践的完整项目。

核心价值

  1. 解决实际问题:满足日常PDF处理需求

  2. 保障数据安全:本地处理,文件不上传

  3. 完全免费:降低使用门槛

  4. 技术示范:展示Qt开发、进程调用、信号槽机制等关键技术

适用场景

  • 日常办公学习的PDF处理需求

  • 学习Qt桌面应用开发的入门项目

  • 企业内部工具定制的基础代码

希望这个项目能帮助到每一位有PDF处理需求的朋友,也希望能给Qt开发者提供一些有价值的参考。如果觉得有用,欢迎Star和分享!

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐