# nodepdf **Repository Path**: rufeike/nodepdf ## Basic Information - **Project Name**: nodepdf - **Description**: 🎯 项目概述 这是一个基于 Node.js + Express + Puppeteer 的现代化 PDF 生成服务,能够将网页、HTML 内容或自定义模板快速转换为高质量的 PDF 文档。 ✨ 核心功能 1. 多源 PDF 生成 URL 转 PDF - 将任何公开网页转换为 PDF HTML 转 PDF - 直接使用 HTML 代码生成 PDF 模板转 PDF - 基于预定义模板动态生成 - **Primary Language**: NodeJS - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2025-09-08 - **Last Updated**: 2026-01-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Linux Nodejs 生成PDF ## 目录结构 ```text pdf-generator-site/ ├── 📁 src/ # 源代码目录 │ ├── 📄 app.js # Express 主应用文件 │ ├── 📁 routes/ # 路由文件目录 │ │ └── 📄 pdf.js # PDF 相关路由 │ ├── 📁 utils/ # 工具函数目录 │ │ └── 📄 pdfGenerator.js # PDF 生成核心工具类 │ └── 📁 templates/ # HTML 模板目录 │ ├── 📄 invoice.html # 发票模板 │ ├── 📄 report.html # 报告模板 │ └── 📄 contract.html # 合同模板 ├── 📁 public/ # 静态资源目录 │ ├── 📄 index.html # 前端主页面 │ ├── 📁 css/ # 样式文件目录 │ │ └── 📄 style.css # 主样式文件 │ └── 📁 js/ # JavaScript 文件目录 │ └── 📄 script.js # 前端交互脚本 ├── 📁 outputs/ # 生成的PDF文件目录(可选) │ └── 📄 .gitkeep # 保持空目录的git占位文件 ├── 📁 logs/ # 日志文件目录 │ └── 📄 .gitkeep # 保持空目录的git占位文件 ├── 📄 .env # 环境变量文件 ├── 📄 .gitignore # Git 忽略文件 ├── 📄 package.json # 项目配置和依赖 ├── 📄 README.md # 项目说明文档 └── 📄 dockerfile # Docker 容器化配置(可选) ``` ## 详细文件说明 ### 1. 配置文件 - **`.env`** - 环境变量配置 ```env PORT=3000 NODE_ENV=development PDF_TIMEOUT=30000 ALLOWED_DOMAINS=* ``` - **`.gitignore`** - Git 忽略规则 ```gitignore node_modules/ outputs/*.pdf logs/*.log .env .DS_Store *.tmp ``` - **`package.json`** - 项目配置 ```json { "name": "pdf-generator-site", "version": "1.0.0", "description": "Express + Puppeteer PDF生成服务,支持远程URL", "main": "src/app.js", "scripts": { "start": "node src/app.js", "dev": "nodemon src/app.js", "test": "jest", "docker:build": "docker build -t pdf-generator .", "docker:run": "docker run -p 3000:3000 pdf-generator" }, "dependencies": { "express": "^4.18.2", "puppeteer": "^21.5.2", "cors": "^2.8.5", "dotenv": "^16.3.1", "helmet": "^7.1.0", "morgan": "^1.10.0" }, "devDependencies": { "nodemon": "^3.0.1", "jest": "^29.7.0" } } ``` ### 2. 创建目录结构的命令 ```bash # 创建项目根目录 mkdir pdf-generator-site cd pdf-generator-site # 创建主要目录 mkdir -p src/routes src/utils src/templates public/css public/js outputs logs # 创建主要文件 touch src/app.js touch src/routes/pdf.js touch src/utils/pdfGenerator.js touch src/templates/invoice.html touch src/templates/report.html touch src/templates/contract.html touch public/index.html touch public/css/style.css touch public/js/script.js touch .env .gitignore README.md # 创建git占位文件 touch outputs/.gitkeep logs/.gitkeep # 初始化项目 npm init -y ``` ### 3. 完整的项目树状结构 ```bash pdf-generator-site/ ├── 📦 Node.js 项目文件 │ ├── 📄 package.json │ ├── 📄 package-lock.json │ └── 📁 node_modules/ ├── 🔧 源代码 │ └── 📁 src/ │ ├── 📄 app.js # Express应用入口 │ ├── 📁 routes/ # API路由 │ │ └── 📄 pdf.js # PDF生成路由 │ ├── 📁 utils/ # 工具类 │ │ └── 📄 pdfGenerator.js # PDF生成核心逻辑 │ └── 📁 templates/ # PDF模板 │ ├── 📄 invoice.html # 发票模板 │ ├── 📄 report.html # 报告模板 │ └── 📄 contract.html # 合同模板 ├── 🌐 前端资源 │ └── 📁 public/ │ ├── 📄 index.html # 前端页面 │ ├── 📁 css/ │ │ └── 📄 style.css # 样式文件 │ └── 📁 js/ │ └── 📄 script.js # 前端脚本 ├── 📁 outputs/ # PDF输出目录 │ └── 📄 .gitkeep # Git占位文件 ├── 📁 logs/ # 日志目录 │ └── 📄 .gitkeep # Git占位文件 ├── ⚙️ 配置文件 │ ├── 📄 .env # 环境变量 │ ├── 📄 .gitignore # Git忽略规则 │ └── 📄 dockerfile # Docker配置 └── 📄 README.md # 项目说明文档 ``` ## 安装Nodejs ### 方法一:使用 NodeSource 安装(推荐) ```bash # 安装 curl(如果尚未安装) apt install curl # 添加 NodeSource 仓库(Node.js 18.x 版本) curl -fsSL https://deb.nodesource.com/setup_18.x | bash - # 安装 Node.js apt install nodejs # 验证安装 node -v npm -v ``` ### 方法二:使用 nvm(Node版本管理器) ```bash # 安装 nvm curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash # 重新加载 bash 配置 source ~/.bashrc # 安装 Node.js nvm install 18 # 安装 Node.js 18 LTS nvm use 18 # 验证 node -v npm -v ``` ## 安装第三方扩展 ### 安装google 浏览器 #### 检查系统是否安装了浏览器 ```bash which chromium || which chromium-browser || which google-chrome # 查看浏览器版本 chromium --version || chromium-browser --version # 如果没安装,安装Chromium apt update apt install -y chromium ``` ### 安装第三方工具 ```bash # 进入项目目录 cd pdf-generator-site # 安装生产依赖 npm install express puppeteer cors dotenv helmet morgan # 安装开发依赖 npm install --save-dev nodemon jest # 或者一次性安装所有依赖 npm install express puppeteer cors dotenv helmet morgan nodemon jest --save ``` ### 解决字体问题 建议安装以下扩展 ```bash apt install -y fonts-wqy-microhei fonts-wqy-zenhei xfonts-wqy ``` ## 启动项目的命令 ```bash # 开发模式(使用nodemon热重载) npm run dev # 生产模式 npm start # 测试模式 npm test ``` ## 外部访问 ```curl http://localhost:3000 ``` ### 页面访问 ![image-20250908132049067](.\image-20250908132049067.png) ### curl 访问示例 ```bash # 最小边距 curl -X POST http://localhost:3000/api/pdf/generate \ -H "Content-Type: application/json" \ -d '{ "url": "https://example.com", "margin": { "top": "5mm", "right": "5mm", "bottom": "5mm", "left": "5mm" } }' # 无边距 curl -X POST http://localhost:3000/api/pdf/generate \ -H "Content-Type: application/json" \ -d '{ "url": "https://example.com", "margin": { "top": "0mm", "right": "0mm", "bottom": "0mm", "left": "0mm" } }' # 使用预设 curl -X POST http://localhost:3000/api/pdf/generate \ -H "Content-Type: application/json" \ -d '{ "url": "https://example.com", "marginPreset": "print" }' ``` ### 前端调用 ```javascript // 在前端代码中添加边距控制 function generateWithMargin(marginType) { const margins = { 'none': { top: '0mm', right: '0mm', bottom: '0mm', left: '0mm' }, 'small': { top: '5mm', right: '5mm', bottom: '5mm', left: '5mm' }, 'medium': { top: '10mm', right: '10mm', bottom: '10mm', left: '10mm' }, 'large': { top: '20mm', right: '20mm', bottom: '20mm', left: '20mm' } }; const margin = margins[marginType] || margins.medium; fetch('/api/pdf/generate', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ url: document.getElementById('url-input').value, margin: margin }) }); } ``` ### 支持css边距(在 HTML 模板中添加 CSS 边距控制) ```html gi
``` ### 常用的边距配置(推荐边距设置) ```javascript // 商务文档 const businessMargin = { top: '15mm', right: '15mm', bottom: '15mm', left: '25mm' }; // 学术论文 const academicMargin = { top: '25mm', right: '25mm', bottom: '25mm', left: '30mm' }; // 演示文稿 const presentationMargin = { top: '0mm', right: '0mm', bottom: '0mm', left: '0mm' }; // 书籍排版 const bookMargin = { top: '20mm', right: '20mm', bottom: '25mm', left: '30mm' }; ```