Skip to content

动态生成PDF全能解决方案

📥 下载渠道

下载地址

B站视频演示

📌 核心特性

  • 完全免费 - 零成本部署使用
  • 多场景支持 - 报告生成/网页存档/合同输出等
  • 动态渲染 - 支持执行HTML中的JavaScript

🛠️ 技术架构

组件用途说明
Node.js服务端运行环境
pkg打包为单文件可执行程序
puppeteer-core通过本地Chrome实现HTML转PDF
sqlite3本地运行数据存储

🎯 功能说明

HTML转PDF支持

  • 多种输入方式:文件/URL/原始字符串
  • 专业排版控制:
    • 自定义页面尺寸(A4/A3/Legal等)
    • 页眉页脚模板定制
    • 打印样式优化
    • 智能边距设置

🚀 部署支持

环境要求说明
Windows解压即用EXE,需安装Chrome浏览器
Linux单文件可执行程序,需安装google-chrome
Docker容器化部署,docker-compose一键启动

⚙️ 性能优化

  • 浏览器池管理 - 使用generic-pool实现:
    • 实例复用(最大512次/实例)
    • 智能资源回收(空闲30分钟自动释放)
    • 动态扩容(1-10个实例自动调节)

📄 application.yml配置文件说明

位置说明

  • 本地部署:放置于可执行文件同级目录
  • Docker部署:通过volumes挂载
yaml
# 运行端口 默认 port: 15676,
port: 15676

# 认证配置
public: false # 是否开放访问,为true不校验token身份
username:     # 系统账户 启动时打印在控制台,不设置则为系统默认值
password:     # 系统密码 启动时打印在控制台,不设置则为系统默认值

# 会员信息
email:
appid:  

# 浏览器路径配置
windowsChromePath: C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe
linuxChromePath: /usr/bin/google-chrome

# 浏览器池配置
puppeteerBrowserPool:
  # 默认10 最大浏览器实例数
  max: 10
  # 默认1 最小浏览器实例数	
  min: 1
  # 默认512 每一个浏览器实例 最大可重用次数,超过后将重启实例。0表示不检验
  maxUses: 512
  # 默认true 初始化时初始化实例
  autostart: true
  # 默认1800000 指定资源在连接池中保持空闲状态的最大时间(单位:毫秒)。如果资源在池中空闲的时间超过此值,它将被销毁并从池中移除。
  idleTimeoutMillis: 1800000
  # 默认300000 指定驱逐线程运行的时间间隔(单位:毫秒)。驱逐线程会定期检查池中资源,销毁空闲时间超过 idleTimeoutMillis 的资源。
  evictionRunIntervalMillis: 300000

🐳 Docker快速启动

bash
docker-compose up -d

接口文档

在调用接口时需要在请求头中添加authorization请求头,值为获取token接口返回的token,有效期为7天

获取token

请求方式: POST

请求地址: /sys_auth/token

参数说明:

请求body中发送json

username和password为系统用户名和密码

可在application.yml中配置

如果不配置,则username,password为默认值,在启动时打印到控制台

参数是否必须说明
username系统用户名
password系统用户密码

请求示例:

json
{
  "username": "admin",
  "password": "password"
}

html文件转pdf

请求方式: POST

请求地址: /html2pdf/file

参数说明: 使用multipart/form-data POST上传文件, 文件标识名为"file"

url参数中支持以下参数

margin参数特殊处理 /html2pdf/file?top=10mm&left=10mm&right=10mm&bottom=10mm

html字符串转pdf

请求方式: POST

请求地址: /html2pdf/str

参数说明: 请求body中发送json

参数是否必须说明
htmlhtml字符串
pdfOptions查看

请求示例:

json
{
  "html": "<!DOCTYPE html><html><body><h1>html文本转pdf</h1></body></html>",
  "pdfOptions": {
    "displayHeaderFooter": false,
    "format": "A4",
    "printBackground": true,
    "preferCSSPageSize": true,
    "margin": {
      "top": "10mm",
      "bottom": "10mm",
      "left": "10mm",
      "right": "10mm"
    }
  }
}

html网页url转pdf

请求方式: POST

请求地址: /html2pdf/url

参数说明: 请求body中发送json

参数是否必须说明
url有效html网页链接
cachePage是否使用浏览器缓存,默认使用
pdfOptions查看

请求示例:

json
{
  "url": "https://www.baidu.com/",
  "cachePage": true,
  "pdfOptions": {
    "displayHeaderFooter": false,
    "format": "A4",
    "printBackground": true,
    "preferCSSPageSize": true,
    "margin": {
      "top": "10mm",
      "bottom": "10mm",
      "left": "10mm",
      "right": "10mm"
    }
  }
}

备注

TIP

默认pdfOptions

puppeteer文档

js
const defaultPagePdfOptions = {
   displayHeaderFooter: false,
   headerTemplate: undefined,
   footerTemplate: undefined,
   format: 'A4',
   printBackground: true,
   preferCSSPageSize: true,
   margin: {
      top: '10mm',
      bottom: '10mm',
      left: '10mm',
      right: '10mm'
   }
}

📬 联系我们

技术支持邮箱: 1472912024@qq.com

/src/technology/dateblog/2025/05/20250518-%E6%88%91%E7%94%A8node%E5%8A%A0puppeteer%E6%9E%84%E5%BB%BA%E4%BA%86%E4%B8%80%E4%B8%AA%E7%9A%84html%E8%BD%ACpdf%E4%B8%AD%E9%97%B4%E4%BB%B6.html