# pdf2office-md-zip-project **Repository Path**: aylerh/pdf2office-md-zip-project ## Basic Information - **Project Name**: pdf2office-md-zip-project - **Description**: 项目a2-image/pdf转高质量office/pdf/md-基于正则替换【ocr法】pdf或图片识别为office文件-基于paddleocr-vl-1.5【推荐】aylerh/pdf2office-md-zip-project功能:(1)pdf或图片->包含zip,pptx,docx,xlsx,PDF (图片式)和PDF (非图片式);(2)识别md的对比修改;优点:(1)一键启动 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-03-19 - **Last Updated**: 2026-03-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # PDF2Office - PDF/图片 OCR 识别与多格式转换系统 基于 Docker Compose 一键部署的智能文档处理系统,集成 PaddleOCR-VL 大模型进行 OCR 识别,支持将 PDF 或图片转换为 Markdown、PPTX、DOCX、XLSX、PDF 等多种格式。 ## 页面预览 ### 主页 - OCR 解析 ![ocr](./images/1.png) ### PDF/图片转换工具 ![convert](./images/2.png) ### 对比导出 ![compare](./images/3.png) ## 功能特性 ### OCR 识别 - 支持上传 PDF 或图片(JPG/PNG/WebP/TIFF)进行 OCR 识别 - 基于 PaddleOCR-VL-1.5-0.9B 大模型,识别精度高 - 并发 OCR 处理(最多 3 并发),10 页 PDF 约 30-50 秒 - 输出包含 Markdown、布局解析 JSON、提取图片的 ZIP 包 ### 多格式导出 OCR 识别后可一键导出为以下格式: | 格式 | 说明 | |------|------| | **Markdown ZIP** | 包含 MD 文件、JSON 结果和提取的图片 | | **PPTX** | 按原始布局还原的演示文稿 | | **DOCX** | Word 文档(嵌入图片,支持表格) | | **XLSX** | Excel 表格(支持仅提取表格模式) | | **PDF (图片式)** | 光栅化 PDF,防复制 | | **PDF (非图片式)** | 文本式 PDF,可选中内容 | ### 文档转换工具 - PDF 转图片(批量提取为 ZIP) - 图片/PDF 合并为 PDF(图片式/非图片式) - Markdown ZIP 转 PDF - PDF 压缩(4 级质量:screen/ebook/printer/prepress) - PDF 拆分(均分/范围提取/差集模式) - ZIP 内图片合并为 PDF ## 系统架构 系统由 4 个 Docker 服务组成,通过内部网络通信: ``` 用户浏览器 | v pdf-worker (Go, :8501) <-- 前端页面 + 文档转换 + 任务管理 | |-- OCR 请求 --> ocr-api (:8503/:8080) <-- OCR 流水线服务 | | | v | vlm-server (:8504) <-- vLLM 推理引擎 + GPU | | | v | PaddleOCR-VL-1.5-0.9B 模型 | |-- ZIP --> pptx-service (Python, :8502) <-- PPTX 转换微服务 ``` ### 服务说明 | 服务 | 语言 | 端口 | GPU | 说明 | |------|------|------|-----|------| | `vlm-server` | Python | 8504 | 需要 | vLLM 大模型推理引擎 | | `ocr-api` | Python | 8503(外部)/8080(内部) | 需要 | OCR 流水线服务 | | `pptx-service` | Python | 8502 | 不需要 | PPTX 转换微服务 | | `pdf-worker` | Go | 8501 | 不需要 | 主服务(前端+转换+任务管理) | ## 快速开始 ### 环境要求 - NVIDIA GPU,8GB 显存即可(如 RTX 4060) - Docker + Docker Compose - NVIDIA Container Runtime ### 1. 拉取镜像(注意退出代理) ```bash # vLLM 推理服务镜像(约 14.35GB,离线镜像) docker pull ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddleocr-genai-vllm-server:latest-nvidia-gpu-offline # OCR 流水线服务镜像(约 10.44GB,离线镜像) docker pull ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddleocr-vl:latest-nvidia-gpu-offline ``` ### 2. 启动所有服务 ```bash docker compose up -d --build ``` ### 3. 访问 | 页面 | 地址 | |------|------| | OCR 识别主页 | http://localhost:8501 | | 文档转换工具 | http://localhost:8501/convert | | OCR 结果编辑器 | http://localhost:8501/editor | | API 文档 (Swagger) | http://localhost:8501/docs/index.html | ## 单服务重建 ```bash # 全部重新构建 docker compose down; docker compose up -d --build # 仅重建 pptx-service docker compose down pptx-service; docker compose up -d --build pptx-service # 仅重建 pdf-worker docker compose down pdf-worker; docker compose up -d --build pdf-worker ``` ## 配置说明 ### 根目录 `.env` ```env API_IMAGE_TAG_SUFFIX=latest-nvidia-gpu-offline # OCR API 镜像标签 VLM_IMAGE_TAG_SUFFIX=latest-nvidia-gpu-offline # vLLM 镜像标签 VLM_BACKEND=vllm # 推理后端 PDF_WORKER_PORT=8501 # Go 主服务端口 OCR_API_PORT=8503 # OCR API 外部端口 ``` ### vLLM 推理配置 (`paddleocr-vl-1.5-docker-project/vllm_config.yaml`) ```yaml gpu_memory_utilization: 0.75 # GPU 显存利用率(8GB 安全值) max_num_batched_tokens: 8192 # 批次大小(防 OOM) max_model_len: 10240 # 模型最大上下文长度 dtype: bfloat16 # 数据类型 max_num_seqs: 16 # 最大并发序列数 ``` ### OCR 流水线配置 (`paddleocr-vl-1.5-docker-project/pipeline_config_vllm.yaml`) - 模型:PaddleOCR-VL-1.5-0.9B - 布局检测:PP-DocLayoutV3 - 批量大小:64(推理 4096) ## 技术栈 | 范畴 | 技术 | 用途 | |------|------|------| | **核心框架** | Go 1.24 (Gin) | 主服务 HTTP 路由与并发控制 | | **OCR 引擎** | PaddlePaddle PaddleOCR-VL-1.5 | 大模型 OCR 识别 | | **推理引擎** | vLLM | 高性能大模型推理 | | **PPTX 生成** | Python (FastAPI + python-pptx) | PPTX 转换微服务 | | **图像处理** | bimg (libvips) | 裁剪、缩放、格式转换 | | **PDF 合并** | qpdf | 无损 PDF 结构操作 | | **PDF 渲染** | wkhtmltopdf (WebKit) | HTML → 高质量 PDF | | **PDF 压缩** | Ghostscript | 内核级 PDF 体积优化 | | **PDF 提取** | pdftoppm (poppler-utils) | PDF → 图片 | | **Markdown** | goldmark / gomarkdown | MD 解析与 AST 处理 | | **DOCX 生成** | docxgo/v2 | Word 文件生成 | | **XLSX 生成** | excelize/v2 | Excel 文件生成 | | **并发控制** | ants/v2 | Go 协程池(5 并发任务) | | **容器编排** | Docker Compose | 一键部署 4 个服务 | ## API 概览 所有 API 通过 `pdf-worker` 端口 `8501` 暴露,完整文档见 `/docs/index.html`。 ### OCR 相关 | 方法 | 路径 | 说明 | |------|------|------| | POST | `/api/ocr` | 单张图片 OCR 识别 | | POST | `/api/convert/pdf-direct` | PDF → OCR → ZIP(完整流程) | | POST | `/api/convert/pptx` | ZIP (result.json) → PPTX | | POST | `/api/convert/file` | MD ZIP → PDF(同步) | ### 文档转换(异步任务) | 方法 | 路径 | 说明 | |------|------|------| | POST | `/api/convert/pdf-to-images` | PDF → 图片 ZIP | | POST | `/api/convert/images-to-pdf` | 图片/PDF → PDF(图片式) | | POST | `/api/convert/images-to-pdf-non-raster` | 图片/PDF → PDF(非图片式) | | POST | `/api/convert/md-zip-to-pdf` | MD ZIP → PDF | | POST | `/api/convert/md-to-docx` | MD/ZIP → DOCX | | POST | `/api/convert/md-to-xlsx` | MD/ZIP → XLSX | | POST | `/api/convert/compress` | PDF/图片压缩 | | POST | `/api/convert/pdf-split` | PDF 拆分 | ### 任务管理 | 方法 | 路径 | 说明 | |------|------|------| | GET | `/api/tasks` | 查看所有任务 | | POST | `/api/tasks/:id/cancel` | 取消任务 | | GET | `/api/tasks/:id/download` | 下载任务结果 | ## OCR 请求格式 OCR API 期望的是 **JSON 格式**的请求,包含 base64 编码的文件: ```json { "file": "base64编码的图片或PDF数据", "fileType": 1, "useLayoutDetection": true, "useChartRecognition": false } ``` ## LaTeX 符号清洗 系统内置了完整的 LaTeX 符号清洗管道,自动将 OCR 识别出的 LaTeX 指令转换为 Unicode 符号: - 希腊字母:`\alpha` → α, `\beta` → β, `\gamma` → γ ... - 数学符号:`\times` → ×, `\leq` → ≤, `\geq` → ≥, `\approx` → ≈ ... - 集合论:`\in` → ∈, `\subset` → ⊂, `\cup` → ∪ ... - 箭头:`\rightarrow` → →, `\Rightarrow` → ⇒ ... - 分数:`\frac{a}{b}` → a/b - 上下标、求和、积分等 ## 项目参照基础 (1)将文件转为pdf-异步任务:https://gitee.com/aylerh/bimg-go-pdf-img-prject (2)前端(有md->pptx):https://gitee.com/AylerH/paddleocr-vl-1.5-docker-front-project (3)ocr启动后端:https://gitee.com/aylerh/paddleocr-vl-1.5-docker-project (4)前端(go的任务队列调用):https://gitee.com/AylerH/paddleocr-vl-1.5-docker-front-go-project ## 许可证 Apache License 2.0 ## 作者 aylerh