# FreeP2W - Free PDF to Word Converter
<div align="center">
📄 一个基于深度学习的高质量 PDF 转 Word 工具
[](https://www.python.org/downloads/)
[](https://pypi.org/project/freep2w/)
[](LICENSE)
[功能特性](#功能特性) •
[快速开始](#快速开始) •
[使用方法](#使用方法) •
[技术架构](#技术架构) •
[常见问题](#常见问题)
</div>
---
## 简介
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 安装(推荐)
```bash
pip install freep2w
```
#### 方式 2: 从源码安装
```bash
# 克隆仓库
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/`
---
## 使用方法
### 命令行界面
#### 基本用法
```bash
# 转换 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
```python
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("转换失败!")
```
### 使用示例
#### 示例: 转换学术论文
```bash
freep2w research_paper.pdf -o paper_converted.docx
```
## 技术架构
### 系统架构
```
┌─────────────────────────────────────────────────────────────┐
│ FreeP2W CLI │
└─────────────────┬───────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ HybridConverter │
├─────────────────┬───────────────┬───────────────────────────┤
│ │ │ │
│ DocLayout │ UniMERNet │ pdf2docx │
│ YOLO │ Formula │ Text/Table │
│ (Layout Det.) │ (Formula) │ (Extraction) │
└─────────────────┴───────────────┴───────────────────────────┘
```
### 工作流程
1. **文档分析**: 使用 DocLayout-YOLO 检测 PDF 中的布局元素(文本、图片、公式、表格)
2. **公式识别**: 对检测到的公式区域使用 UniMERNet 进行识别并转换为 MathML
3. **内容提取**: 使用 pdf2docx 提取文本、表格等内容
4. **文档合成**: 将所有识别结果合并生成最终的 DOCX 文件
### 模型说明
#### DocLayout-YOLO
- **功能**: 文档布局元素检测
- **大小**: 39 MB
- **来源**: [DocLayout-YOLO](https://github.com/opendatalab/DocLayout-YOLO)
- **检测类别**: 图片、公式、表格、标题、段落等
#### UniMERNet
- **功能**: 数学公式识别
- **大小**: ~1.6 GB
- **来源**: [UniMERNet](https://github.com/opendatalab/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
```
### 手动下载模型
如果自动下载失败,可以手动下载模型文件:
1. **YOLO 模型**:
```
https://github.com/zstar1003/FreeP2W/releases/download/v0.0.1/doclayout_yolo_docstructbench_imgsz1024.pt
```
放置到: `~/.freep2w/weights/doclayout_yolo_docstructbench_imgsz1024.pt`
2. **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**: 检查以下几点:
```bash
# 检查模型目录是否存在
ls ~/.freep2w/weights/
# 重新下载模型
python -m freep2w.model_downloader
```
### Q3: 如何提高转换质量?
**A**:
- 确保 PDF 质量较高(非扫描版)
- 对于扫描版 PDF,建议先进行 OCR 处理
- 复杂公式可能需要手动调整
### Q4: 支持批量转换吗?
**A**: 支持。参见[示例 2: 批量转换](#示例-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 # 本文件
```
### 从源码运行
```bash
# 克隆仓库
git clone https://github.com/zstar1003/FreeP2W.git
cd FreeP2W
# 安装开发模式
pip install -e .
# 运行测试
freep2w test.pdf -o output.docx
```
### 运行测试
```bash
# 测试模型下载
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)
- [ ] 自定义模型训练
---
## 贡献指南
欢迎贡献代码、报告问题或提出建议!
### 如何贡献
1. Fork 本仓库
2. 创建特性分支 (`git checkout -b feature/AmazingFeature`)
3. 提交更改 (`git commit -m 'Add some AmazingFeature'`)
4. 推送到分支 (`git push origin feature/AmazingFeature`)
5. 开启 Pull Request
### 报告问题
请在 [GitHub Issues](https://github.com/zstar1003/FreeP2W/issues) 提交问题报告。
提交前请确认:
- 搜索是否有相同的问题已被报告
- 提供详细的错误信息和复现步骤
- 附上系统环境信息(操作系统、Python 版本等)
---
## 致谢
本项目使用了以下开源项目:
- [DocLayout-YOLO](https://github.com/opendatalab/DocLayout-YOLO) - 文档布局检测
- [UniMERNet](https://github.com/opendatalab/UniMERNet) - 数学公式识别
- [pdf2docx](https://github.com/dothinking/pdf2docx) - PDF 到 DOCX 转换
- [PyMuPDF](https://github.com/pymupdf/PyMuPDF) - PDF 文档处理
感谢这些优秀的开源项目!
---
## 许可证
本项目采用 MIT 许可证 - 详见 [LICENSE](LICENSE) 文件。
Raw data
{
"_id": null,
"home_page": "https://github.com/zstar1003/FreeP2W",
"name": "freep2w",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": null,
"keywords": "pdf, docx, converter, formula, recognition, yolo, unimernet",
"author": "zstar",
"author_email": "zstar <zstar1003@163.com>",
"download_url": "https://files.pythonhosted.org/packages/f6/81/ee47d447082696568ba310c251860dafcef2b22cfa1da13939b155e2f3b5/freep2w-1.0.3.tar.gz",
"platform": null,
"description": "# FreeP2W - Free PDF to Word Converter\r\n\r\n<div align=\"center\">\r\n\r\n\ud83d\udcc4 \u4e00\u4e2a\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684\u9ad8\u8d28\u91cf PDF \u8f6c Word \u5de5\u5177\r\n\r\n[](https://www.python.org/downloads/)\r\n[](https://pypi.org/project/freep2w/)\r\n[](LICENSE)\r\n\r\n[\u529f\u80fd\u7279\u6027](#\u529f\u80fd\u7279\u6027) \u2022\r\n[\u5feb\u901f\u5f00\u59cb](#\u5feb\u901f\u5f00\u59cb) \u2022\r\n[\u4f7f\u7528\u65b9\u6cd5](#\u4f7f\u7528\u65b9\u6cd5) \u2022\r\n[\u6280\u672f\u67b6\u6784](#\u6280\u672f\u67b6\u6784) \u2022\r\n[\u5e38\u89c1\u95ee\u9898](#\u5e38\u89c1\u95ee\u9898)\r\n\r\n</div>\r\n\r\n---\r\n\r\n## \u7b80\u4ecb\r\n\r\nFreeP2W \u662f\u4e00\u6b3e\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 PDF \u5230 Word \u8f6c\u6362\u5de5\u5177\uff0c\u7ed3\u5408\u4e86\u6700\u5148\u8fdb\u7684\u6587\u6863\u5e03\u5c40\u5206\u6790\u548c\u516c\u5f0f\u8bc6\u522b\u6280\u672f\uff0c\u80fd\u591f\u9ad8\u8d28\u91cf\u5730\u5c06 PDF \u6587\u6863\u8f6c\u6362\u4e3a\u53ef\u7f16\u8f91\u7684 Word \u6587\u6863\u3002\r\n\r\n### \u6838\u5fc3\u4f18\u52bf\r\n\r\n- \ud83c\udfaf **\u9ad8\u7cbe\u5ea6\u8bc6\u522b**: \u4f7f\u7528 DocLayout-YOLO \u8fdb\u884c\u7cbe\u51c6\u7684\u6587\u6863\u5e03\u5c40\u68c0\u6d4b\r\n- \ud83d\udd2c **\u516c\u5f0f\u8bc6\u522b**: \u96c6\u6210 UniMERNet \u5b9e\u73b0\u6570\u5b66\u516c\u5f0f\u7684\u7cbe\u786e\u8bc6\u522b\u548c\u8f6c\u6362\r\n- \ud83d\udcca **\u8868\u683c\u4fdd\u7559**: \u5b8c\u6574\u4fdd\u7559\u539f\u6587\u6863\u7684\u8868\u683c\u7ed3\u6784\u548c\u683c\u5f0f\r\n- \ud83d\uddbc\ufe0f **\u56fe\u7247\u5904\u7406**: \u667a\u80fd\u63d0\u53d6\u548c\u5b9a\u4f4d\u6587\u6863\u4e2d\u7684\u56fe\u7247\r\n- \u26a1 **\u4e00\u952e\u8f6c\u6362**: \u7b80\u5355\u7684\u547d\u4ee4\u884c\u754c\u9762\uff0c\u65e0\u9700\u590d\u6742\u914d\u7f6e\r\n- \ud83d\udd04 **\u81ea\u52a8\u4e0b\u8f7d**: \u9996\u6b21\u8fd0\u884c\u81ea\u52a8\u4e0b\u8f7d\u6240\u9700\u6a21\u578b\u6587\u4ef6\r\n\r\n---\r\n\r\n## \u529f\u80fd\u7279\u6027\r\n\r\n### \u2728 \u4e3b\u8981\u529f\u80fd\r\n\r\n- **\u6587\u672c\u63d0\u53d6**: \u9ad8\u8d28\u91cf\u7684\u6587\u672c\u5185\u5bb9\u63d0\u53d6\uff0c\u4fdd\u7559\u539f\u6709\u683c\u5f0f\r\n- **\u516c\u5f0f\u8f6c\u6362**: \u5c06 PDF \u4e2d\u7684\u6570\u5b66\u516c\u5f0f\u8f6c\u6362\u4e3a\u53ef\u7f16\u8f91\u7684 MathML \u683c\u5f0f\r\n- **\u56fe\u7247\u5b9a\u4f4d**: \u7cbe\u786e\u8bc6\u522b\u548c\u63d0\u53d6\u6587\u6863\u4e2d\u7684\u56fe\u7247\r\n- **\u8868\u683c\u8bc6\u522b**: \u4fdd\u7559\u8868\u683c\u7ed3\u6784\u548c\u5355\u5143\u683c\u5185\u5bb9\r\n- **\u5e03\u5c40\u8fd8\u539f**: \u5c3d\u53ef\u80fd\u8fd8\u539f\u539f\u6587\u6863\u7684\u7248\u9762\u5e03\u5c40\r\n\r\n### \ud83d\ude80 \u6280\u672f\u6808\r\n\r\n- **DocLayout-YOLO**: \u6587\u6863\u5143\u7d20\u68c0\u6d4b\uff08\u56fe\u7247\u3001\u516c\u5f0f\u3001\u8868\u683c\u7b49\uff09\r\n- **UniMERNet**: \u6570\u5b66\u516c\u5f0f\u8bc6\u522b\u548c\u8f6c\u6362\r\n- **pdf2docx**: PDF \u5230 DOCX \u7684\u57fa\u7840\u8f6c\u6362\r\n- **PyMuPDF (fitz)**: PDF \u6587\u6863\u89e3\u6790\r\n\r\n---\r\n\r\n## \u5feb\u901f\u5f00\u59cb\r\n\r\n### \u7cfb\u7edf\u8981\u6c42\r\n\r\n- Python 3.8 \u6216\u66f4\u9ad8\u7248\u672c\r\n- Windows / Linux / macOS\r\n- \u81f3\u5c11 4GB \u53ef\u7528\u78c1\u76d8\u7a7a\u95f4\uff08\u7528\u4e8e\u5b58\u50a8\u6a21\u578b\u6587\u4ef6\uff09\r\n- \u63a8\u8350\u4f7f\u7528 GPU\uff08\u53ef\u9009\uff0cCPU \u4e5f\u53ef\u8fd0\u884c\uff09\r\n\r\n### \u5b89\u88c5\r\n\r\n#### \u65b9\u5f0f 1: \u4ece PyPI \u5b89\u88c5\uff08\u63a8\u8350\uff09\r\n\r\n```bash\r\npip install freep2w\r\n```\r\n\r\n#### \u65b9\u5f0f 2: \u4ece\u6e90\u7801\u5b89\u88c5\r\n\r\n```bash\r\n# \u514b\u9686\u4ed3\u5e93\r\ngit clone https://github.com/zstar1003/FreeP2W.git\r\ncd FreeP2W\r\n\r\n# \u5b89\u88c5\u4f9d\u8d56\r\npip install -e .\r\n```\r\n\r\n### \u9996\u6b21\u8fd0\u884c\r\n\r\n\u9996\u6b21\u8fd0\u884c\u65f6\uff0cFreeP2W \u4f1a\u81ea\u52a8\u4e0b\u8f7d\u6240\u9700\u7684\u6a21\u578b\u6587\u4ef6\uff1a\r\n\r\n- **YOLO \u6a21\u578b** (~39 MB): \u6587\u6863\u5e03\u5c40\u68c0\u6d4b\u6a21\u578b\r\n- **UniMERNet \u6a21\u578b** (~1.6 GB): \u6570\u5b66\u516c\u5f0f\u8bc6\u522b\u6a21\u578b\r\n\r\n\u6a21\u578b\u6587\u4ef6\u4f1a\u88ab\u4e0b\u8f7d\u5230\u7528\u6237\u76ee\u5f55\uff1a\r\n- Windows: `C:\\Users\\<\u7528\u6237\u540d>\\.freep2w\\weights\\`\r\n- Linux/Mac: `~/.freep2w/weights/`\r\n\r\n---\r\n\r\n## \u4f7f\u7528\u65b9\u6cd5\r\n\r\n### \u547d\u4ee4\u884c\u754c\u9762\r\n\r\n#### \u57fa\u672c\u7528\u6cd5\r\n\r\n```bash\r\n# \u8f6c\u6362 PDF \u6587\u4ef6\uff08\u8f93\u51fa\u6587\u4ef6\u540d\u81ea\u52a8\u751f\u6210\uff09\r\nfreep2w input.pdf\r\n\r\n# \u6307\u5b9a\u8f93\u51fa\u6587\u4ef6\u540d\r\nfreep2w input.pdf -o output.docx\r\n\r\n# \u5b8c\u6574\u8def\u5f84\u793a\u4f8b\r\nfreep2w /path/to/input.pdf -o /path/to/output.docx\r\n```\r\n\r\n#### \u547d\u4ee4\u884c\u53c2\u6570\r\n\r\n```\r\nfreep2w [-h] [-o OUTPUT] [-v] input\r\n\r\n\u4f4d\u7f6e\u53c2\u6570:\r\n input \u8f93\u5165 PDF \u6587\u4ef6\u8def\u5f84\r\n\r\n\u53ef\u9009\u53c2\u6570:\r\n -h, --help \u663e\u793a\u5e2e\u52a9\u4fe1\u606f\r\n -o OUTPUT, --output OUTPUT\r\n \u8f93\u51fa DOCX \u6587\u4ef6\u8def\u5f84\uff08\u53ef\u9009\uff09\r\n -v, --version \u663e\u793a\u7248\u672c\u53f7\r\n```\r\n\r\n### Python API\r\n\r\n```python\r\nfrom freep2w.cli import convert_pdf_to_docx\r\n\r\n# \u8f6c\u6362 PDF \u6587\u4ef6\r\nsuccess = convert_pdf_to_docx(\r\n pdf_path='input.pdf',\r\n output_path='output.docx'\r\n)\r\n\r\nif success:\r\n print(\"\u8f6c\u6362\u6210\u529f\uff01\")\r\nelse:\r\n print(\"\u8f6c\u6362\u5931\u8d25\uff01\")\r\n```\r\n\r\n### \u4f7f\u7528\u793a\u4f8b\r\n\r\n#### \u793a\u4f8b: \u8f6c\u6362\u5b66\u672f\u8bba\u6587\r\n\r\n```bash\r\nfreep2w research_paper.pdf -o paper_converted.docx\r\n```\r\n\r\n## \u6280\u672f\u67b6\u6784\r\n\r\n### \u7cfb\u7edf\u67b6\u6784\r\n\r\n```\r\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\r\n\u2502 FreeP2W CLI \u2502\r\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\r\n \u2502\r\n \u25bc\r\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\r\n\u2502 HybridConverter \u2502\r\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\r\n\u2502 \u2502 \u2502 \u2502\r\n\u2502 DocLayout \u2502 UniMERNet \u2502 pdf2docx \u2502\r\n\u2502 YOLO \u2502 Formula \u2502 Text/Table \u2502\r\n\u2502 (Layout Det.) \u2502 (Formula) \u2502 (Extraction) \u2502\r\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\r\n```\r\n\r\n### \u5de5\u4f5c\u6d41\u7a0b\r\n\r\n1. **\u6587\u6863\u5206\u6790**: \u4f7f\u7528 DocLayout-YOLO \u68c0\u6d4b PDF \u4e2d\u7684\u5e03\u5c40\u5143\u7d20\uff08\u6587\u672c\u3001\u56fe\u7247\u3001\u516c\u5f0f\u3001\u8868\u683c\uff09\r\n2. **\u516c\u5f0f\u8bc6\u522b**: \u5bf9\u68c0\u6d4b\u5230\u7684\u516c\u5f0f\u533a\u57df\u4f7f\u7528 UniMERNet \u8fdb\u884c\u8bc6\u522b\u5e76\u8f6c\u6362\u4e3a MathML\r\n3. **\u5185\u5bb9\u63d0\u53d6**: \u4f7f\u7528 pdf2docx \u63d0\u53d6\u6587\u672c\u3001\u8868\u683c\u7b49\u5185\u5bb9\r\n4. **\u6587\u6863\u5408\u6210**: \u5c06\u6240\u6709\u8bc6\u522b\u7ed3\u679c\u5408\u5e76\u751f\u6210\u6700\u7ec8\u7684 DOCX \u6587\u4ef6\r\n\r\n### \u6a21\u578b\u8bf4\u660e\r\n\r\n#### DocLayout-YOLO\r\n\r\n- **\u529f\u80fd**: \u6587\u6863\u5e03\u5c40\u5143\u7d20\u68c0\u6d4b\r\n- **\u5927\u5c0f**: 39 MB\r\n- **\u6765\u6e90**: [DocLayout-YOLO](https://github.com/opendatalab/DocLayout-YOLO)\r\n- **\u68c0\u6d4b\u7c7b\u522b**: \u56fe\u7247\u3001\u516c\u5f0f\u3001\u8868\u683c\u3001\u6807\u9898\u3001\u6bb5\u843d\u7b49\r\n\r\n#### UniMERNet\r\n\r\n- **\u529f\u80fd**: \u6570\u5b66\u516c\u5f0f\u8bc6\u522b\r\n- **\u5927\u5c0f**: ~1.6 GB\r\n- **\u6765\u6e90**: [UniMERNet](https://github.com/opendatalab/UniMERNet)\r\n- **\u8f93\u51fa\u683c\u5f0f**: MathML / LaTeX\r\n\r\n---\r\n\r\n## \u914d\u7f6e\u8bf4\u660e\r\n\r\n### \u6a21\u578b\u8def\u5f84\u914d\u7f6e\r\n\r\nFreeP2W \u4f1a\u81ea\u52a8\u7ba1\u7406\u6a21\u578b\u6587\u4ef6\uff0c\u4f46\u60a8\u4e5f\u53ef\u4ee5\u624b\u52a8\u914d\u7f6e\uff1a\r\n\r\n**\u7528\u6237\u76ee\u5f55\u7ed3\u6784**:\r\n```\r\n~/.freep2w/\r\n\u2514\u2500\u2500 weights/\r\n \u251c\u2500\u2500 doclayout_yolo_docstructbench_imgsz1024.pt # YOLO \u6a21\u578b\r\n \u251c\u2500\u2500 demo.yaml # \u914d\u7f6e\u6587\u4ef6\r\n \u2514\u2500\u2500 unimernet_small/ # UniMERNet \u6a21\u578b\r\n \u251c\u2500\u2500 config.json\r\n \u251c\u2500\u2500 preprocessor_config.json\r\n \u251c\u2500\u2500 tokenizer.json\r\n \u251c\u2500\u2500 tokenizer_config.json\r\n \u2514\u2500\u2500 unimernet_small.pth\r\n```\r\n\r\n### \u624b\u52a8\u4e0b\u8f7d\u6a21\u578b\r\n\r\n\u5982\u679c\u81ea\u52a8\u4e0b\u8f7d\u5931\u8d25\uff0c\u53ef\u4ee5\u624b\u52a8\u4e0b\u8f7d\u6a21\u578b\u6587\u4ef6\uff1a\r\n\r\n1. **YOLO \u6a21\u578b**:\r\n ```\r\n https://github.com/zstar1003/FreeP2W/releases/download/v0.0.1/doclayout_yolo_docstructbench_imgsz1024.pt\r\n ```\r\n \u653e\u7f6e\u5230: `~/.freep2w/weights/doclayout_yolo_docstructbench_imgsz1024.pt`\r\n\r\n2. **UniMERNet \u6a21\u578b**:\r\n ```\r\n https://github.com/zstar1003/FreeP2W/releases/download/v0.0.1/unimernet_small.zip\r\n ```\r\n \u89e3\u538b\u5230: `~/.freep2w/weights/unimernet_small/`\r\n\r\n---\r\n\r\n## \u5e38\u89c1\u95ee\u9898\r\n\r\n### Q1: \u9996\u6b21\u8fd0\u884c\u65f6\u4e0b\u8f7d\u5f88\u6162\u600e\u4e48\u529e\uff1f\r\n\r\n**A**: UniMERNet \u6a21\u578b\u6587\u4ef6\u8f83\u5927\uff08~1.6GB\uff09\uff0c\u4e0b\u8f7d\u65f6\u95f4\u53d6\u51b3\u4e8e\u7f51\u7edc\u901f\u5ea6\u3002\u5efa\u8bae\uff1a\r\n- \u4f7f\u7528\u7a33\u5b9a\u7684\u7f51\u7edc\u8fde\u63a5\r\n- \u6216\u8005\u624b\u52a8\u4e0b\u8f7d\u6a21\u578b\u6587\u4ef6\uff08\u89c1[\u624b\u52a8\u4e0b\u8f7d\u6a21\u578b](#\u624b\u52a8\u4e0b\u8f7d\u6a21\u578b)\uff09\r\n\r\n### Q2: \u8f6c\u6362\u5931\u8d25\u63d0\u793a\u627e\u4e0d\u5230\u6a21\u578b\uff1f\r\n\r\n**A**: \u68c0\u67e5\u4ee5\u4e0b\u51e0\u70b9\uff1a\r\n```bash\r\n# \u68c0\u67e5\u6a21\u578b\u76ee\u5f55\u662f\u5426\u5b58\u5728\r\nls ~/.freep2w/weights/\r\n\r\n# \u91cd\u65b0\u4e0b\u8f7d\u6a21\u578b\r\npython -m freep2w.model_downloader\r\n```\r\n\r\n### Q3: \u5982\u4f55\u63d0\u9ad8\u8f6c\u6362\u8d28\u91cf\uff1f\r\n\r\n**A**:\r\n- \u786e\u4fdd PDF \u8d28\u91cf\u8f83\u9ad8\uff08\u975e\u626b\u63cf\u7248\uff09\r\n- \u5bf9\u4e8e\u626b\u63cf\u7248 PDF\uff0c\u5efa\u8bae\u5148\u8fdb\u884c OCR \u5904\u7406\r\n- \u590d\u6742\u516c\u5f0f\u53ef\u80fd\u9700\u8981\u624b\u52a8\u8c03\u6574\r\n\r\n### Q4: \u652f\u6301\u6279\u91cf\u8f6c\u6362\u5417\uff1f\r\n\r\n**A**: \u652f\u6301\u3002\u53c2\u89c1[\u793a\u4f8b 2: \u6279\u91cf\u8f6c\u6362](#\u793a\u4f8b-2-\u6279\u91cf\u8f6c\u6362)\r\n\r\n- \r\n\r\n### Q6: \u8f6c\u6362\u540e\u7684\u683c\u5f0f\u6709\u95ee\u9898\uff1f\r\n\r\n**A**:\r\n- PDF \u5230 Word \u7684\u8f6c\u6362\u662f\u4e00\u4e2a\u590d\u6742\u8fc7\u7a0b\uff0c\u5b8c\u7f8e\u8fd8\u539f\u8f83\u56f0\u96be\r\n- \u8f6c\u6362\u540e\u5efa\u8bae\u624b\u52a8\u68c0\u67e5\u548c\u8c03\u6574\u683c\u5f0f\r\n- \u5bf9\u4e8e\u91cd\u8981\u6587\u6863\uff0c\u5efa\u8bae\u5bf9\u6bd4\u539f\u6587\u8fdb\u884c\u6821\u5bf9\r\n\r\n---\r\n\r\n## \u5f00\u53d1\u8bf4\u660e\r\n\r\n### \u9879\u76ee\u7ed3\u6784\r\n\r\n```\r\nFreeP2W/\r\n\u251c\u2500\u2500 freep2w/ # \u4e3b\u5305\r\n\u2502 \u251c\u2500\u2500 __init__.py # \u5305\u521d\u59cb\u5316\r\n\u2502 \u251c\u2500\u2500 cli.py # \u547d\u4ee4\u884c\u63a5\u53e3\r\n\u2502 \u251c\u2500\u2500 hybrid_converter.py # \u6df7\u5408\u8f6c\u6362\u5668\r\n\u2502 \u251c\u2500\u2500 model_downloader.py # \u6a21\u578b\u4e0b\u8f7d\u5668\r\n\u2502 \u2514\u2500\u2500 demo.yaml # \u914d\u7f6e\u6a21\u677f\r\n\u251c\u2500\u2500 doclayout_yolo/ # YOLO \u6a21\u5757\uff08\u672c\u5730\uff09\r\n\u251c\u2500\u2500 pdf2docx/ # PDF2DOCX \u6a21\u5757\uff08\u672c\u5730\uff09\r\n\u251c\u2500\u2500 unimernet/ # UniMERNet \u6a21\u5757\uff08\u672c\u5730\uff09\r\n\u251c\u2500\u2500 setup.py # \u5b89\u88c5\u914d\u7f6e\r\n\u251c\u2500\u2500 pyproject.toml # \u9879\u76ee\u914d\u7f6e\r\n\u251c\u2500\u2500 requirements.txt # \u4f9d\u8d56\u5217\u8868\r\n\u2514\u2500\u2500 README.md # \u672c\u6587\u4ef6\r\n```\r\n\r\n### \u4ece\u6e90\u7801\u8fd0\u884c\r\n\r\n```bash\r\n# \u514b\u9686\u4ed3\u5e93\r\ngit clone https://github.com/zstar1003/FreeP2W.git\r\ncd FreeP2W\r\n\r\n# \u5b89\u88c5\u5f00\u53d1\u6a21\u5f0f\r\npip install -e .\r\n\r\n# \u8fd0\u884c\u6d4b\u8bd5\r\nfreep2w test.pdf -o output.docx\r\n```\r\n\r\n### \u8fd0\u884c\u6d4b\u8bd5\r\n\r\n```bash\r\n# \u6d4b\u8bd5\u6a21\u578b\u4e0b\u8f7d\r\npython -m freep2w.model_downloader\r\n\r\n# \u6d4b\u8bd5\u8f6c\u6362\u529f\u80fd\r\nfreep2w test_files/sample.pdf -o test_output.docx\r\n```\r\n\r\n---\r\n\r\n## \u6027\u80fd\u6307\u6807\r\n\r\n### \u8f6c\u6362\u901f\u5ea6\r\n\r\n| PDF \u9875\u6570 | CPU (Intel i7) | GPU (NVIDIA RTX 3060) |\r\n|---------|----------------|----------------------|\r\n| 1-10 \u9875 | ~30-60 \u79d2 | ~10-20 \u79d2 |\r\n| 10-50 \u9875 | ~2-5 \u5206\u949f | ~30-90 \u79d2 |\r\n| 50-100 \u9875| ~5-15 \u5206\u949f | ~2-5 \u5206\u949f |\r\n\r\n*\u6ce8: \u5b9e\u9645\u901f\u5ea6\u53d6\u51b3\u4e8e\u6587\u6863\u590d\u6742\u5ea6\u548c\u786c\u4ef6\u914d\u7f6e*\r\n\r\n### \u8bc6\u522b\u51c6\u786e\u7387\r\n\r\n- **\u6587\u672c\u8bc6\u522b**: >95%\uff08\u975e\u626b\u63cf\u7248 PDF\uff09\r\n- **\u516c\u5f0f\u8bc6\u522b**: ~90%\uff08\u7b80\u5355\u516c\u5f0f\uff09\uff0c~75%\uff08\u590d\u6742\u516c\u5f0f\uff09\r\n- **\u8868\u683c\u8bc6\u522b**: ~85%\uff08\u7ed3\u6784\u7b80\u5355\uff09\uff0c~70%\uff08\u7ed3\u6784\u590d\u6742\uff09\r\n- **\u5e03\u5c40\u8fd8\u539f**: ~80%\r\n\r\n---\r\n\r\n## \u8def\u7ebf\u56fe\r\n\r\n### \u5f53\u524d\u7248\u672c (v1.0.0)\r\n\r\n- \u2705 \u57fa\u7840 PDF \u5230 Word \u8f6c\u6362\r\n- \u2705 \u516c\u5f0f\u8bc6\u522b\u548c\u8f6c\u6362\r\n- \u2705 \u56fe\u7247\u63d0\u53d6\u548c\u5b9a\u4f4d\r\n- \u2705 \u8868\u683c\u8bc6\u522b\r\n- \u2705 \u81ea\u52a8\u6a21\u578b\u4e0b\u8f7d\r\n\r\n### \u8ba1\u5212\u529f\u80fd\r\n\r\n- [ ] GUI \u56fe\u5f62\u754c\u9762\r\n- [ ] \u6279\u91cf\u8f6c\u6362\u5de5\u5177\r\n- [ ] \u4e91\u7aef API \u670d\u52a1\r\n- [ ] \u66f4\u591a\u683c\u5f0f\u652f\u6301\uff08PDF \u2192 Markdown, HTML \u7b49\uff09\r\n- [ ] OCR \u652f\u6301\uff08\u626b\u63cf\u7248 PDF\uff09\r\n- [ ] \u81ea\u5b9a\u4e49\u6a21\u578b\u8bad\u7ec3\r\n\r\n---\r\n\r\n## \u8d21\u732e\u6307\u5357\r\n\r\n\u6b22\u8fce\u8d21\u732e\u4ee3\u7801\u3001\u62a5\u544a\u95ee\u9898\u6216\u63d0\u51fa\u5efa\u8bae\uff01\r\n\r\n### \u5982\u4f55\u8d21\u732e\r\n\r\n1. Fork \u672c\u4ed3\u5e93\r\n2. \u521b\u5efa\u7279\u6027\u5206\u652f (`git checkout -b feature/AmazingFeature`)\r\n3. \u63d0\u4ea4\u66f4\u6539 (`git commit -m 'Add some AmazingFeature'`)\r\n4. \u63a8\u9001\u5230\u5206\u652f (`git push origin feature/AmazingFeature`)\r\n5. \u5f00\u542f Pull Request\r\n\r\n### \u62a5\u544a\u95ee\u9898\r\n\r\n\u8bf7\u5728 [GitHub Issues](https://github.com/zstar1003/FreeP2W/issues) \u63d0\u4ea4\u95ee\u9898\u62a5\u544a\u3002\r\n\r\n\u63d0\u4ea4\u524d\u8bf7\u786e\u8ba4\uff1a\r\n- \u641c\u7d22\u662f\u5426\u6709\u76f8\u540c\u7684\u95ee\u9898\u5df2\u88ab\u62a5\u544a\r\n- \u63d0\u4f9b\u8be6\u7ec6\u7684\u9519\u8bef\u4fe1\u606f\u548c\u590d\u73b0\u6b65\u9aa4\r\n- \u9644\u4e0a\u7cfb\u7edf\u73af\u5883\u4fe1\u606f\uff08\u64cd\u4f5c\u7cfb\u7edf\u3001Python \u7248\u672c\u7b49\uff09\r\n\r\n---\r\n\r\n## \u81f4\u8c22\r\n\r\n\u672c\u9879\u76ee\u4f7f\u7528\u4e86\u4ee5\u4e0b\u5f00\u6e90\u9879\u76ee\uff1a\r\n\r\n- [DocLayout-YOLO](https://github.com/opendatalab/DocLayout-YOLO) - \u6587\u6863\u5e03\u5c40\u68c0\u6d4b\r\n- [UniMERNet](https://github.com/opendatalab/UniMERNet) - \u6570\u5b66\u516c\u5f0f\u8bc6\u522b\r\n- [pdf2docx](https://github.com/dothinking/pdf2docx) - PDF \u5230 DOCX \u8f6c\u6362\r\n- [PyMuPDF](https://github.com/pymupdf/PyMuPDF) - PDF \u6587\u6863\u5904\u7406\r\n\r\n\u611f\u8c22\u8fd9\u4e9b\u4f18\u79c0\u7684\u5f00\u6e90\u9879\u76ee\uff01\r\n\r\n---\r\n\r\n## \u8bb8\u53ef\u8bc1\r\n\r\n\u672c\u9879\u76ee\u91c7\u7528 MIT \u8bb8\u53ef\u8bc1 - \u8be6\u89c1 [LICENSE](LICENSE) \u6587\u4ef6\u3002\r\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Free PDF to Word Converter",
"version": "1.0.3",
"project_urls": {
"Bug Tracker": "https://github.com/zstar1003/FreeP2W/issues",
"Documentation": "https://github.com/zstar1003/FreeP2W/wiki",
"Homepage": "https://github.com/zstar1003/FreeP2W",
"Repository": "https://github.com/zstar1003/FreeP2W"
},
"split_keywords": [
"pdf",
" docx",
" converter",
" formula",
" recognition",
" yolo",
" unimernet"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "a51ea971d0664a53f0ef079584ef40c5538aa5849f8a33c0ff1f0af8ffb0a797",
"md5": "7e75ea17acc4aea02ea5e0b39cde68cb",
"sha256": "be282c94374f5b08ad60444369a4c06b763e27e77e385222dea2b75dd58340a3"
},
"downloads": -1,
"filename": "freep2w-1.0.3-py3-none-any.whl",
"has_sig": false,
"md5_digest": "7e75ea17acc4aea02ea5e0b39cde68cb",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 815104,
"upload_time": "2025-10-25T13:40:08",
"upload_time_iso_8601": "2025-10-25T13:40:08.127917Z",
"url": "https://files.pythonhosted.org/packages/a5/1e/a971d0664a53f0ef079584ef40c5538aa5849f8a33c0ff1f0af8ffb0a797/freep2w-1.0.3-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "f681ee47d447082696568ba310c251860dafcef2b22cfa1da13939b155e2f3b5",
"md5": "515f318bfc5a7234094c1c8fb22c2134",
"sha256": "a89b43bf1dc6c6eeb685f4bacb7942064d3b9ae92a9bf8ffd9669d49f36c4468"
},
"downloads": -1,
"filename": "freep2w-1.0.3.tar.gz",
"has_sig": false,
"md5_digest": "515f318bfc5a7234094c1c8fb22c2134",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 655738,
"upload_time": "2025-10-25T13:40:09",
"upload_time_iso_8601": "2025-10-25T13:40:09.984382Z",
"url": "https://files.pythonhosted.org/packages/f6/81/ee47d447082696568ba310c251860dafcef2b22cfa1da13939b155e2f3b5/freep2w-1.0.3.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-10-25 13:40:09",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "zstar1003",
"github_project": "FreeP2W",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"requirements": [
{
"name": "aiohappyeyeballs",
"specs": [
[
"==",
"2.6.1"
]
]
},
{
"name": "aiohttp",
"specs": [
[
"==",
"3.13.1"
]
]
},
{
"name": "aiosignal",
"specs": [
[
"==",
"1.4.0"
]
]
},
{
"name": "albucore",
"specs": [
[
"==",
"0.0.24"
]
]
},
{
"name": "albumentations",
"specs": [
[
"==",
"2.0.8"
]
]
},
{
"name": "altgraph",
"specs": [
[
"==",
"0.17.4"
]
]
},
{
"name": "annotated-types",
"specs": [
[
"==",
"0.7.0"
]
]
},
{
"name": "antlr4-python3-runtime",
"specs": [
[
"==",
"4.9.3"
]
]
},
{
"name": "anyio",
"specs": [
[
"==",
"4.11.0"
]
]
},
{
"name": "async-timeout",
"specs": [
[
"==",
"5.0.1"
]
]
},
{
"name": "attrs",
"specs": [
[
"==",
"25.4.0"
]
]
},
{
"name": "backports-tarfile",
"specs": [
[
"==",
"1.2.0"
]
]
},
{
"name": "braceexpand",
"specs": [
[
"==",
"0.1.7"
]
]
},
{
"name": "certifi",
"specs": [
[
"==",
"2025.10.5"
]
]
},
{
"name": "cffi",
"specs": [
[
"==",
"2.0.0"
]
]
},
{
"name": "charset-normalizer",
"specs": [
[
"==",
"3.4.4"
]
]
},
{
"name": "colorama",
"specs": [
[
"==",
"0.4.6"
]
]
},
{
"name": "contourpy",
"specs": [
[
"==",
"1.3.2"
]
]
},
{
"name": "contourpy",
"specs": [
[
"==",
"1.3.3"
]
]
},
{
"name": "cryptography",
"specs": [
[
"==",
"46.0.3"
]
]
},
{
"name": "cycler",
"specs": [
[
"==",
"0.12.1"
]
]
},
{
"name": "datasets",
"specs": [
[
"==",
"4.2.0"
]
]
},
{
"name": "dill",
"specs": [
[
"==",
"0.4.0"
]
]
},
{
"name": "docutils",
"specs": [
[
"==",
"0.22.2"
]
]
},
{
"name": "evaluate",
"specs": [
[
"==",
"0.4.6"
]
]
},
{
"name": "exceptiongroup",
"specs": [
[
"==",
"1.3.0"
]
]
},
{
"name": "fairscale",
"specs": [
[
"==",
"0.4.13"
]
]
},
{
"name": "filelock",
"specs": [
[
"==",
"3.20.0"
]
]
},
{
"name": "fire",
"specs": [
[
"==",
"0.7.1"
]
]
},
{
"name": "fonttools",
"specs": [
[
"==",
"4.60.1"
]
]
},
{
"name": "frozenlist",
"specs": [
[
"==",
"1.8.0"
]
]
},
{
"name": "fsspec",
"specs": [
[
"==",
"2025.9.0"
]
]
},
{
"name": "ftfy",
"specs": [
[
"==",
"6.3.1"
]
]
},
{
"name": "h11",
"specs": [
[
"==",
"0.16.0"
]
]
},
{
"name": "hf-xet",
"specs": [
[
"==",
"1.1.10"
]
]
},
{
"name": "httpcore",
"specs": [
[
"==",
"1.0.9"
]
]
},
{
"name": "httpx",
"specs": [
[
"==",
"0.28.1"
]
]
},
{
"name": "huggingface-hub",
"specs": [
[
"==",
"0.35.3"
]
]
},
{
"name": "id",
"specs": [
[
"==",
"1.5.0"
]
]
},
{
"name": "idna",
"specs": [
[
"==",
"3.11"
]
]
},
{
"name": "importlib-metadata",
"specs": [
[
"==",
"8.7.0"
]
]
},
{
"name": "iopath",
"specs": [
[
"==",
"0.1.10"
]
]
},
{
"name": "jaraco-classes",
"specs": [
[
"==",
"3.4.0"
]
]
},
{
"name": "jaraco-context",
"specs": [
[
"==",
"6.0.1"
]
]
},
{
"name": "jaraco-functools",
"specs": [
[
"==",
"4.3.0"
]
]
},
{
"name": "jeepney",
"specs": [
[
"==",
"0.9.0"
]
]
},
{
"name": "jinja2",
"specs": [
[
"==",
"3.1.6"
]
]
},
{
"name": "keyring",
"specs": [
[
"==",
"25.6.0"
]
]
},
{
"name": "kiwisolver",
"specs": [
[
"==",
"1.4.9"
]
]
},
{
"name": "lxml",
"specs": [
[
"==",
"6.0.2"
]
]
},
{
"name": "macholib",
"specs": [
[
"==",
"1.16.3"
]
]
},
{
"name": "markdown-it-py",
"specs": [
[
"==",
"4.0.0"
]
]
},
{
"name": "markupsafe",
"specs": [
[
"==",
"3.0.3"
]
]
},
{
"name": "matplotlib",
"specs": [
[
"==",
"3.10.7"
]
]
},
{
"name": "mdurl",
"specs": [
[
"==",
"0.1.2"
]
]
},
{
"name": "more-itertools",
"specs": [
[
"==",
"10.8.0"
]
]
},
{
"name": "mpmath",
"specs": [
[
"==",
"1.3.0"
]
]
},
{
"name": "multidict",
"specs": [
[
"==",
"6.7.0"
]
]
},
{
"name": "multiprocess",
"specs": [
[
"==",
"0.70.16"
]
]
},
{
"name": "networkx",
"specs": [
[
"==",
"3.4.2"
]
]
},
{
"name": "networkx",
"specs": [
[
"==",
"3.5"
]
]
},
{
"name": "nh3",
"specs": [
[
"==",
"0.3.1"
]
]
},
{
"name": "numpy",
"specs": [
[
"==",
"1.26.4"
]
]
},
{
"name": "nvidia-cublas-cu12",
"specs": [
[
"==",
"12.6.4.1"
]
]
},
{
"name": "nvidia-cuda-cupti-cu12",
"specs": [
[
"==",
"12.6.80"
]
]
},
{
"name": "nvidia-cuda-nvrtc-cu12",
"specs": [
[
"==",
"12.6.77"
]
]
},
{
"name": "nvidia-cuda-runtime-cu12",
"specs": [
[
"==",
"12.6.77"
]
]
},
{
"name": "nvidia-cudnn-cu12",
"specs": [
[
"==",
"9.10.2.21"
]
]
},
{
"name": "nvidia-cufft-cu12",
"specs": [
[
"==",
"11.3.0.4"
]
]
},
{
"name": "nvidia-cufile-cu12",
"specs": [
[
"==",
"1.11.1.6"
]
]
},
{
"name": "nvidia-curand-cu12",
"specs": [
[
"==",
"10.3.7.77"
]
]
},
{
"name": "nvidia-cusolver-cu12",
"specs": [
[
"==",
"11.7.1.2"
]
]
},
{
"name": "nvidia-cusparse-cu12",
"specs": [
[
"==",
"12.5.4.2"
]
]
},
{
"name": "nvidia-cusparselt-cu12",
"specs": [
[
"==",
"0.7.1"
]
]
},
{
"name": "nvidia-nccl-cu12",
"specs": [
[
"==",
"2.27.5"
]
]
},
{
"name": "nvidia-nvjitlink-cu12",
"specs": [
[
"==",
"12.6.85"
]
]
},
{
"name": "nvidia-nvshmem-cu12",
"specs": [
[
"==",
"3.3.20"
]
]
},
{
"name": "nvidia-nvtx-cu12",
"specs": [
[
"==",
"12.6.77"
]
]
},
{
"name": "omegaconf",
"specs": [
[
"==",
"2.3.0"
]
]
},
{
"name": "opencv-python-headless",
"specs": [
[
"==",
"4.11.0.86"
]
]
},
{
"name": "packaging",
"specs": [
[
"==",
"25.0"
]
]
},
{
"name": "pandas",
"specs": [
[
"==",
"2.3.3"
]
]
},
{
"name": "pefile",
"specs": [
[
"==",
"2023.2.7"
]
]
},
{
"name": "pillow",
"specs": [
[
"==",
"10.4.0"
]
]
},
{
"name": "portalocker",
"specs": [
[
"==",
"3.2.0"
]
]
},
{
"name": "propcache",
"specs": [
[
"==",
"0.4.1"
]
]
},
{
"name": "psutil",
"specs": [
[
"==",
"7.1.1"
]
]
},
{
"name": "pyarrow",
"specs": [
[
"==",
"21.0.0"
]
]
},
{
"name": "pycparser",
"specs": [
[
"==",
"2.23"
]
]
},
{
"name": "pydantic",
"specs": [
[
"==",
"2.12.3"
]
]
},
{
"name": "pydantic-core",
"specs": [
[
"==",
"2.41.4"
]
]
},
{
"name": "pygments",
"specs": [
[
"==",
"2.19.2"
]
]
},
{
"name": "pyinstaller",
"specs": [
[
"==",
"6.16.0"
]
]
},
{
"name": "pyinstaller-hooks-contrib",
"specs": [
[
"==",
"2025.9"
]
]
},
{
"name": "pymupdf",
"specs": [
[
"==",
"1.26.5"
]
]
},
{
"name": "pyparsing",
"specs": [
[
"==",
"3.2.5"
]
]
},
{
"name": "python-dateutil",
"specs": [
[
"==",
"2.9.0.post0"
]
]
},
{
"name": "python-docx",
"specs": [
[
"==",
"1.2.0"
]
]
},
{
"name": "pytz",
"specs": [
[
"==",
"2025.2"
]
]
},
{
"name": "pywin32",
"specs": [
[
"==",
"311"
]
]
},
{
"name": "pywin32-ctypes",
"specs": [
[
"==",
"0.2.3"
]
]
},
{
"name": "pyyaml",
"specs": [
[
"==",
"6.0.3"
]
]
},
{
"name": "rapidfuzz",
"specs": [
[
"==",
"3.14.1"
]
]
},
{
"name": "readme-renderer",
"specs": [
[
"==",
"44.0"
]
]
},
{
"name": "regex",
"specs": [
[
"==",
"2025.10.22"
]
]
},
{
"name": "requests",
"specs": [
[
"==",
"2.32.5"
]
]
},
{
"name": "requests-toolbelt",
"specs": [
[
"==",
"1.0.0"
]
]
},
{
"name": "rfc3986",
"specs": [
[
"==",
"2.0.0"
]
]
},
{
"name": "rich",
"specs": [
[
"==",
"14.2.0"
]
]
},
{
"name": "safetensors",
"specs": [
[
"==",
"0.6.2"
]
]
},
{
"name": "scipy",
"specs": [
[
"==",
"1.15.3"
]
]
},
{
"name": "scipy",
"specs": [
[
"==",
"1.16.2"
]
]
},
{
"name": "secretstorage",
"specs": [
[
"==",
"3.4.0"
]
]
},
{
"name": "setuptools",
"specs": [
[
"==",
"80.9.0"
]
]
},
{
"name": "simsimd",
"specs": [
[
"==",
"6.5.3"
]
]
},
{
"name": "six",
"specs": [
[
"==",
"1.17.0"
]
]
},
{
"name": "sniffio",
"specs": [
[
"==",
"1.3.1"
]
]
},
{
"name": "stringzilla",
"specs": [
[
"==",
"4.2.1"
]
]
},
{
"name": "sympy",
"specs": [
[
"==",
"1.14.0"
]
]
},
{
"name": "termcolor",
"specs": [
[
"==",
"3.1.0"
]
]
},
{
"name": "timm",
"specs": [
[
"==",
"1.0.20"
]
]
},
{
"name": "tokenizers",
"specs": [
[
"==",
"0.19.1"
]
]
},
{
"name": "torch",
"specs": [
[
"==",
"2.9.0"
]
]
},
{
"name": "torch",
"specs": [
[
"==",
"2.9.0+cu126"
]
]
},
{
"name": "torchvision",
"specs": [
[
"==",
"0.24.0"
]
]
},
{
"name": "torchvision",
"specs": [
[
"==",
"0.24.0"
]
]
},
{
"name": "torchvision",
"specs": [
[
"==",
"0.24.0+cu126"
]
]
},
{
"name": "tqdm",
"specs": [
[
"==",
"4.67.1"
]
]
},
{
"name": "transformers",
"specs": [
[
"==",
"4.42.4"
]
]
},
{
"name": "triton",
"specs": [
[
"==",
"3.5.0"
]
]
},
{
"name": "twine",
"specs": [
[
"==",
"6.2.0"
]
]
},
{
"name": "typing-extensions",
"specs": [
[
"==",
"4.15.0"
]
]
},
{
"name": "typing-inspection",
"specs": [
[
"==",
"0.4.2"
]
]
},
{
"name": "tzdata",
"specs": [
[
"==",
"2025.2"
]
]
},
{
"name": "urllib3",
"specs": [
[
"==",
"2.5.0"
]
]
},
{
"name": "wcwidth",
"specs": [
[
"==",
"0.2.14"
]
]
},
{
"name": "webdataset",
"specs": [
[
"==",
"1.0.2"
]
]
},
{
"name": "xxhash",
"specs": [
[
"==",
"3.6.0"
]
]
},
{
"name": "yarl",
"specs": [
[
"==",
"1.22.0"
]
]
},
{
"name": "zipp",
"specs": [
[
"==",
"3.23.0"
]
]
}
],
"lcname": "freep2w"
}