FreeP2W - Free PDF to Word Converter
简介
FreeP2W 是一款基于深度学习的 PDF 到 Word 转换工具,结合了最先进的文档布局分析和公式识别技术,能够高质量地将 PDF 文档转换为可编辑的 Word 文档。
核心优势
- 🎯 高精度识别: 使用 DocLayout-YOLO 进行精准的文档布局检测
- 🔬 公式识别: 集成 UniMERNet 实现数学公式的精确识别和转换
- 📊 表格保留: 完整保留原文档的表格结构和格式
- 🖼️ 图片处理: 智能提取和定位文档中的图片
- ⚡ 一键转换: 简单的命令行界面,无需复杂配置
- 🔄 自动下载: 首次运行自动下载所需模型文件
功能特性
✨ 主要功能
- 文本提取: 高质量的文本内容提取,保留原有格式
- 公式转换: 将 PDF 中的数学公式转换为可编辑的 MathML 格式
- 图片定位: 精确识别和提取文档中的图片
- 表格识别: 保留表格结构和单元格内容
- 布局还原: 尽可能还原原文档的版面布局
🚀 技术栈
- DocLayout-YOLO: 文档元素检测(图片、公式、表格等)
- UniMERNet: 数学公式识别和转换
- pdf2docx: PDF 到 DOCX 的基础转换
- PyMuPDF (fitz): PDF 文档解析
快速开始
系统要求
- Python 3.8 或更高版本
- Windows / Linux / macOS
- 至少 4GB 可用磁盘空间(用于存储模型文件)
- 推荐使用 GPU(可选,CPU 也可运行)
安装
方式 1: 从 PyPI 安装(推荐)
pip install freep2w
方式 2: 从源码安装
# 克隆仓库
git clone https://github.com/zstar1003/FreeP2W.git
cd FreeP2W
# 安装依赖
pip install -e .
首次运行
首次运行时,FreeP2W 会自动下载所需的模型文件:
- YOLO 模型 (~39 MB): 文档布局检测模型
- UniMERNet 模型 (~1.6 GB): 数学公式识别模型
模型文件会被下载到用户目录:
- Windows:
C:\Users\<用户名>\.freep2w\weights\ - Linux/Mac:
~/.freep2w/weights/
使用方法
命令行界面
基本用法
# 转换 PDF 文件(输出文件名自动生成)
freep2w input.pdf
# 指定输出文件名
freep2w input.pdf -o output.docx
# 完整路径示例
freep2w /path/to/input.pdf -o /path/to/output.docx
命令行参数
freep2w [-h] [-o OUTPUT] [-v] input
位置参数:
input 输入 PDF 文件路径
可选参数:
-h, --help 显示帮助信息
-o OUTPUT, --output OUTPUT
输出 DOCX 文件路径(可选)
-v, --version 显示版本号
Python API
from freep2w.cli import convert_pdf_to_docx
# 转换 PDF 文件
success = convert_pdf_to_docx(
pdf_path='input.pdf',
output_path='output.docx'
)
if success:
print("转换成功!")
else:
print("转换失败!")
使用示例
示例: 转换学术论文
freep2w research_paper.pdf -o paper_converted.docx
技术架构
系统架构
┌─────────────────────────────────────────────────────────────┐
│ FreeP2W CLI │
└─────────────────┬───────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ HybridConverter │
├─────────────────┬───────────────┬───────────────────────────┤
│ │ │ │
│ DocLayout │ UniMERNet │ pdf2docx │
│ YOLO │ Formula │ Text/Table │
│ (Layout Det.) │ (Formula) │ (Extraction) │
└─────────────────┴───────────────┴───────────────────────────┘
工作流程
- 文档分析: 使用 DocLayout-YOLO 检测 PDF 中的布局元素(文本、图片、公式、表格)
- 公式识别: 对检测到的公式区域使用 UniMERNet 进行识别并转换为 MathML
- 内容提取: 使用 pdf2docx 提取文本、表格等内容
- 文档合成: 将所有识别结果合并生成最终的 DOCX 文件
模型说明
DocLayout-YOLO
- 功能: 文档布局元素检测
- 大小: 39 MB
- 来源: DocLayout-YOLO
- 检测类别: 图片、公式、表格、标题、段落等
UniMERNet
- 功能: 数学公式识别
- 大小: ~1.6 GB
- 来源: UniMERNet
- 输出格式: MathML / LaTeX
配置说明
模型路径配置
FreeP2W 会自动管理模型文件,但您也可以手动配置:
用户目录结构:
~/.freep2w/
└── weights/
├── doclayout_yolo_docstructbench_imgsz1024.pt # YOLO 模型
├── demo.yaml # 配置文件
└── unimernet_small/ # UniMERNet 模型
├── config.json
├── preprocessor_config.json
├── tokenizer.json
├── tokenizer_config.json
└── unimernet_small.pth
手动下载模型
如果自动下载失败,可以手动下载模型文件:
-
YOLO 模型:
https://github.com/zstar1003/FreeP2W/releases/download/v0.0.1/doclayout_yolo_docstructbench_imgsz1024.pt放置到:
~/.freep2w/weights/doclayout_yolo_docstructbench_imgsz1024.pt -
UniMERNet 模型:
https://github.com/zstar1003/FreeP2W/releases/download/v0.0.1/unimernet_small.zip解压到:
~/.freep2w/weights/unimernet_small/
常见问题
Q1: 首次运行时下载很慢怎么办?
A: UniMERNet 模型文件较大(~1.6GB),下载时间取决于网络速度。建议:
- 使用稳定的网络连接
- 或者手动下载模型文件(见手动下载模型)
Q2: 转换失败提示找不到模型?
A: 检查以下几点:
# 检查模型目录是否存在
ls ~/.freep2w/weights/
# 重新下载模型
python -m freep2w.model_downloader
Q3: 如何提高转换质量?
A:
- 确保 PDF 质量较高(非扫描版)
- 对于扫描版 PDF,建议先进行 OCR 处理
- 复杂公式可能需要手动调整
Q4: 支持批量转换吗?
A: 支持。参见示例 2: 批量转换
Q6: 转换后的格式有问题?
A:
- PDF 到 Word 的转换是一个复杂过程,完美还原较困难
- 转换后建议手动检查和调整格式
- 对于重要文档,建议对比原文进行校对
开发说明
项目结构
FreeP2W/
├── freep2w/ # 主包
│ ├── __init__.py # 包初始化
│ ├── cli.py # 命令行接口
│ ├── hybrid_converter.py # 混合转换器
│ ├── model_downloader.py # 模型下载器
│ └── demo.yaml # 配置模板
├── doclayout_yolo/ # YOLO 模块(本地)
├── pdf2docx/ # PDF2DOCX 模块(本地)
├── unimernet/ # UniMERNet 模块(本地)
├── setup.py # 安装配置
├── pyproject.toml # 项目配置
├── requirements.txt # 依赖列表
└── README.md # 本文件
从源码运行
# 克隆仓库
git clone https://github.com/zstar1003/FreeP2W.git
cd FreeP2W
# 安装开发模式
pip install -e .
# 运行测试
freep2w test.pdf -o output.docx
运行测试
# 测试模型下载
python -m freep2w.model_downloader
# 测试转换功能
freep2w test_files/sample.pdf -o test_output.docx
性能指标
转换速度
| PDF 页数 | CPU (Intel i7) | GPU (NVIDIA RTX 3060) |
|---|---|---|
| 1-10 页 | ~30-60 秒 | ~10-20 秒 |
| 10-50 页 | ~2-5 分钟 | ~30-90 秒 |
| 50-100 页 | ~5-15 分钟 | ~2-5 分钟 |
注: 实际速度取决于文档复杂度和硬件配置
识别准确率
- 文本识别: >95%(非扫描版 PDF)
- 公式识别: ~90%(简单公式),~75%(复杂公式)
- 表格识别: ~85%(结构简单),~70%(结构复杂)
- 布局还原: ~80%
路线图
当前版本 (v1.0.0)
- ✅ 基础 PDF 到 Word 转换
- ✅ 公式识别和转换
- ✅ 图片提取和定位
- ✅ 表格识别
- ✅ 自动模型下载
计划功能
- GUI 图形界面
- 批量转换工具
- 云端 API 服务
- 更多格式支持(PDF → Markdown, HTML 等)
- OCR 支持(扫描版 PDF)
- 自定义模型训练
贡献指南
欢迎贡献代码、报告问题或提出建议!
如何贡献
- Fork 本仓库
- 创建特性分支 (
git checkout -b feature/AmazingFeature) - 提交更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 开启 Pull Request
报告问题
请在 GitHub Issues 提交问题报告。
提交前请确认:
- 搜索是否有相同的问题已被报告
- 提供详细的错误信息和复现步骤
- 附上系统环境信息(操作系统、Python 版本等)
致谢
本项目使用了以下开源项目:
- DocLayout-YOLO - 文档布局检测
- UniMERNet - 数学公式识别
- pdf2docx - PDF 到 DOCX 转换
- PyMuPDF - PDF 文档处理
感谢这些优秀的开源项目!
许可证
本项目采用 MIT 许可证 - 详见 LICENSE 文件。
Metadata
Release files for freep2w 1.0.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| freep2w-1.0.3.tar.gz | 655.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| freep2w-1.0.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 1.5 MB
Release files / freep2w-1.0.3.tar.gz
| Download URL | freep2w-1.0.3.tar.gz |
|---|---|
| Size | 655.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
a89b43bf1dc6c6eeb685f4bacb7942064d3b9ae92a9bf8ffd9669d49f36c4468
|
|
BLAKE2b-256 checksum How to use checksums |
f681ee47d447082696568ba310c251860dafcef2b22cfa1da13939b155e2f3b5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.10.18
|
Release files / freep2w-1.0.3-py3-none-any.whl
| Download URL | freep2w-1.0.3-py3-none-any.whl |
|---|---|
| Size | 815.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
be282c94374f5b08ad60444369a4c06b763e27e77e385222dea2b75dd58340a3
|
|
BLAKE2b-256 checksum How to use checksums |
a51ea971d0664a53f0ef079584ef40c5538aa5849f8a33c0ff1f0af8ffb0a797
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.10.18
|