Skip to content

YOLO-9257/PolyDoc

Repository files navigation

PolyDoc (HTML 文档转换引擎)

License Node NestJS

中文 | English

PolyDoc 是一个高性能、高保真的 HTML 文档转换服务,致力于解决业务系统中 HTML 导出为离线文档(PDF/Word/Markdown)时的痛点,如图片丢失、样式错乱和中文乱码问题。


✨ 核心特性

  • A 级:像素级 PDF 还原 📄

    • 基于 Chromium 渲染,视觉效果与浏览器完全一致。
    • 智能分页算法,防止表格行和图片被切断。
    • 自动注入页眉页脚。
  • B 级:结构化 Word 导出 📝

    • 智能 DOM 降级,将复杂的 Flex/Grid 布局转换为 Word 友好的 Table/流式布局。
    • 自动处理 CSS 样式内联和单位转换。
    • 图片/背景图自动本地化处理。
  • C 级:语义化 Markdown 📋

    • 保留文档核心语义(标题、列表、表格)。
    • 自动清洗多余样式,生成清晰的 Markdown 源码。
  • 全流程资源处理 🛡️

    • 自动提取并下载外链图片,解决内网隔离导致的“红叉”问题。
    • 智能格式清洗(WebP 转 JPG)与体积压缩。
    • SSRF 安全防护,禁止请求内网地址。

🚀 快速开始 (Quick Start)

1. 环境要求

  • Node.js v18+
  • Docker (可选,推荐用于生产环境以保证字体支持)

2. 安装

git clone https://github.com/YOLO-9257/PolyDoc.git
cd PolyDoc
npm install

3. 配置

复制环境变量示例文件:

cp .env.example .env

.env 配置项说明:

变量名 说明 默认值
PORT 服务端口 3000
MAX_CONCURRENT_TASKS 并发任务数限制 4
IMAGE_MAX_WIDTH 图片最大宽度(自动缩放) 1200
IMAGE_QUALITY 图片压缩质量 (0-100) 80
PUPPETEER_EXECUTABLE_PATH 自定义 Chromium 路径 (自动识别)

4. 运行服务

# 开发模式
npm run start:dev

# 生产模式
npm run build
npm run start:prod

服务启动后,API 默认监听在 http://localhost:3000

🔌 API 使用示例

接口: POST /api/v1/convert

请求体 (JSON):

{
  "htmlContent": "<html><body><h1>Hello PolyDoc</h1></body></html>",
  "targetFormat": "pdf", 
  "config": {
    "optimizeImages": true,
    "filename": "my_document",
    "ai": {
      "enabled": true,
      "optimizeMode": "format"
    },
    "pdfOptions": { 
        "format": "A4", 
        "landscape": false,
        "adaptivePagination": true,
        "adaptivePaginationPasses": 2,
        "renderMode": "interactive",
        "waitForSelector": "#app-ready",
        "waitForTimeoutMs": 1200,
        "renderTimeoutMs": 30000,
        "allowedScriptDomains": ["cdn.jsdelivr.net"]
    }
  }
}

targetFormat 支持: pdf, docx, md

PDF 高保真/交互渲染建议

  • 静态页面:renderMode=static(默认),速度更快。
  • 动态页面(SPA/懒加载):renderMode=interactive,建议配合:
    • waitForSelector:关键节点出现再导出
    • waitForTimeoutMs:补偿动画/异步数据渲染
    • allowedScriptDomains:仅允许白名单域名脚本执行
  • 高保真模式建议设置:optimizeImages=false,避免图片被二次压缩或缩放。
  • 简历场景建议开启:pdfOptions.adaptivePagination=true,并设置 adaptivePaginationPasses=2,可自动减少跨页切断与标题悬挂。

AI 简历优化建议

  • ai.optimizeMode 支持:
    • none:不做内容与格式优化
    • format:仅优化结构与排版
    • content:仅优化文案表达
    • both:同时优化格式与内容(默认)
  • 如果你想更精细控制,也可以传:
    • ai.optimizeFormat: true|false
    • ai.optimizeContent: true|false

全局 AI 配置(界面可配置)

  • Web 界面支持“保存为全局配置”,保存后会持久化到服务端本地文件(默认:data/global-ai-config.json)。
  • 后续所有转换请求会自动合并全局配置并生效,无需每次重复填写 API Key / 模型。
  • 提供“测试模型可用性”按钮,可在导出前快速检查模型连通性与延迟。
  • 你也可以通过 API 管理:
    • GET /api/v1/settings/ai:读取全局配置(API Key 脱敏)
    • PUT /api/v1/settings/ai:更新全局配置
    • POST /api/v1/convert/ai-test:测试当前配置(或全局配置)是否可用

交互式简历内容调整

  • Web 界面新增“交互式简历调整”区域,可输入自然语言指令(如“强化项目量化成果”)并多轮迭代。
  • 每次调整会直接返回新的 HTML,可继续修改再导出 PDF/Word/Markdown。
  • 后端接口:
    • POST /api/v1/convert/ai-adjust
    • 入参:htmlContent, instruction, targetFormat, ai, history
    • 出参:htmlContent(调整后的完整 HTML)

视觉基线脚本

npm run baseline:pdf

详细说明见 scripts/README.baseline.md

🐳 Docker 部署

为了确保中文字体(如 Noto Sans SC, 文泉驿)正常显示,强烈建议使用 Docker 部署。

# 构建镜像
docker build -t polydoc:latest .

# 运行容器
docker run -d -p 3000:3000 polydoc:latest

📚 详细文档

关于样式还原等级定义、技术架构设计和详细的实现逻辑,请参阅 架构与设计文档

🤝 贡献 (Contributing)

欢迎提交 Issue 和 Pull Request!详细指南请查看 CONTRIBUTING.md

📄 许可证

本项目基于 MIT License 开源。

About

PolyDoc 是一个高性能、高保真的 HTML 文档转换服务,致力于解决业务系统中 HTML 导出为离线文档(PDF/Word/Markdown)时的痛点,如图片丢失、样式错乱和中文乱码问题。

Resources

License

Contributing

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors