当前位置: 首页 > article >正文

3 分钟学会使用 Puppeteer 将 HTML 转 PDF

需求背景

1、网页存档与文档管理

需要将网页内容长期保存或归档为PDF,确保内容不被篡改或丢失,适用于法律文档、合同、技术文档等场景。PDF格式便于存储和检索。

2、电子报告生成

动态生成的HTML内容(如数据分析报告、仪表盘)需导出为PDF供下载或打印。PDF保留排版和样式,确保跨平台一致性。

3、电子邮件与营销材料

将HTML格式的新闻稿、促销内容转换为PDF附件发送,避免收件人因邮件客户端差异导致样式错乱。

4、学术与出版用途

论文、技术文档需从HTML转为PDF以满足出版要求。PDF支持高精度打印,且兼容学术平台的提交格式。

5、合同与表单签署

在线填写的HTML表单(如申请表格、订单)需转为PDF供客户签署或存档。PDF支持数字签名和加密。

方案一、wkhtmltopdf + python

https://wkhtmltopdf.org/

wkhtmltopdf 是一个开源命令行工具,通过 WebKit 渲染引擎将 HTML 内容转换为 PDF 文件。支持 CSS、JavaScript 和复杂的页面布局,常用于生成报告、发票、电子文档等场景。

不推荐,实测效果不佳,2020已停止维护。

在这里插入图片描述

到官网下载对应操作系统的安装包,这里是 Ubuntu24,安装指令如下:

sudo apt-get install xfonts-75dpi
sudo dpkg -i wkhtmltox_0.12.6.1-2.jammy_amd64.deb 

在这里插入图片描述

在这里插入图片描述

安装完成之后就可以使用命令转PDF了,例如把谷歌首页转PDF,也可以转本地html文件。

# 使用示例
wkhtmltopdf http://google.com google.pdf

在这里插入图片描述

在这里插入图片描述

方案二、Puppeteer

https://github.com/puppeteer/puppeteer

Puppeteer是一个由Google Chrome团队开发的Node.js库,提供高级API通过DevTools协议控制无头(Headless)或非无头的Chromium或Chrome浏览器。它常用于自动化测试、网页抓取、生成PDF或截图等场景。

推荐方案,效果最佳,高度还原浏览器打印效果

pnpm install puppeteer-core# which google-chrome
/usr/bin/google-chrome

该方案需要安装谷歌浏览器,可以通过 which 指令查看已安装的 google-chrome 路径,使用示例如下:

// main.js
const puppeteer = require('puppeteer-core');
const fs = require('fs');
const path = require('path');// 自动检测 Chrome 安装路径(支持 Linux/Windows)
const CHROME_PATHS = ['/usr/bin/google-chrome',      // Debian/Ubuntu 默认路径'/opt/google/chrome/chrome',   // 二进制实际位置'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe'
];(async () => {try {// 自动查找可用浏览器路径const executablePath = CHROME_PATHS.find(p => fs.existsSync(p));if (!executablePath) throw new Error('未找到 Chrome 浏览器');const browser = await puppeteer.launch({headless: 'new',          // 启用新一代无头模式executablePath,args: ['--no-sandbox','--disable-setuid-sandbox','--disable-dev-shm-usage','--font-render-hinting=medium' // 提升中文字体渲染质量]});const page = await browser.newPage();
http://www.lryc.cn/news/2393436.html

相关文章:

  • 速通《Sklearn 与 TensorFlow 机器学习实用指南》
  • Ubuntu 下搭建ESP32 ESP-IDF开发环境,并在windows下用VSCode通过SSH登录Ubuntu开发ESP32应用
  • [FreeRTOS- 野火] - - - 临界段
  • 【洛谷P9303题解】AC代码- [CCC 2023 J5] CCC Word Hunt
  • NodeMediaEdge接入NodeMediaServer
  • 【Java基础-环境搭建-创建项目】IntelliJ IDEA创建Java项目的详细步骤
  • WebSocket指数避让与重连机制
  • DrissionPage WebPage模式:动态交互与高效爬取的完美平衡术
  • adb查看、设置cpu相关信息
  • PHP7+MySQL5.6 查立得源码授权系统DNS验证版
  • 68元开发板,开启智能硬件新篇章——明远智睿SSD2351深度解析
  • 【QQ音乐】sign签名| data参数加密 | AES-GCM加密 | webpack (下)
  • 基于netmiko模块实现支持SSH or Telnet的多线程多厂商网络设备自动化巡检脚本
  • 不用 apt 的解决方案(从源码手动安装 PortAudio)
  • 【前端】JS引擎 v.s. 正则表达式引擎
  • 开发体育平台,怎么接入最合适的数据接口
  • 3D虚拟工厂
  • http传输协议的加密
  • 半导体晶圆制造洁净厂房的微振控制方案-江苏泊苏系统集成有限公司
  • 嵌入式(1):STM32 GPIO与AFIO深度解析:从原理到高阶应用实战
  • Netty 实战篇:Netty RPC 框架整合 Spring Boot,迈向工程化
  • QML视图组件ListView、TableView、GridView介绍
  • 常见压缩算法性能和压缩率对比 LZ4 LZO ZSTD SNAPPY
  • Spring Boot 应用中实现配置文件敏感信息加密解密方案
  • 【TTS】基于GRPO的流匹配文本到语音改进:F5R-TTS
  • 动态规划-152.乘积最大子数组-力扣(LeetCode)
  • 1-1 初探Dart编程语言
  • 搭建最新版开源监控平台SigNoz踩的坑
  • Ubuntu 服务器配置与 Cloudflare Tunnel 部署指南 免费内网穿透家用服务器
  • 无人机多人协同控制技术解析