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

导出pdf Puppeteer 和 wkhtmltopdf区别

您可以使用第三方的 PDF 生成库来将动态页面导出为 PDF 文件。目前比较常见的是使用 Headless Chrome 或 Puppeteer 这类工具将页面转换为 PDF 文件,具体步骤如下:

  1. 安装 Headless Chrome 或 Puppeteer。

  2. 使用框架调用后端接口获取数据,渲染出动态页面。

  3. 使用 Headless Chrome/Puppeteer 在后台渲染该动态页面,并将其保存为 PDF 文件。

使用 Headless Chrome/Puppeteer 的好处是可以保留页面的动态效果,并且可以通过 API 调用来自动化地生成 PDF 文件。另外,通过优化 PDF 导出设置,可以实现更快的生成速度和更小的文件大小。

以下是一个使用 Puppeteer 来生成 PDF 文件的示例代码:

const puppeteer = require('puppeteer');async function exportPdf(url, outputFile) {const browser = await puppeteer.launch(); // 打开 Headless Chrome 浏览器const page = await browser.newPage(); // 使用 Puppeteer 打开指定的页面await page.goto(url, {waitUntil: 'networkidle2'});// 设置导出 PDF 的页边距、页码、水印等属性await page.pdf({path: outputFile,format: 'A4',margin: {top: '1cm', bottom: '1cm', left: '1cm', right: '1cm'},displayHeaderFooter: true,headerTemplate: '<span></span>',footerTemplate: '<span></span>',printBackground: true,preferCSSPageSize: true,});await browser.close(); // 关闭浏览器
}// 使用示例:导出百度首页为 PDF 文件
exportPdf('https://www.baidu.com', 'baidu.pdf').then(() => console.log('PDF 文件已生成')).catch((err) => console.error('PDF 文件导出失败:', err));

上述代码中,我们使用 Puppeteer 打开了百度首页,并设置了导出 PDF 文件的页边距、页码、水印等属性,最后将其保存为 baidu.pdf 文件。需要注意的是,由于 Puppeteer 在后台模拟浏览器操作,因此在生成 PDF 文件时可能会占用较大的 CPU 和内存资源,需要考虑系统的性能和容量限制。

Puppeteer 和 wkhtmltopdf 都可用于将 HTML 页面转换为 PDF 文件的工具,二者有以下区别:

  1. 技术实现方式:Puppeteer 基于 Chrome/Chromium 的 Headless 模式实现,而 wkhtmltopdf 采用 WebKit 渲染引擎实现。

  2. 文字渲染效果:Puppeteer 的字体渲染效果比 wkhtmltopdf 更好,字体更加清晰且渲染速度更快。

  3. 性能:Puppeteer 加载页面的性能相对较低,但是由于采用 Chrome/Chromium 的 Headless 模式,因此可以准确地模拟浏览器操作(如点击事件、滚动操作等),比 wkhtmltopdf 能够更好地处理 JavaScript 和复杂的 CSS。

  4. 安装和使用的难易程度:由于 Puppeteer 是基于 Node.js 的框架,因此安装和使用相对来说更加简便,而 wkhtmltopdf 需要安装并配置运行环境。

综上所述,如果您需要对动态页面进行较为精细的设置和交互操作(如填写表单、选择下拉框等),那么建议使用 Puppeteer ;如果您仅仅是需要将 HTML 页面转换为 PDF 文件,并且不需要复杂的排版和样式设置,那么使用 wkhtmltopdf 可能会更加简单和高效。

http://www.lryc.cn/news/62132.html

相关文章:

  • sequelize + Nodejs + MySQL 的简单用法
  • Android Jetpack - Navigation 组件:进行应用程序导航
  • MySQL的binlog原理和它的几种使用方法
  • 40岁以上的程序员还容易找到工作吗?聊聊我自己的亲身经历
  • Class类
  • Python小姿势 - 可选知识点:
  • Javaee Spring的AOP简介
  • 基于ansible初始化linux服务器基础环境。
  • leetcode-数据库题
  • [元来学NVMe协议] NVMe IO 指令集(NVM 指令集)| Flush 命令
  • 信息的相关性和冗余度:信息在整个文明中的作用
  • python数据结构与算法-动态规划(最长公共子序列)
  • Java版企业电子招投标系统源码 Spring Cloud+Spring Boot 电子招标采购系统功能清单
  • 【c语言】函数的基本概念 | 函数堆栈调用原理
  • Vue.prototype 详解及使用
  • 音视频八股文(3)--ffmpeg常见命令(2)
  • 使用bert4keras出现的问题(Process finished with exit code -1073741819 (0xC0000005))
  • python协程实战
  • 【论文笔记】VideoGPT: Video Generation using VQ-VAE and Transformers
  • scala之基础面向对象
  • Qt5.12实战之多线程编程概念
  • 格式化数据恢复怎么做?超实用的3种方法在这!
  • 【Java|golang】1105. 填充书架---动态规划
  • linux基础命令
  • 【三十天精通Vue 3】 第十八天 Vue 3的国际化详解
  • 02 - 学会提问
  • Java经典的Main方法面试题
  • 世界大学电子电气工程TOP10,国内大学哪家强?
  • 5.3 牛顿-科茨公式
  • 全注解下的SpringIoc 续2-bean的生命周期