wkhtmltopdf如何使用
- 前端开发
- 2025-08-14
- 1
wkhtmltopdf 输入.html 输出.pdf
,可添加
--page-size A4
等
以下是关于 wkhtmltopdf 的详细使用指南,涵盖安装、基础操作、高级功能及常见问题解决方案:
核心概念与适用场景
wkhtmltopdf
是一款开源的命令行工具,基于 WebKit 引擎实现 HTML→PDF 的高质量转换,其核心优势在于:
完美还原复杂 CSS 布局(含浮动、定位、弹性盒子等)
支持 JavaScript 动态渲染(需配合 --javascript-delay
)
可自定义页眉/页脚、页码、目录(TOC)
跨平台兼容(Linux/macOS/Windows)
典型应用场景包括:自动生成电子发票、报告文档、简历模板、网页快照存档等。
安装与环境配置
根据系统选择安装方式
操作系统 | 安装命令 | 备注 |
---|---|---|
Ubuntu/Debian | sudo apt install wkhtmltopdf |
依赖库自动关联 |
CentOS/RHEL | sudo yum install wkhtmltopdf |
需启用 EPEL 源 |
macOS (Homebrew) | brew install wkhtmltopdf |
推荐最新版 |
Windows | 下载地址:https://wkhtmltopdf.org/downloads.html | 选择对应架构的 .exe 文件 |
验证安装成功
终端执行:wkhtmltopdf --version
正常输出应包含版本号(如 12.6
)及编译日期。
基础命令行语法详解
️ 核心参数表
参数 | 作用 | 示例值 |
---|---|---|
input |
输入文件(HTML/URL) | report.html |
output |
输出 PDF 路径 | output.pdf |
--page-size |
纸张尺寸 | A4 , Letter |
--margin-top |
上边距(单位:mm/in/cm/px) | 10mm |
--orientation |
横向/纵向 | landscape |
--header-center |
页眉中央内容 | “机密文件 [page]” |
--footer-right |
页脚右侧内容 | “[page]/[topage]” |
--enable-local-file-access |
允许加载本地资源(安全限制解除) | 无 |
基础示例
# 单文件转换(默认A4纵向) wkhtmltopdf chapter1.html output.pdf # 带页眉页脚+横向布局 wkhtmltopdf --orientation landscape --header-center "年度报告" --footer-right "第[page]页/共[topage]页" report.html final_report.pdf
高级功能实践
精准控制页面样式
问题:图片被截断或表格换行异常?
解决方案:通过 CSS 媒体查询强制关键元素不换行:
@media print { table { page-break-inside: avoid !important; } img { max-width: 100% !important; height: auto !important; } }
动态内容渲染优化
若页面依赖 AJAX 加载数据,需增加等待时间:
wkhtmltopdf --javascript-delay 1000 # 延迟1秒等待JS执行完毕 dashboard.html analytics.pdf
自动生成目录(Table of Contents)
要求 HTML 中存在带 ID 的标题标签(h1-h6),命令如下:
wkhtmltopdf --toc --toc-depth 3 # 生成三级目录 manual.html user_guide.pdf
生成的目录将位于 PDF 起始位置,点击可跳转至对应章节。
背景图与透明背景处理
- 添加背景图:在 HTML body 设置
background-image: url('bg.jpg')
- 透明背景:添加 CSS
body { background: transparent !important; }
并禁用默认背景色。
典型错误排查手册
现象 | 原因分析 | 解决方案 |
---|---|---|
图片显示为空白/红叉 | 未正确引用图片路径 | 改用绝对路径或 Base64 编码内联 |
中文乱码 | 缺少中文字体支持 | 嵌入字体文件(见下文) |
分页位置不合理 | CSS 未禁止关键元素分页 | 添加 page-break-inside: avoid |
超链接失效 | 未启用网络访问权限 | 添加 --enable-local-file-access |
页码编号错误 | TOC 解析失败 | 标签有唯一 ID |
中文字体嵌入方案
创建 @font-face
规则指向 TTF/OTF 文件:
@font-face { font-family: 'SimSun'; src: url('simsun.ttf') format('truetype'); } body { font-family: 'SimSun', sans-serif; }
并将字体文件放在与 HTML 同目录下。
编程集成示例(Python)
import subprocess def html_to_pdf(input_file, output_file): cmd = [ 'wkhtmltopdf', '--quiet', # 静默模式(不输出日志) '--encoding utf8', # 防止中文乱码 input_file, output_file ] subprocess.run(cmd, check=True) # 调用示例 html_to_pdf('data/invoice.html', 'output/invoice.pdf')
相关问答(FAQs)
Q1: 为什么生成的 PDF 中图片显示不全?
A: 常见原因及解决方法:
1️⃣ 路径问题:HTML 中使用相对路径的图片在 PDF 中可能无法找到,建议改为绝对路径或 Base64 编码。
2️⃣ 尺寸溢出:图片原始尺寸超过页面可用区域,可通过 CSS 设置 max-width: 100%; height: auto;
自适应。
3️⃣ 异步加载延迟:若图片通过懒加载(lazyload)实现,需增加 --javascript-delay
参数给予足够加载时间。
Q2: 如何在 PDF 中实现每页重复的公司LOGO水印?
A: 使用 --header-html
参数指定一个包含LOGO的HTML片段:
wkhtmltopdf --header-html header.html --footer-center "©202X XX公司" contract.html signed_contract.pdf
header.html
内容示例:
<div style="text-align: center;"> <img src="logo.png" alt="公司LOGO" style="height: 30px;"> </div>
此方法可实现每页顶部固定位置显示LOGO。
通过以上步骤,您已掌握 wkhtmltopdf
的核心功能与实战技巧,如需进一步定制,建议阅读官方文档(https://wkhtmltopdf.org/usage.html)获取完整