乐于分享
好东西不私藏

PDF处理工具国风版 v2.0

PDF处理工具国风版 v2.0
注意:本作品仅使用于教育学习
使用过程中有什么bug或者需要升级的功能也可以说,不定期修复和升级。
有需要的关注微信公众号回复关键词:PDF处理工具

PDF处理工具

国风版 v2.0

功能说明文档

完整功能详解· 实现步骤 · 架构说明

━━━━━━━━━━━━━━━━━━━━━━

作者: CYY

1. 软件概述

1.1 软件简介

PDF处理工具 国风版 v2.0 是一款基于 PyQt5 开发的桌面级 PDF 文档处理软件,采用中国传统国风美学设计界面,提供包括拆分、合并、格式转换、压缩、旋转、水印、加密等十余种实用功能。

1.2 技术栈

GUI框架: PyQt5

PDF处理: PyPDF2, PyMuPDF (fitz)

图片处理: Pillow (PIL)

格式转换: pdf2docx

Python版本: 3.x

1.3 界面特色

采用中国传统国风配色:朱红(#C41E3A)、金色(#D4AF37)、棕色(#8B4513)

使用 QTabWidget 实现分页布局,每个功能模块独立一个标签页

支持文件拖拽添加、批量处理

实时进度显示、异步任务处理

2. 功能模块总览

本软件包含以下五大功能模块,通过标签页进行组织:

功能模块

核心类/文件

主要依赖

拆分功能

SplitThread

PyPDF2

合并功能

MergeThread

PyPDF2 + Pillow

格式转换

PdfToImageThread / ImageToPdfThread / PdfToWordThread / PdfToOFDThread

PyMuPDF + pdf2docx

实用工具

CompressPdfThread / RotatePdfThread / WatermarkPdfThread / ExtractTextThread / EncryptPdfThread

PyMuPDF + PyPDF2

文件信息

PdfInfoThread

PyMuPDF

2.1 模块架构图

┌─────────────────────────────────────────────────────────────┐

│                      PDF处理工具 - 国风版                        │

└─────────────────────────────────────────────────────────────┘

┌───────────┬───────────┬───────────┬───────────┬───────────┐

│  ✂️ 拆分  │  �� 合并  │  �� 转换  │  �� 工具  │  �� 信息  │

└───────────┴───────────┴───────────┴───────────┴───────────┘

│              │              │              │              │

┌─────┴─────┐   ┌─────┴─────┐   ┌─────┴─────┐   ┌─────┴─────┐   ┌─────┴─────┐

│SplitThread│   │MergeThread│   │Pdf2Img   │   │Compress  │   │PdfInfo   │

│Rotate     │   │           │   │Img2Pdf   │   │Rotate    │   │          │

│Watermark  │   │           │   │Pdf2Word  │   │Watermark │   │          │

│Extract    │   │           │   │Pdf2OFD   │   │Extract   │   │          │

│Encrypt    │   │           │   │          │   │Encrypt   │   │          │

└───────────┘   └───────────┘   └───────────┘   └───────────┘   └───────────┘

3. 核心功能详解

3.1 PDF拆分功能

PDF拆分功能支持四种不同的拆分模式,可满足各种文档分割需求。

3.1.1 按文件大小拆分

功能说明:

PDF文档按照指定的目标文件大小进行拆分,自动计算每份的页数,确保每份文件大小不超过设定值。

实现步骤:

1

用户设置

用户输入目标文件大小(如5MB)和单位(MB/KB

2

文件扫描

程序获取PDF文件的总大小和总页数,计算平均每页大小

3

估算页数

使用目标字节数÷ 平均页大小 估算每份的大致页数

4

二分查找

使用二分查找算法精确定位最佳拆分点

5

分批写入

创建PdfWriter,将每批页面写入独立的PDF文件

6

完成输出

生成 part001.pdf, part002.pdf, ... 等文件

核心算法:

① 估算阶段: avg_page_size = file_size / total_pages

② 二分查找: 找到最大的 end,使得 pages[start:end] 的大小 ≤ target_bytes

3.1.2 按文件页数拆分

功能说明:

PDF按照固定页数拆分为多个文件,例如每10页一个文件。

实现步骤:

1

输入参数

用户输入每份的页数(如10页)

2

循环拆分

使用 for 循环,从第0页开始,每 chunk_size 页拆分为一个文件

3

写入文件

创建 PdfWriter,添加对应范围的页面并保存

4

循环处理

重复直到处理完所有页面

3.1.3 按文件份数拆分

功能说明:

PDF均匀拆分为指定份数,例如拆分为3份,每份约相等。

实现步骤:

1

输入份数

用户输入要拆分的份数

2

计算分配

base_size = total_pages // num_chunks(基本页数)

remainder = total_pages % num_chunks(前 remainder 份多1页)

3

循环分配

 i 份的页数 = base_size + (1 if i < remainder else 0)

4

批量写入

将计算出的页面范围写入各子文件

3.1.4 按页码拆分

功能说明:

根据用户指定的页码范围提取页面,支持多种格式输入。

支持的页码格式:

单页: 1, 3, 5

连续页: 1-5 (1页到第5)

混合: 1-5, 7, 9-15

支持中文标点: 1-57(中文逗号)

实现步骤:

1

解析输入

_parse_page_ranges() 方法解析页码字符串

2

转换格式

 1-based 页码转换为 0-based 索引

3

去重排序

使用 set 去重,sorted() 排序

4

单文件输出

将所有指定页面写入一个PDF文件

3.2 PDF合并功能

功能说明:

将多个PDF文件或图片文件合并为一个PDF文件,保持原始顺序。

支持的输入格式:

PDF文件 (*.pdf)

PNG图片 (*.png)

JPEG图片 (*.jpg, *.jpeg)

BMP图片 (*.bmp)

TIFF图片 (*.tiff)

GIF图片 (*.gif)

实现步骤:

1

获取文件列表

从共享文件列表获取所有文件,按显示顺序处理

2

图片预处理

对于图片文件,使用 Pillow 转换为 RGB 模式

RGBA图片需要白色背景合成)

3

内存转换

使用 io.BytesIO 在内存中将图片转为PDF

4

顺序合并

使用 PyPDF2.PdfMerger 按顺序 append 所有文件

5

保存输出

调用 merger.write() 保存合并后的PDF

核心代码逻辑:

for file in file_list:

    if 是图片: 转换为RGB → 存入BytesIO → merger.append(buffer)

    else: merger.append(pdf_file)

3.3 格式转换功能

格式转换模块包含四种转换功能,覆盖主流文档格式互转需求。

3.3.1 PDF转图片

功能说明:

PDF的每一页转换为图片,支持选择页面范围和图片格式。

支持的图片格式:

JPG: 适合照片类内容

PNG: 适合需要透明背景或无损质量

BMP: 适合需要原始位图数据

支持的分辨率:

72 DPI: 低质量,文件小

150 DPI: 中等质量(默认)

200 DPI: 高质量

300 DPI: 超清,适合打印

实现步骤:

1

打开PDF

使用 PyMuPDF (fitz) 打开PDF文件

2

解析页码

如果用户指定范围,解析页码;否则处理全部页面

3

计算矩阵

根据 DPI 计算缩放矩阵: matrix = fitz.Matrix(dpi/72, dpi/72)

4

逐页渲染

page.get_pixmap(matrix=matrix) 渲染页面为图片

5

保存图片

pix.save(output_path) 保存为指定格式

6

命名规则

原文件名_page1.jpg, 原文件名_page2.jpg, ...

3.3.2 图片转PDF

功能说明:

将图片文件转换为PDF,每张图片生成一个PDF文件。

实现步骤:

1

过滤图片

从文件列表中筛选有效图片格式

2

RGBA处理

如果是 RGBA 模式,创建白色背景并合成

3

RGB转换

确保图片为 RGB 模式(PIL PDF需要RGB

4

保存PDF

img.save(pdf_path, 'PDF', resolution=150.0, quality=95)

5

命名规则

图片名.jpg → 图片名.pdf

3.3.3 PDFWord

功能说明:

PDF文档转换为可编辑的Word (DOCX) 格式。

依赖库:pdf2docx

⚠️ 注意需要安装 pdf2docx 库,否则此功能不可用。

实现步骤:

1

检查依赖

启动时检查 HAS_PDF2DOCX 标志

2

创建转换器

cv = DocxConverter(pdf_path)

3

执行转换

cv.convert(output_path)

4

关闭资源

cv.close()

3.3.4 PDFOFD

功能说明:

PDF转换为中国国标版式文档OFD格式 (GB/T 33190-2016),广泛用于电子发票、电子公文。

OFD格式特点:

中国自主制定的版式文档标准

基于XML的文档结构

本质是ZIP压缩包

每页为独立图片或矢量图形

实现步骤:

1

创建目录结构

创建临时目录,包含 Doc_0/Pages/ 和 Doc_0/Res/

2

渲染页面

将每页PDF渲染为PNG图片

3

写入XML

生成 OFD.xml, doc.xml, Document.xml, Content.xml, Page_X.xml, PublicRes.xml

4

打包OFD

使用 zipfile 将所有文件打包为 .ofd

OFD文件结构:

document.ofd (ZIP包)

├── OFD.xml        # 主入口文件

├── Doc_0/

│   ├── doc.xml     # 文档根信息

│   ├── Document.xml # 文档结构

│   ├── Content.xml  # 内容索引

│   ├── Pages/

│   │   └── Page_0.xml  # 页面定义

│   └── Res/

│       ├── page_0.png  # 页面图片

3.4 实用工具

3.4.1 PDF压缩

功能说明:

通过降低图片分辨率来压缩PDF文件大小。

压缩质量选项:

低质量 (72 DPI): 压缩比最高,文件最小

中等质量 (120 DPI): 平衡模式(推荐)

高质量 (150 DPI): 保持较好清晰度

实现步骤:

1

打开原文件

使用 PyMuPDF 打开PDF

2

创建新文档

创建空的输出文档

3

逐页处理

对每一页渲染为低DPI图片,再插入新页面

4

设置DPI

低质量=72DPI, 中等=120DPI, 高质量=150DPI

5

保存压缩

doc.save(output, garbage=4, deflate=True)

3.4.2 PDF旋转

功能说明:

PDF的每一页按指定角度旋转。

支持的角度:

90°: 顺时针旋转90

180°: 上下颠倒

270°: 逆时针旋转90度(等价于顺时针270°

实现步骤:

1

读取原文件

使用 PdfReader 读取原PDF

2

创建写入器

创建 PdfWriter 用于输出

3

旋转页面

对每一页调用 page.rotate(angle)

4

添加页面

writer.add_page(rotated_page)

5

保存文件

writer.write(output_file)

3.4.3 添加水印

功能说明:

PDF每一页的中央添加半透明文字水印。

水印特点:

半透明灰色文字(默认透明度30%

45度倾斜排列

居中显示

可自定义水印文字和字体大小

实现步骤:

1

打开PDF

使用 PyMuPDF 打开PDF

2

逐页处理

遍历每一页

3

计算位置

使用 fitz.Rect 计算文本框区域

4

插入文本

page.insert_textbox(rect, text, fontsize=size, color=gray, rotate=45)

5

保存文件

doc.save(output, garbage=4, deflate=True)

3.4.4 提取文本

功能说明:

PDF中的文本内容提取为TXT文本文件。

实现步骤:

1

打开PDF

使用 PyMuPDF 打开PDF

2

逐页提取

page.get_text() 提取每页文本

3

格式化输出

添加页码分隔标记: === 第 页 ===

4

保存TXT

使用 UTF-8 编码保存文本文件

输出格式示例:

=== 第 1 页 ===

这是第1页的文本内容...

=== 第 2 页 ===

3.4.5 PDF加密

功能说明:

PDF文件添加打开密码保护。

安全要求:

密码长度至少4

密码显示/隐藏切换

使用 PyPDF2 的 encrypt() 方法

实现步骤:

1

读取原文件

使用 PdfReader 读取原PDF

2

创建写入器

创建 PdfWriter

3

添加页面

将所有页面添加到 writer

4

加密处理

writer.encrypt(password)

5

保存文件

writer.write(output_file)

3.5 文件信息查看

功能说明:

查看PDF文件的详细信息,包括文件大小、页数、尺寸、元数据等。

显示的信息:

文件名

文件大小(MB和字节)

总页数

页面尺寸(宽度×高度)

是否加密

是否为有效PDF

元数据(作者、标题、主题、关键词等)

实现步骤:

1

打开PDF

使用 PyMuPDF 打开PDF

2

获取基本信息

doc.page_count, doc.is_encrypted, doc.is_pdf

3

读取元数据

doc.metadata 获取标准PDF元数据

4

获取首页尺寸

doc[0].rect 获取页面宽高

5

格式化显示

 QTextEdit 中展示所有信息

4. 架构设计与实现原理

4.1 线程模型

为了保证界面响应性,所有耗时操作都运行在独立的 QThread 子线程中。

线程架构:

┌──────────────────────────────────────────────────────────┐

│                      主线程 (UI)                          │

│  ┌──────────┐  ┌──────────┐  ┌──────────┐  ┌──────────┐ │

│  │MainWindow│  │ UI事件   │  │ 进度更新  │  │ 结果显示  │ │

│  └────┬─────┘  └──────────┘  └────▲─────┘  └──────────┘ │

└───────┼─────────────────────────────────┼─────────────────┘

│        pyqtSignal            ▲   │

┌───────┴─────────────────────────────────┼─────────────────┐

│                      工作线程                          │

│  ┌──────────────────────────────────────────────────────┐ │

│  │  XxxThread (继承 QThread)                           │ │

│  │  - progress_updated  信号 (进度更新)                 │ │

│  │  - x_finished      信号 (任务完成)                   │ │

│  │  - error_occurred  信号 (错误信息)                   │ │

│  │  - run()           方法 (执行任务)                   │ │

│  │  - cancel()        方法 (取消任务)                   │ │

│  └──────────────────────────────────────────────────────┘ │

4.2 信号机制

每个工作线程定义三个核心信号:

progress_updated: 进度更新信号,携带0-100的整数值

x_finished: 任务完成信号,携带结果数据

error_occurred: 错误发生信号,携带错误消息

4.3 文件操作流程

统一处理流程:

用户点击按钮

检查文件列表

选择输出目录

禁用按钮 + 启动线程

子线程执行任务→ emit信号

启用按钮 + 显示结果

5. 界面交互设计

5.1 布局结构

主界面采用以下布局层次:

┌──────────────────────────────────────────────────────┐

│              标题栏: PDF处理工具 · 国风版             │

├──────────────────────────────────────────────────────┤

│              文件列表区 (可拖拽添加)                  │

│  [+添加] [-移除] [↑上移] [↓下移] [清空] [打开目录]   │

├──────────────────────────────────────────────────────┤

│  [✂️ 拆分] [�� 合并] [�� 转换] [�� 工具] [�� 信息]   │

├──────────────────────────────────────────────────────┤

│              当前标签页的功能界面                     │

│              (带 QScrollArea 滚动)                    │

├──────────────────────────────────────────────────────┤

│  进度条: [████████████████████░░░░░░░░] 75% (75/100)  │

│  状态: ✅ 正在处理,请稍候...                           │

├──────────────────────────────────────────────────────┤

│              作者: CYY                                 │

5.2 交互特性

文件拖拽支持直接将文件拖入窗口

批量选择支持Ctrl/Shift多选文件

顺序调整上移/下移按钮调整合并顺序

实时进度进度条实时更新处理进度

取消功能所有线程支持取消操作

结果提示完成时询问是否打开输出目录

5.3 国风配色方案

配色名称

色值

用途

朱红

#C41E3A

主按钮背景、标题文字

金色

#D4AF37

次要按钮、边框装饰、标题栏

棕色

#8B4513

边框、状态栏、分组框标题

米白

#F5F0E6

窗口背景色

6. 总结

6.1 功能清单

本软件提供以下12项核心功能:

1. 按文件大小拆分 PDF

2. 按文件页数拆分 PDF

3. 按文件份数拆分 PDF

4. 按页码拆分/提取 PDF

5. 合并多个 PDF 或图片文件

6. PDF 转图片(支持多种格式和DPI

7. 图片转 PDF

8. PDF 转 Word (DOCX)

9. PDF 转 OFD (国标格式)

10. PDF 压缩

11. PDF 旋转

12. PDF 添加水印

13. PDF 提取文本

14. PDF 加密

15. PDF 文件信息查看

6.2 技术亮点

异步处理所有耗操作运行在子线程,界面流畅

智能拆分二分查找算法精确定位最佳拆分点

格式兼容支持多种图片格式自动转换

内存优化: BytesIO 内存转换避免临时文件

OFD支持完整实现中国国标版式文档格式

国风UI: 独特的中国传统美学界面设计

6.3 依赖说明

依赖库

用途说明

PyQt5

GUI界面框架

PyPDF2

PDF读写、合并、拆分、加密

PyMuPDF (fitz)

PDF渲染、图片转换、文本提取、水印

Pillow (PIL)

图片格式转换、处理

pdf2docx

PDFWord(可选依赖)

━━━━━━━━━━━━━━━━━━━━━━

文档结束

PDF处理工具 国风版 v2.0 | 作者: CYY