本库致力于 html 在线导出为 pdf,实现智能分页效果,不会切断文本图片表格等内容,可兼容手机端。本库依赖 html2canvas 和 jspdf,使用 canvas 绘图,请保证使用浏览器对以上库是支持的。
# 使用npm
npm i -S @wk-tools/html-to-pdf
# 使用yarn
yarn add @wk-tools/html-to-pdf
// ...
import HtmlToPdf from '@wk-tools/html-to-pdf'
function exportPDF() {
Loading.show()
const element = document.getElementById('pdf-container')
const htmlToPdf = new HtmlToPdf(element, {
name: '葵花宝典',
})
htmlToPdf
.save()
.catch(() => {
Message.error('下载失败')
})
.finally(() => {
Loading.hide()
})
}
属性 | 类型 | 说明 |
---|---|---|
$el | HTMLElement | PDF DOM 元素 |
jsPdf | JsPdf | JsPdf 实例 |
pdfWidth | number | PDF 单页宽度 |
pdfHeight | number | PDF 单页高度 |
options | PdfOptions | PDF 配置 |
plugins | PluginWrap | 插件列表 |
createVirtualWrap | (element: Node | Element, width: number) => HTMLDivElement | 创建虚拟 DOM,并设定宽度 |
createCanvas | (width: number, height: number) => HTMLCanvasElement | 创建 虚拟 canvas 元素 |
loadImage | (url: string) => Promise | 加载图片,并返回 image 元素 |
waitForImagesLoaded | (element: Element) => Promise | 等待图片加载完成,并针对图片设置通用样式 |
resetBaseStyle | (element: Element) => void | 重置元素样式,默认针对 h1-h6 的 margin 样式设置 |
getPageImages | Promise | 获取生成 PDF 的页面图片 |
addPageImage | (image: string) => void | 将图片加入 PDF 页面管理中,将会作为 PDF 页面导出 |
preview | () => void | 预览生成的 PDF 内容 |
save | () => Promise | 生成 PDF |
use | user(plugin: PdfPlugin, pluginOptions?: T) => void | 注册插件 |
注意:resetBaseStyle 与 waitForImagesLoaded 包含的重制样式,是因为 html2canvas 在导出图片时,某些样式会与 DOM 元素不一致,故要增加特定样式以达到所见即所得。若是遇到页面所见与导出不一致,请着重思考样式问题。
参数 | 类型 | 必填项 | 默认 | 说明 |
---|---|---|---|---|
name | string | 否 | -- | 导出文件名称 |
monoblockClassName | string | string[] | 否 | 'html-pdf-monoblock' | 分页处理时,将元素内容当作一个整体 |
backgroundColor | string | 否 | #fff | PDF 背景颜色 |
scale | number | 否 | 2 | 导出内容放大倍数,增加内容清晰度,必须大于 0 |
margin | number | number[] | 否 | 10 | PDF 内容边距 |
ignoreElement | (element: Element) => Element[] | 否 | -- | 分页计算忽略的元素 |
resetStyleTags | string[] | 否 | -- | 需要重置样式的标签,目前只发现 h1-h6 标签在 html2canvas 中默认增加了 margin 值 |
header | HeaderOrFooterOptions | 否 | -- | 页眉参数 |
footer | HeaderOrFooterOptions | 否 | -- | 页脚参数 |
adaptive | boolean | 否 | true | 是否开启自适应,开启自适应会根据设置宽度导出 PDF |
adaptiveOptions | AdaptiveOptions | 否 | -- | 自适应导出 PDF 配置 |
jsPDFOptions | jsPDFOptions | 否 | { unit: "px", format: "a4" } | jsPDF 插件配置,单位仅支持 px |
html2CanvasOptions | html2CanvasOptions | 否 | { scale: PdfOptions.scale ,logging: false,useCORS: true,width: element.width} | html2canvas 插件配置 |
参数 | 类型 | 必填项 | 默认 | 说明 |
---|---|---|---|---|
image | string | 否 | -- | 页眉页脚图片地址 |
imageWidth | number | 否 | -- | 页眉页脚图片绘制宽度 |
imageHeight | number | 否 | -- | 页眉页脚图片绘制高度 |
text | string | 否 | -- | 页眉页脚文案内容 |
fontSize | number | 否 | -- | 页眉页脚文案字体大小 |
fontFamily | string | 否 | -- | 页眉页脚文案字体 |
align | "left" | "center" | "right" | 否 | -- | 页眉页脚文案对齐方式 |
color | string | 否 | -- | 页眉页脚文案颜色 |
参数 | 类型 | 必填项 | 默认 | 说明 |
---|---|---|---|---|
pdfWidth | number | 否 | 800 | 按此宽度绘制导出 PDF 内容 |
parentElement | HTMLElement | 否 | document.body | 自适应创建元素挂载节点,必要时可以规避一些样式问题 |
resetView | (element: Element) => void | 否 | -- | 自适应模式下,是克隆的元素,导致 canvas 无法展示,对内容重新绘制 |
resetViewDelay | number | 否 | 1000 | 图表重绘后,延迟处理导出,给图表绘制预留充足的时间 |
为了方便扩展基础功能,PDF 生成增加了插件机制。插件有 beforeDraw、draw、afterDraw 三个钩子,通过钩子可以增加 PDF 页面,或者在 PDF 页面中增加自定义内容(页眉页脚)。本工具内置了页眉页脚插件,并开放了封面、封底插件,用于用户参考使用。若是有目录或水印需求,可通过插件实现。
方法 | 类型 | 说明 |
---|---|---|
beforeDraw | Function | PDF 绘制前的钩子,可用于封面的绘制 |
draw | Function | PDF 单页面绘制的钩子,可用于绘制水印等自定义内容 |
afterDraw | Function | PDF 绘制后的钩子,可用于绘制封底 |
参数 | 类型 | 必填项 | 默认 | 说明 |
---|---|---|---|---|
pageMargin | PageMargin | 是 | -- | PDF 绘制的边距(上下左右) |
widthRatio | number | 是 | -- | 绘制的 canvas 与 pdf 尺寸 - 转化宽度比 |
y | number | 是 | -- | 绘制 canvase 的 y 轴坐标 |
canvasWidth | number | 是 | -- | 单页 canvas 的宽度 |
canvasHeight | number | 是 | -- | 单页 canvas 的高度 |
contentWidth | number | 是 | -- | 单页内容的宽度,去除左右边距 |
contentHeight | number | 是 | -- | 单页内容的高度,去除上下边距 |
page | number | 是 | -- | 当前页码 |
totalPage | number | 是 | -- | 总页码 |
参数 | 类型 | 必填项 | 默认 | 说明 |
---|---|---|---|---|
cover | CoverOptions | 否 | -- | 封面参数 |
backcover | CoverOptions | 否 | -- | 封底参数 |
参数 | 类型 | 必填项 | 默认 | 说明 |
---|---|---|---|---|
backgroundColor | string | 否 | #fff | 背景颜色 |
image | string | 否 | -- | 背景图片 |
fit | "fill" | "contain" | "cover" | "none" | 否 | -- | 图片填充方式 |
text | string | 否 | -- | 封面/底 文案内容 |
fontSize | number | 否 | 32 | 文案字体大小 |
fontWeight | string | number | 否 | 'bold' | 文案字体粗细 |
fontFamily | string | 否 | "微软雅黑" | 文案字体 |
color | string | 否 | -- | 文案颜色 |
element | HTMLElement | 否 | -- | 封面/底 DOM 元素,将转化成图片 |
elementFit | "fill" | "contain" | "cover" | "none" | 否 | -- | 封面/底 DOM 元素填充方式 |
MIT