# ConvertHtmlToPdfDemo **Repository Path**: zhaoyuanhai66/convert-html-to-pdf-demo ## Basic Information - **Project Name**: ConvertHtmlToPdfDemo - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-01-22 - **Last Updated**: 2026-01-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # WebApplication1 - PDF 生成服务 基于 ASP.NET Core 8.0 和 PuppeteerSharp 的 HTML/URL 转 PDF 服务。 ## 功能特性 - ✅ HTML 内容转 PDF - ✅ URL 网页转 PDF - ✅ Docker 容器化部署 - ✅ 支持中文字符 - ✅ Swagger API 文档 ## API 接口 ### 1. 测试接口 ``` GET /api/pdf/test ``` 生成一个示例 PDF 文件用于测试。 ### 2. HTML 转 PDF ``` POST /api/pdf/html-to-pdf Content-Type: application/json { "html": "..." } ``` ### 3. URL 转 PDF ``` POST /api/pdf/url-to-pdf Content-Type: application/json { "url": "https://www.example.com" } ``` ## 本地运行 ```bash cd WebApplication1/WebApplication1 dotnet restore dotnet run ``` 访问 Swagger UI: `http://localhost:5000/swagger` ## Docker 部署 ### 方法 1: 使用 Docker Compose(推荐) ```bash cd WebApplication1 docker-compose up -d ``` 查看日志: ```bash docker-compose logs -f ``` 停止服务: ```bash docker-compose down ``` ### 方法 2: 使用 Docker 命令 ```bash cd WebApplication1 # 构建镜像 docker build -t webapplication1 -f WebApplication1/Dockerfile . # 运行容器 docker run -d -p 8080:8080 \ -e PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium \ -e PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true \ --name pdf-service webapplication1 # 查看日志 docker logs -f pdf-service ``` ### 方法 3: 使用 Windows 脚本 ```bash # 重新构建并运行 rebuild-docker.cmd # 测试 API test-api.cmd ``` **注意:** 容器会自动使用系统安装的 Chromium,无需手动下载。 ### 测试 ```bash # 测试接口 curl http://localhost:8080/api/pdf/test --output test.pdf # HTML 转 PDF curl -X POST http://localhost:8080/api/pdf/html-to-pdf \ -H "Content-Type: application/json" \ -d '{"html":"

Hello PDF

"}' \ --output output.pdf ``` ## 技术说明 ### PuppeteerSharp 配置 - 容器环境:使用系统安装的 Chromium(通过 apt 安装) - 本地开发:自动下载 Chromium - 使用 Headless Chrome 进行渲染 - 通过环境变量 `PUPPETEER_EXECUTABLE_PATH` 指定 Chromium 路径 ### Docker 优化 - 直接安装 Chromium 及其完整依赖库(包括 libglib2.0) - 使用单进程模式(`--single-process`)适配容器环境 - 禁用沙箱(`--no-sandbox`)以支持非特权容器 - 禁用 GPU 加速以减少资源占用 - 禁用 /dev/shm 使用,避免容器内存限制问题 - 添加了中文字体支持(fonts-noto-cjk) ### 关键 Chromium 启动参数 - `--no-sandbox`: 禁用沙箱(容器环境必需) - `--disable-setuid-sandbox`: 禁用 setuid 沙箱 - `--disable-dev-shm-usage`: 不使用 /dev/shm(避免容器内存限制) - `--single-process`: 单进程模式(容器环境推荐) - `--no-zygote`: 禁用 zygote 进程 - `--no-first-run`: 跳过首次运行任务 ### 关键依赖库 - libglib2.0-0:GLib 核心库 - libxshmfence1:X11 共享内存 - fonts-noto-cjk:中日韩字体支持 - chromium:完整的 Chromium 浏览器 ## 注意事项 1. 容器环境会自动使用系统 Chromium,无需下载 2. 本地开发首次启动时会下载 Chromium,可能需要几分钟 3. 确保容器有足够的内存(建议至少 512MB) 4. 生成大型 PDF 时可能需要较长时间 5. URL 转 PDF 需要容器能访问目标网站 ## 依赖项 - .NET 8.0 - PuppeteerSharp 20.2.5 - Swashbuckle.AspNetCore 6.6.2