news 2026/8/23 20:57:20

html-pdf-chrome CreateOptions 5分钟配好

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
html-pdf-chrome CreateOptions 5分钟配好

html-pdf-chrome CreateOptions 5分钟配好

【免费下载链接】html-pdf-chromeHTML to PDF or image (jpeg, png, webp) converter via Chrome/Chromium项目地址: https://gitcode.com/gh_mirrors/ht/html-pdf-chrome

html-pdf-chrome 让 Chrome 直接渲染 HTML,吐出 PDF 或图片。整套配置就收在一个 CreateOptions 对象里。输出和你浏览器里看到的一致。

它比 wkhtmltopdf 强的地方在 CSS3 和 JS 支持完整,不会出现渲染偏差。比 puppeteer 轻,不背大框架,还能直接挂到一个常驻的 Chrome 上复用。

🚀 如何复用 Chrome 实例

接法只有两条路,二选一。

第一条,连常驻 Chrome。你自己把 Chrome 拉起来,打开调试端口,Node 连上去。每次生成 PDF 都不用重启浏览器,最快。官方也推荐这么做。

第二条,自动拉起。不传 host 和 port,库自己用 chrome-launcher 起一个 Chrome,用完就杀掉。省事但慢,高频场景别用。

用 pm2 把常驻 Chrome 拉起来,崩了能自动重启:

pm2 start google-chrome \ --interpreter none \ -- \ --headless --disable-gpu \ --hide-scrollbars \ --remote-debugging-port=9222

代码里写port: 9222就连上它。走自动拉起的话,改传chromePathchromeFlags,指定二进制和启动参数。

📐 printOptions 常用 8 个字段怎么调

printOptions 原样透传给 Chrome 的 printToPDF。不用全设,最常调的是下面 8 个。

字段类型作用踩坑提示
landscapebooleanfalse 竖版,true 横版横版时记得和纸张宽高一起换
printBackgroundboolean印不印背景色和图片默认 false,彩色表头想显示就得开
marginTop/Bottom/Left/Rightnumber四边边距,单位英寸开页眉页脚时上下边距得大于 0
paperWidth/paperHeightnumber纸张尺寸,单位英寸默认美版 Letter;A4 是 8.27×11.69
scalenumber内容缩放,0.1 到 2内容被裁就调小
displayHeaderFooterboolean渲不渲染页眉页脚不开的话模板写了也白写
headerTemplate/footerTemplatestring页眉页脚的 HTML可用 pageNumber、totalPages 占位
pageRangesstring页码范围,如 "1-5"不写就打印全部页

页眉页脚模板用得多,看一段就懂:

const options: htmlPdf.CreateOptions = { port: 9222, printOptions: { displayHeaderFooter: true, headerTemplate: '<div class="title">月度报表</div>', footerTemplate: '<div>第 <span class="pageNumber"></span> 页 / ' + '<span class="totalPages"></span> 页</div>', marginTop: 0.5, marginBottom: 0.5, }, };

占位类名写好,Chrome 自动填页码。模板里想放图片,得 base64 内联,外链加载不出来。

📱 截图想截手机效果就改哪三个数

传了 screenshotOptions,输出就是图片;不传就是 PDF。

screenshotOptions: { format: 'png', // png、jpeg 或 webp quality: 85, // 只对 jpeg 生效 clip: { x: 0, y: 0, width: 800, height: 600 }, // 裁剪区域 }, deviceMetrics: { width: 375, // 手机逻辑宽 height: 667, // 逻辑高 deviceScaleFactor: 2, // 2 倍清晰 mobile: true, },

deviceMetrics 管视口。要手机效果就盯住widthheightdeviceScaleFactor这三个数。前两个填手机逻辑分辨率,最后一个给 2 或 3,图才够锐。顺手把mobile设 true,让 Chrome 模拟移动端的 UA。

⏱️ 什么时候再转:五种 completionTrigger

页面打开后别急着转,等内容好了再动。completionTrigger 五种,挑一个:

触发方式适合什么页面超时怎么给
Timer不知道等什么,就等固定时长参数是毫秒:new CompletionTrigger.Timer(3000)
Element数据回来后才渲染的内容,SPA第二个参数:new CompletionTrigger.Element('#app', 5000)
Event页面会主动派发自定义事件第三个参数:new CompletionTrigger.Event('rendered', '#chart', 5000)
LifecycleEvent等网络或绘制信号稳定第二个参数:new CompletionTrigger.LifecycleEvent('networkIdle', 5000)
Variable你自己控制变量,完成后置 true第二个参数:new CompletionTrigger.Variable('pageReady', 5000)

静态页用networkIdle就够。SPA 建议用Element等关键元素出现。超时比实际加载时间略大一点,外层timeout再做一道兜底。

🔧 端到端:报表 PDF 和移动截图

带鉴权的报表 PDF,靠请求头带 token:

import * as htmlPdf from 'html-pdf-chrome'; async function monthlyReport() { const options: htmlPdf.CreateOptions = { port: 9222, extraHTTPHeaders: { Authorization: 'Bearer report-token' }, printOptions: { landscape: true, printBackground: true, marginTop: 0.5, marginBottom: 0.5, }, completionTrigger: new htmlPdf.CompletionTrigger.Timer(2000), timeout: 60000, }; const html = '<h1>月度报表</h1><p>数据……</p>'; const pdf = await htmlPdf.create(html, options); await pdf.toFile('monthly-report.pdf'); }

移动端整页截图,还是改 deviceMetrics 那三个数:

import * as htmlPdf from 'html-pdf-chrome'; async function mobileShot() { const options: htmlPdf.CreateOptions = { port: 9222, screenshotOptions: { format: 'png' }, deviceMetrics: { width: 375, height: 667, deviceScaleFactor: 2, mobile: true, }, completionTrigger: new htmlPdf.CompletionTrigger.LifecycleEvent('networkIdle'), }; const img = await htmlPdf.create('https://example.com/mobile', options); await img.toFile('mobile.png'); }

结果用 toFile 落盘,也能用 toBase64、toBuffer、toStream 转成别的形态。

🚨 五个翻车现场

连不上 9222 端口,报 Connection refused。确认 Chrome 是用--remote-debugging-port=9222起的,代码里的 port 要一致。

中文和 emoji 变方块。HTML 没声明字符集。补上<meta charset="UTF-8">,并确认服务器装有中文字体。

页面没加载完就转了,图是空的或内容残缺。把默认等待换成networkIdle,或改用Element等关键元素。

内存一直涨,常驻 Chrome 越跑越肥。用 pm2 定时重启,或开启clearCache: true

headful 下字体缺失,可见模式里部分字变方块。装上 fonts-noto-cjk 之类的字体包再试。

完整字段含义以源码为准,类型定义在 CreateOptions.ts,用法示例见 README.md。

配置心法:五句话

优先连常驻 Chrome,别每次都重启。 超时给得比加载时间大一点,留余量。 completionTrigger 跟页面类型走,别傻等。 挂上 console 处理器,先看到报错。 字符集写死 UTF-8,少踩乱码坑。

【免费下载链接】html-pdf-chromeHTML to PDF or image (jpeg, png, webp) converter via Chrome/Chromium项目地址: https://gitcode.com/gh_mirrors/ht/html-pdf-chrome

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/22 18:27:59

TikTok Shop采集工具:异常自愈+全链路日志,7x24稳定运行不靠运气

TikTok Shop采集工具&#xff1a;异常自愈全链路日志&#xff0c;7x24稳定运行不靠运气 电商自动化圈子里流传一句话&#xff1a;TikTok Shop的批量抓取采集&#xff0c;是店群运营中最耗人力也最容易出错的环节。 采集竞品数据是店群运营的命脉。但各大平台的反爬系统越来越…

作者头像 李华
网站建设 2026/8/22 18:21:15

写给后端开发者的性能调优实用清单

你整天盯着慢查询日志&#xff0c;把索引建了又删&#xff0c;连接池调成天大的数字&#xff0c;却发现系统还是像老牛拉破车。别急着甩锅给数据库&#xff0c;后端性能调优的第一性原理&#xff0c;是找到真正被浪费的时间&#xff0c;而不是凭感觉优化那些听起来唬人的指标。…

作者头像 李华
网站建设 2026/8/22 18:18:36

从国赛到美赛:数学建模竞赛实战指南与思维升级

1. 项目概述&#xff1a;一条充满挑战与收获的建模旅程大家好&#xff0c;我是老张&#xff0c;一个在数学建模这条路上摸爬滚打了多年的“老油条”。今天想和大家聊聊我的建模经历&#xff0c;从最初懵懂地参加全国大学生数学建模竞赛&#xff08;国赛&#xff09;拿到二等奖&…

作者头像 李华
网站建设 2026/8/23 19:37:35

蓝速会议预约屏:零成本融入现有办公生态的对接方案

很多企业在推进智慧办公升级时&#xff0c;往往在硬件采购阶段信心满满&#xff0c;却在系统落地环节遭遇“滑铁卢”。最常见的情况是&#xff1a;新买的会议门牌屏幕很亮、功能很炫&#xff0c;但就是连不上公司正在用的钉钉或企业微信&#xff0c;甚至因为无法对接自研的 OA …

作者头像 李华
网站建设 2026/8/22 18:16:13

接口测试面试核心考点与实战技巧解析

1. 接口测试面试核心考点解析作为软件测试领域的关键环节&#xff0c;接口测试在质量保障体系中扮演着重要角色。根据近三年行业招聘数据显示&#xff0c;接口测试相关岗位的面试通过率仅为38%&#xff0c;远低于功能测试岗位的52%。这个数据背后反映的是企业对接口测试工程师在…

作者头像 李华