# convert2pdf_server
**Repository Path**: meidici911/convert2pdf_server
## Basic Information
- **Project Name**: convert2pdf_server
- **Description**: s3版本的将文件转为pdf的代码
- **Primary Language**: Python
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-07-03
- **Last Updated**: 2026-03-07
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 文件转 PDF 服务
## 1. 简述
### 1.1 项目说明
**A** **项目出发点**: 是在rag过程中文档有很多文档格式,将文档都转为pdf后可以实现同构,后续的文字提取,图片处理的具体操作只需对pdf一种格式进行处理即可。同时将这个需求抽象出来,多种不同的业务都可以调用这个服务。
**B** **多架构适配**: 同时文件格式转化的工具,很多对操作系统(linux/windows/macos),以及cpu架构(x86/arm64)大多数都有条件依赖,并不通用,换一个客户就要换一种解决方案,本服务也是为了解决这个问题,不管业务方什么操作系统,什么底层架构,均可快速将多格式文档归一为pdf格式,并且信息损失最小。
**C** **概述**: 本服务因为了支持直接部署+容器+高并发生产需求,所以项目整体目录看起来有一定的复杂度。但是**快速开发和简单使用时**,仅需知道核心原理,查看**“直接部署”**的部分和“main.py”即可快速上手,满足基本业务需求。所以不需要有畏难情绪。
### 1.2 快速开始(省流不看版&&部署生产)
> Tips: 省流版部署基于 `ARM64` 架构构建的镜像,仅用于在 `ARM64` 架构上部署
> 若要在 `X86` 架构上部署需要按下面流程进行部署
需要先配置存储环境 `MinIO` 参考[minio容器启动方法](./doc/minio容器启动方法.md)
```
# 拉取docker镜像
docker pull swr.cn-north-4.myhuaweicloud.com/wyyy/convert2pdf_server:0.4.0
# 拉取仓库
git clone https://github.com/ppppangu/convert2pdf_server
# 进入项目目录
cd convert2pdf_server
# 使用uv包管理工具同步虚拟环境
uv sync -i https://pypi.tuna.tsinghua.edu.cn/simple
# 编写.env文件配置环境
# 启动
uv run python ./main_multi_docker.py
```
### 1.3 使用服务
**请求示例:**
```bash
curl --location 'http://服务启动的IP:7758/convert' \
--form 'file_url="https://www.bjmtg.gov.cn/bjmtg/2024zcwj/202505/eeeddd638a6c46f6baa96d78673d94ae/files/d45ec828cedf4906baaaedb42c94a319.doc"'
```
**响应示例:**
```json
{
"status": "success",
"original_source": "https://www.bjmtg.gov.cn/bjmtg/2024zcwj/202505/eeeddd638a6c46f6baa96d78673d94ae/files/d45ec828cedf4906baaaedb42c94a319.doc",
"converted_url": "https://149min9000.cpolar.cn/publicfiles/convert_file2pdf_server/1755771316.037417_d45ec828cedf4906baaaedb42c94a319.pdf",
"original_url": "https://www.bjmtg.gov.cn/bjmtg/2024zcwj/202505/eeeddd638a6c46f6baa96d78673d94ae/files/d45ec828cedf4906baaaedb42c94a319.doc"
}
```
## 2. 使用流程一览
### 2.1 部署
```mermaid
graph LR
START[开始部署] --> CHOOSE{选择部署方式}
CHOOSE -->|直接部署(POC推荐)| DIRECT[配置Python环境
安装依赖包
启动应用服务]
CHOOSE -->|多容器并行部署(生产推荐)| MULTI[使用main_multi_docker.py
动态创建容器并行处理]
CHOOSE -->|Docker部署| DOCKER[构建Docker镜像
运行Docker容器]
CHOOSE -->|Docker-Compose部署| COMPOSE[编写docker-compose.yml
docker-compose up]
CHOOSE -->|Kubernetes部署| K8S[创建K8s配置文件
kubectl apply部署]
DIRECT --> READY[✅ 服务就绪]
MULTI --> READY
DOCKER --> READY
COMPOSE --> READY
K8S --> READY
```
### 2.2 调用
```mermaid
graph LR
START[开始调用API] --> CHOOSE{选择上传方式}
CHOOSE -->|文件上传| FILE_API[POST /convert
上传文件]
CHOOSE -->|URL上传| URL_API[POST /convert
发送文件URL]
FILE_API --> RESULT[接收PDF下载链接]
URL_API --> RESULT
RESULT --> END[完成]
style START fill:#e1f5fe
style CHOOSE fill:#fff3e0
style FILE_API fill:#e8f5e8
style URL_API fill:#e8f5e8
style RESULT fill:#c8e6c9
style END fill:#f3e5f5
```
## 3. 特点
> 1、高效、轻量的文件格式转 PDF 服务,基于 LibreOffice 实现转换,使用 MinIO/S3 兼容对象存储保存转换结果;
>
> 2、支持二十多种格式的文件转pdf(LibreOffice支持的都支持,详情见main.py)
>
> 3、支持文件自动过期,无需手动管理中间文件的硬盘空间占用;
>
> 4、可根据业务需求自行选择:直接部署服务,multi_docker多容器并行部署,docker/docker-compose部署,k8s部署;
>
> 5、三种部署方式均支持并发,属于cpu密集型任务;
>
> 6、windows,linux,macos,不管是x86还是arm64均可部署完整服务(核心是libreoffice部署上就行,这个开源工具也正好基本支持全架构全操作系统,即使不支持也能用容器);
>
> 6、二次开发:可给main中增加要转换的格式入参,通过中间格式,实现任意目标格式的转换服务;支持更多的功能等。
# 3.+ 补充
**解决问题点**
> 1. 开发上:做RAG/其他任务时,用户给到了多种文件,导致在写处理逻辑时n种文件格式就要找n种解析方式,稀奇古怪的格式更甚。
> 2. 开发上:统一格式的选择上,统一为txt文档的解决方案会损失很多多模态信息,md文档会损失位置信息,加之大多数的OCR工具均是对pdf进行处理,综合考量下来pdf相对最优。
> 3. 部署上:即使统一格式,也可能会出现因开发环境和给客户部署的环境在系统架构(arm/amd),操作系统类型,离线/在线的不同临时出现问题。
**部署方式的选择**
> 1、**常规客户业务** **直接部署**即可;
>
> **2、刁钻的** **操作系统** **/离线环境**用 **docker部署** ;
>
> **3、高并发**到前两种服务的请求error率变高时选用 **k8s部署** 。
---
## 4. 前置知识说明
> 省流:
>
> 1、必须要学的:**tmux**用于后台挂起服务,**uv**用于虚拟环境的快速同步;
>
> 2、其他项目也要用的,但是本项目里不用也行的:docker的使用(进阶把docker-compose也看了,非复杂任务可以先不看);
>
> 3、会了的话对其他项目也有帮助的:minio云存储,**cpolar内网穿透工具**(极大提高对接效率);
>
> 4、仅本需求点用的工具:libreoffice;
>
> 5、全学会了再学的:k8s,短期可以先不看;
>
> 总结:tmux,uv,cpolar必学的
1. 首先需要对核心工具**libreoffice**的有基础了解;
2. 需要了解**对象存储minio**的一些基本概念,相关前置知识自行搜索,知道如何配置即可;
3. 直接部署时需要了解**uv**的使用,**tmux**终端会话工具;
4. docker/docker-compose部署时需要了解**docker**,**docker-compose的部署和使用方式,配置原理**;
5. k8s部署还需要了解k8s的部署,配置和使用;
6. 根据业务需求时间,自身知识程度,部署情况等因素灵活选择部署方式;
---
## 5. 部署先决条件
根据不同的部署方式,所需的前置环境有所不同。根据选择的部署方式查看对应的要求即可,不需要全会。
### 方式一:裸机/虚拟环境部署 - 前置环境
> 适用于快速验证、开发调试、小规模使用
| 组件 | 说明 | 最低版本 | 安装指导 |
| --------------- | -------------------------------------------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------- |
| **Python** | Python 运行时环境 | 3.12 | [官网下载](https://www.python.org/downloads/) |
| **uv** | Python 包管理工具(推荐) | 最新版 | `pip install uv` 或 [官方安装指南](https://docs.astral.sh/uv/getting-started/installation/) |
| **LibreOffice** | 核心转换引擎,确保 `soffice` 命令可用 | 7.x | [官网下载](https://www.libreoffice.org/download/download/) 或 `sudo apt install libreoffice`,windows/linux/macos均可下载,具体查csdn |
| **MinIO/S3** | 对象存储服务,需要创建 Bucket 并获取访问密钥 | 任意兼容版本 | [MinIO 部署指南](https://min.io/docs/minio/linux/operations/installation.html) |
**LibreOffice 安装验证**:
```bash
# 验证安装是否成功,linux在终端执行,windows在cmd/powershell执行
soffice --version
# 应该输出类似:LibreOffice 7.x.x.x
```
### 方式二:Docker/Docker-Compose部署 - 前置环境
> 推荐用于生产环境的单机/小集群部署
| 组件 | 说明 | 最低版本 | 安装指导 |
| ------------------ | -------------------------------------------- | ------------ | --------------------------------------------------- |
| **Docker** | 容器运行时 | 23.x | [官方安装指南](https://docs.docker.com/get-docker/) |
| **Docker Compose** | 容器编排工具(通常与 Docker 一起安装) | 2.x | `docker compose version` 验证,有文档 |
| **MinIO/S3** | 对象存储服务,需要创建 Bucket 并获取访问密钥 | 任意兼容版本 | 可通过 Docker 部署或使用云服务 |
**Docker 安装验证**:
```bash
# 验证 Docker 安装
docker --version
docker compose version
# 测试 Docker 运行
docker run hello-world
```
**注意**:Docker 方式中 LibreOffice 和 Python 环境已经打包在镜像中,无需单独安装。
### 方式三:Kubernetes部署 - 前置环境
> 适用于大规模并发、弹性伸缩场景(>50 并发)
| 组件 | 说明 | 最低版本 | 安装指导 |
| ---------------- | ----------------------------------------------------- | ------------ | ----------------------------------------------------------------------- |
| **Kubectl** | Kubernetes 命令行工具 | 1.26+ | [官方安装指南](https://kubernetes.io/docs/tasks/tools/install-kubectl/) |
| **Kubernetes** | 容器编排平台(集群) | 1.26+ | 需要已有 K8s 集群或自建 |
| **Docker** | 用于构建和推送镜像到私有仓库 | 23.x | [官方安装指南](https://docs.docker.com/get-docker/) |
| **容器镜像仓库** | 存储应用镜像(如 Harbor、Docker Hub、云厂商镜像仓库) | - | 根据选择的仓库查看文档,我用的话华为云的镜像仓库服务 |
| **MinIO/S3** | 对象存储服务,建议使用云服务或集群内部署 | 任意兼容版本 | 推荐使用云服务保证高可用 |
**Kubernetes 环境验证**:
```bash
# 验证集群连接
kubectl cluster-info
kubectl get nodes
# 验证权限
kubectl auth can-i create deployments
kubectl auth can-i create services
```
### 通用环境变量配置(重中之重)
**所有部署方式都需要配置以下环境变量,直接部署的话直接改.env文件即可,其他两种需要进行容器环境变量的配置**:
```bash
# MinIO/S3 配置
S3_BUCKET_NAME=publicfiles # 存储桶名称
S3_ACCESS_KEY_ID= # 访问密钥ID
S3_SECRET_ACCESS_KEY= # 访问密钥Secret
S3_REGION= # 可选,MinIO 可忽略
S3_ENDPOINT_URL=http://minio:9000 # MinIO/S3 端点
# 服务配置
PDF_EXPIRE_TIME=3600 # PDF 过期时间(秒),0 表示永不过期
DOWNLOAD_URL_PREFIX= # 若有反向代理,或者是内网穿透开放了9000端口,可指定转化完成后文件的下载前缀
```
**MinIO/S3 配置说明**:
- 确保指定的 Bucket 已创建且具有读写权限
- AccessKey 和 SecretKey 需要有对应 Bucket 的操作权限
- 如使用 MinIO,endpoint 格式为 `http://ip:port`
- 如使用 AWS S3,可省略 `S3_ENDPOINT_URL`
---
## 6. 部署
### 部署方式一:裸机 / 虚拟环境(**uv**)【POC推荐】
> 适用于快速验证、小规模使用。
```bash
# 部署前检查1,检查uv已下载,如果没有,则使用pip install uv下载
pip show uv
# 部署前检查2,检查系统环境下libreoffice已下载,如果没有,则使用apt install libreoffice下载。以及要支持更多字体的话,参考dockerfile中的apt下载命令执行一遍下载即可
soffice --version
# 部署前检查3,minio存储服务是否正确启动
# 这部分在下面uv run python main.py时的startup事件里进行检查
# tmux创建一个新的session
tmux
# 制作总项目目录
mkdir -p /data/project1
cd /data/project1
# 拉取仓库
git clone https://github.com/ppppangu/convert2pdf_server
# 进入项目目录
cd convert2pdf_server
# 使用uv包管理工具同步虚拟环境
uv lock
uv sync -i https://pypi.tuna.tsinghua.edu.cn/simple
# vim编辑.env 虚拟环境,配置相关的存储服务
vim .env
# 起服务,默认运行在7758端口上
uv run python main.py
# 挂起终端:ctrl+b 再按d
# 后续重新进入的话需看一下tmux的文档熟练使用
```
**热更新 / 生产环境**:可配合 `gunicorn` + `uvicorn.workers.UvicornWorker` 部署,或自行使用 `systemd / supervisor` 进行守护。(不推荐,直接起就行)
---
### 部署方式二:Docker / Docker-Compose
> 推荐用于生产环境的单机 / 小集群部署。
1. **修改 `docker-compose.yml` 中的环境变量**(见前述先决条件)。
2. **启动服务**:
```bash
$ docker compose up -d # 首次会自动构建镜像
# 或使用已有镜像(示例):
# $ docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
```
3. **验证**:
```bash
$ curl http://localhost:7758/health # 返回 {"status":"ok"} 即成功
```
---
### 部署方式三:Kubernetes(大并发 / 弹性伸缩)
> 当预计并发转换量较大(>50 并发)时,建议使用 K8s,通过副本数或 HPA 横向扩展。
完整部署指南请参见 [`README-k8s.md`](./doc/README-k8s.md)。该文档包含:
- 镜像准备与私有仓库推送
- `Deployment` / `Service` / `Ingress` 示范 YAML
- 日志持久化 PVC
- HPA 自动扩缩容配置
---
## 7. 服务调用(后端直接调用服务端)
部署完成后,即可通过以下 REST API 进行调用。
| 接口 | 方法 | 描述 |
| --------------------------- | ---- | ---------------------------------------------- |
| `/health` | GET | 健康检查 |
| `/get_supported_file_types` | GET | 获取服务支持的文件扩展名 |
| `/convert` | POST | 文件转 PDF(支持**URL 下载** 或 **直接上传**) |
### 1. 健康检查
```bash
curl http://:/health # {"status":"ok"}
```
### 2. 获取支持的文件类型
```bash
curl http://:/get_supported_file_types
```
**响应示例(不止):**
```json
{
"supported_file_types": [
".doc", ".docx", ".ppt", ".pptx", ".xls", ".xlsx",
".odt", ".ods", ".odp", ".txt", ".rtf",
".jpg", ".jpeg", ".png", ".tiff", ".tif", ".bmp",
".html", ".htm", ".md", ".csv", ".tsv", ".xml"
]
}
```
### 3. 转换文件
方式一:通过文件 URL
```bash
curl -X POST http://:/convert \
-F "file_url=https://example.com/sample.docx"
```
方式二:直接上传文件(初学者**推荐**直接上传,使用文件url对接更方便但是需要"手动上传到S3存储+内网穿透"的部署)
```bash
curl -X POST http://:/convert \
-F "file=@/path/to/local/sample.docx"
```
成功响应示例:
```json
{
"status": "success",
"original_source": "https://example.com/sample.docx",
"converted_url": "http://minio:9000/publicfiles/convert_file2pdf_server/1710000000_sample.pdf"
}
```
> **提示**:如需跨域调用,服务已默认启用 `*` CORS 策略。
---
## 8. 服务调用(快速开始)
### 客户端使用(推荐) # 交互式引导
```bash
# 1. 进入客户端目录
cd client/
# 2. 安装依赖
pip install -r requirements.txt
# 3. 运行快速开始脚本
python quick_start.py
```
然后按提示输入服务端IP、端口和文件目录即可!
### 💼 开发者 / 集成使用
```python
# 3行代码实现批量转换
from convert_client import ConvertClient
client = ConvertClient("192.168.1.100", 7758)
results = await client.convert_directory("./documents")
```
### 🖥️ 命令行用户
```bash
cd client/
python convert_cli.py -H 192.168.1.100 -p 7758 -i ./documents -w 10
```
## ✨ 核心特性
### 客户端特性
- **🔌 即插即用**: 只需配置服务端IP和端口
- **⚡ 异步并发**: 支持高并发转换,大幅提升效率
- **🔄 智能重试**: 内置指数退避重试机制
- **📊 实时进度**: 实时显示转换进度和统计信息
- **📁 批量处理**: 支持目录递归搜索
- **💾 结果保存**: 自动保存转换结果和报告
### 服务端特性
- **🏃♂️ 高性能**: 基于LibreOffice,支持20+种文件格式
- **🐳 多部署**: 支持裸机/Docker/K8s部署
- **☁️ 云存储**: 集成MinIO/S3对象存储
- **🔄 多架构**: 支持x86/ARM64,Linux/Windows/macOS
- **📈 可扩展**: 支持水平扩展和负载均衡
## 🎬 使用演示
### 最简使用 - 3行代码
```python
import asyncio
from client.convert_client import ConvertClient
async def main():
client = ConvertClient("192.168.1.100", 7758)
results = await client.convert_directory("./my_documents")
print(f"转换完成!成功: {sum(1 for r in results if r.status == 'success')} 个")
asyncio.run(main())
```
## 📚 详细文档
- **[客户端使用文档](./client/README.md)** - 详细的客户端使用指南
- **[服务端部署文档](./doc/)** - 完整的服务端部署方案
- **[开发文档](./doc/DEVELOPMENT_DOC.md)** - 二次开发和维护指南
- **[K8s部署文档](./doc/README-k8s.md)** - 大规模部署方案
## 🔧 部署方案选择
| 场景 | 推荐方案 | 部署复杂度 | 适用规模 |
|------|---------|-----------|---------|
| **快速体验** | 客户端 + 现有任意服务 | ⭐ | 个人使用 |
| **小规模业务** | 裸机部署main服务端 | ⭐⭐ | < 10并发 |
| **生产环境** | multidocker.py部署 | ⭐⭐⭐ | 10-100并发 |
| **超高并发** | K8s + 多副本 | ⭐⭐⭐⭐ | > 100并发 |
## 一些说明
1、表格文件支持转化,但是涉及表格精细操作的业务最好单独写业务逻辑。
## 🤝 贡献 & 反馈
- 🐛 **Bug报告**: [提交Issue](https://github.com/ppppangu/convert2pdf_server/issues)
- 💡 **功能建议**: 欢迎提出改进建议,要有更高的通用性还需更加优化,有需求提issue
- 🔧 **代码贡献**: 如需贡献,提交 PR 或 issue。更新日志请查看 Releases。
- 📖 **文档完善**: 若要维护请查看帮助改进文档[DEVELOPMENT_DOC.md](./doc/DEVELOPMENT_DOC.md) 文档。
## 📄 许可证
本项目采用开源许可证,欢迎自由使用和修改。
---
**🎉 现在就开始使用吧!**
1. **想快速体验?** → `cd client/ && python quick_start.py`
2. **想集成到项目?** → 查看 [客户端文档](./client/README.md)
3. **想部署服务?** → 查看 [服务端文档](./doc/)