当前位置: 首页 > 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 可能会更加简单和高效。

相关文章:

导出pdf Puppeteer 和 wkhtmltopdf区别

您可以使用第三方的 PDF 生成库来将动态页面导出为 PDF 文件。目前比较常见的是使用 Headless Chrome 或 Puppeteer 这类工具将页面转换为 PDF 文件&#xff0c;具体步骤如下&#xff1a; 安装 Headless Chrome 或 Puppeteer。 使用框架调用后端接口获取数据&#xff0c;渲染出…...

sequelize + Nodejs + MySQL 的简单用法

How to Use Sequelize ORM in NodeJS - Tutorial 1 Sequlize 简介 Sequelize 是最流行的可以与 Nodejs 一起使用的一种关系数据库 ORM (Object-relational mapping 对象关系映射)&#xff0c;Mongoose 是 MongoDB 的 ORM. Sequelize 的作用&#xff0c;简单地说&#xff0c;就…...

Android Jetpack - Navigation 组件:进行应用程序导航

一. Navigation 组件的介绍 1.1 什么是 Navigation 组件 Navigation 组件是一种 Android Jetpack 库&#xff0c;它可以帮助开发者轻松地实现应用程序中的导航功能。导航组件包含多个类和组件&#xff0c;包括导航图、目的地、导航控制器等&#xff0c;可以帮助我们管理应用程…...

MySQL的binlog原理和它的几种使用方法

MySQL中的二进制日志&#xff08;binlog&#xff09;是一种用于记录数据库操作的日志文件&#xff0c;它可以记录MySQL服务器接收到的所有修改数据库的语句&#xff0c;例如INSERT、UPDATE和DELETE等语句。二进制日志对于备份和恢复数据库、复制数据库和进行数据分析等操作非常…...

40岁以上的程序员还容易找到工作吗?聊聊我自己的亲身经历

今天我们来讨论一个比较热门的话题&#xff0c;那就是程序员。如果到了40岁以上还容易找到工作吗&#xff1f;这个问题呢&#xff0c;其实是一个非常现实的问题&#xff0c;也是我们程序员非常关心的一个问题。因为我们每一个程序员&#xff0c;他都会有到40岁的那一天。 首先…...

Class类

package com.hspedu.reflection.class_;import com.hspedu.Cat;import java.util.ArrayList;/*** author 韩顺平* version 1.0* 对Class类特点的梳理*/ public class Class01 {public static void main(String[] args) throws ClassNotFoundException {//看看Class类图//1. Cla…...

Python小姿势 - 可选知识点:

可选知识点&#xff1a; 列表推导式 列表和字典推导式 字典推导式 生成器表达式 带条件的生成器表达式 解析XML 解析JSON 使用Requests和BeautifulSoup爬虫 Python并发编程 Python多线程编程 Python多进程编程 Python异步编程 Python装饰器 Python闭包 Python模块化 Python类和…...

Javaee Spring的AOP简介

一.Spring的AOP简介 1.1 什么是AOP AOP 为 Aspect Oriented Programming 的缩写&#xff0c;意思为面向切面编程&#xff0c;是通过预编译方式和运行期动态代 理实现程序功能的统一维护的一种技术。AOP 是 OOP 的延续&#xff0c;是软件开发中的一个热点&#xff0c;也是…...

基于ansible初始化linux服务器基础环境。

大家好&#xff0c;今天我要和大家分享一个关于搭建centos环境的新方法。 以前我们经常会看到一些文章介绍如何搭建centos环境&#xff0c;但很多时候都会出现一些问题。不过现在有了一种新的方法&#xff0c;就是使用ansible脚本来实现。 虽然这种方法仅适用于centos7&#…...

leetcode-数据库题

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 175. 组合两个表176. 第二高的薪水177. 第N高的薪水178. 分数排名181. 超过经理收入的员工182. 查找重复的电子邮箱183. 从不订购的客户 175. 组合两个表 select p…...

[元来学NVMe协议] NVMe IO 指令集(NVM 指令集)| Flush 命令

声明 主页:元存储的博客_CSDN博客 依公开知识及经验整理,如有误请留言。 个人辛苦整理,付费内容,禁止转载。 内容摘要 前言 NVMe2.0 定义的三类命令集: 管理命令集、IO命令集、Fabrics命令集 Admin Command Set (管理命令集):用于控制器的管理,如创建/销毁IO提交队列…...

信息的相关性和冗余度:信息在整个文明中的作用

文章目录 I 古埃及的象形文字1.1 罗塞塔石碑1.2 古埃及文字音节和希腊字母的对应表1.3 破解古埃及文字 I 古埃及的象形文字 1.1 罗塞塔石碑 这个石碑是在公元前196年埃及国王托勒密五世加冕一周年的诏书。 在此前大约一百年&#xff0c;埃及已经被来自希腊北方城邦的亚历山大…...

python数据结构与算法-动态规划(最长公共子序列)

一、最长公共子序列问题 1、问题概念 一个序列的子序列是在该序列中删去若干元素后得 到的序列。 例如&#xff1a;"ABCD”和“BDF”都是“ABCDEFG”的子序列。 最长公共子序列(LCS) 问题: 给定两个序列X和Y&#xff0c;求X和Y长度最大的公共子字列。 例:X"ABBCBDE”…...

Java版企业电子招投标系统源码 Spring Cloud+Spring Boot 电子招标采购系统功能清单

一、立项管理 1、招标立项申请 功能点&#xff1a;招标类项目立项申请入口&#xff0c;用户可以保存为草稿&#xff0c;提交。 2、非招标立项申请 功能点&#xff1a;非招标立项申请入口、用户可以保存为草稿、提交。 3、采购立项列表 功能点&#xff1a;对草稿进行编辑&#x…...

【c语言】函数的基本概念 | 函数堆栈调用原理

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 给大家跳段街舞感谢支持&#xff01;ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ…...

Vue.prototype 详解及使用

前言&#xff1a; 我们可能会在很多组件里用到数据/实用工具&#xff0c;但是不想污染全局作用域。这种情况下&#xff0c;可以通过在原型上定义它们使其在每个 Vue 的实例中可用。 1. 基本示例 在main.js中添加一个变量到 Vue.prototype Vue.prototype.$appName My App这…...

音视频八股文(3)--ffmpeg常见命令(2)

07-ffplay命令播放媒体 播放本地文件 播放本地 MP4 视频文件 test.mp4 的命令&#xff0c;从第 2 秒位置开始播放&#xff0c;播放时长为 10 秒&#xff0c;并且在窗口标题中显示 “test time”&#xff1a; ffplay -window_title "test time" -ss 2 -t 10 -autoe…...

使用bert4keras出现的问题(Process finished with exit code -1073741819 (0xC0000005))

1、环境 python 3.7.12 tensorflow 1.15 keras 2.3.1 bert4keras 0.9.7 protobuf 3.19.0 numpy 1.16.5 2、出现问题 numpy版本不兼容问题所以你就直接按照我的版本就可以了&#xff08;numpy 1.16.5&#xff09; Process finished with exit code -1073741819 (0xC0000005) …...

python协程实战

协程简介 协程(Coroutine)又称微线程、纤程&#xff0c;协程不是进程或线程&#xff0c;其执行过程类似于 Python 函数调用&#xff0c;Python 的 asyncio 模块实现的异步IO编程框架中&#xff0c;协程是对使用 async 关键字定义的异步函数的调用; 一个进程包含多个线程,类似…...

【论文笔记】VideoGPT: Video Generation using VQ-VAE and Transformers

论文标题&#xff1a;VideoGPT: Video Generation using VQ-VAE and Transformers 论文代码&#xff1a;https://wilson1yan. github.io/videogpt/index.html. 论文链接&#xff1a;https://arxiv.org/abs/2104.10157 发表时间&#xff1a; 2021年9月 Abstract 作者提出了…...

TikTok广告账号被封怎么解决?2026年防封号完整攻略

做TikTok广告投放&#xff0c;最让人头疼的事情是什么&#xff1f;账号被封。前一秒还在跑量&#xff0c;后一秒突然提示账号异常&#xff0c;所有广告计划全部暂停&#xff0c;预算打水漂&#xff0c;客户推广计划全乱。这种经历&#xff0c;做过TikTok广告投放的卖家应该都不…...

【Midjourney新拟态风格实战指南】:20年AI视觉专家亲授7大参数调优公式与3类商业级提示词模板

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Midjourney新拟态风格的视觉本质与演进逻辑 新拟态&#xff08;Neumorphism&#xff09;并非Midjourney原生支持的术语&#xff0c;而是社区在v6及Niji Mode迭代中通过提示词工程与风格迁移机制催生出的…...

GraphRAG生态全景:6大主流方案盘点

在大模型应用加速落地的过程中&#xff0c;RAG已经成为企业构建智能知识库、智能问答系统和行业大模型应用的重要技术路线。但随着场景从简单文档问答进入复杂业务推理&#xff0c;传统RAG的能力边界正在逐渐显现。尤其是在公安、海关、保险、电力、军事等行业中&#xff0c;企…...

使用Coze制作一个可以“动”的存钱罐,比记账APP更易用

可视化、AI驱动、自动提醒才是你智能存钱的伙伴──────────────────────────────为什么你的存钱计划总是失败&#xff1f;大多数人的存钱失败&#xff0c;并不是由于缺乏决心&#xff0c;而是缺少反馈。存多少钱、目标达成的比例、离目标还有多远…...

STM32 USB开发避坑指南:手把手教你读懂并配置端点描述符(附完整代码)

STM32 USB开发避坑指南&#xff1a;手把手教你读懂并配置端点描述符&#xff08;附完整代码&#xff09; 在嵌入式开发领域&#xff0c;USB通信一直是让工程师又爱又恨的技术。爱它的通用性和高速传输能力&#xff0c;恨它那晦涩难懂的协议栈和层出不穷的配置问题。特别是当项目…...

超越UNO:手把手教你为ESP8266和AVR单片机配置任意GPIO中断(附端口变化中断PCINT实战)

突破硬件限制&#xff1a;ESP8266与AVR单片机全引脚中断配置实战指南 在嵌入式开发中&#xff0c;中断处理是提升系统响应效率的核心技术。传统Arduino UNO仅提供2个专用外部中断引脚&#xff08;D2和D3&#xff09;&#xff0c;当项目需要同时监控多个传感器或按钮时&#xff…...

随机森林在精准农业中的落地实践:地理空间建模与田间部署

1. 项目概述&#xff1a;当随机森林遇上农田里的厘米级变量在华北平原某农场的冬小麦田里&#xff0c;我第一次用随机森林模型预测氮肥施用量时&#xff0c;手里的无人机刚飞完第三圈&#xff0c;地面传感器网络正把土壤电导率、含水量、温度的实时数据推送到边缘计算节点。这不…...

交易所技术三重门:吞吐量、安全性与合规性的不可能三角破解之道

引言&#xff1a;交易所战争进入3.0时代 当Coinbase市值突破千亿美元&#xff0c;当Binance单日交易量超越纳斯达克&#xff0c;当Uniswap用AMM机制改写交易规则——数字货币交易所已从边缘实验进化为金融基础设施的核心。在这场价值万亿美元的军备竞赛中&#xff0c;技术架构的…...

Hello-Agents 第二部分-第九章总结:上下文工程

作者&#xff1a;逆境不可逃 技术永无止境 希望我的内容可以帮助到你&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 大家吼 ! 我是 逆境不可逃 今天给大家带来文章《Hello-Agents 第二部分-第九章总结&#xff1a;上下文工程》. Hello-Agents 官方地址:data…...

数采网关的应用与特点

摘要在工业自动化、智能制造和物联网&#xff08;IoT&#xff09;快速发展的背景下&#xff0c;数据采集网关&#xff08;数采网关&#xff09;作为连接现场设备与上层管理系统的关键枢纽&#xff0c;发挥着至关重要的作用。它能够实现工业设备数据的实时采集、协议转换、边缘计…...