JS 如何将 HTML 页面导出为多页 PDF
来源:互联网 发布:miki张木易分手 知乎 编辑:程序博客网 时间:2024/06/07 19:17
前话
之前写了一篇博文 JS 如何将 HTML 页面导出为 PDF 。
当时只是自己有个需求,只是导出一页PDF,写个了示例。
之后就有同学私信我问我怎么导出多页PDF。好吧,其实这些看文档画画图自己是可以写出来的。以后也可能有转换HTML导出多页的PDF需求,就决定写一个库 renderPDF
吧。
地址在这里:https://github.com/pwcong/how-transform-html-into-multipage-pdf
原理
因为依赖了 jsPDF
这个库,所以导出 PDF 就查阅 jsPDF
的相关文档。
通过查阅文档可知,jsPDF
提供添加新一页的 API 函数 addPage()
,因此我考虑给过长的div分页就围绕它进行思考。
这里说明一下大概步骤:
首先将要导出PDF的 div (这里命名为
content
) 渲染成canvas,获取该canvas的图片url数据imgData
新建div命名为
page
插入到body
中:- 设置style、class、id均与
content
一致,然后再继续下面的步骤 设置宽度为
content
的宽度,高度设置为计算后得出的pageHeight,这里源码如下:var pdfProportion = pdfFormat[format][0] / pdfFormat[format][1]; var contentHeight = content.offsetHeight; var contentWidth = content.offsetWidth; var pageHeight = contentWidth / pdfProportion; var pageWidth = contentWidth;
其中
pdfFormat
为预定义对象,format
为输入的PDF格式- 设置其背景为
url(imgData)
- 设置style、class、id均与
接着判断contentHeight和pageHeight
若前者小于后者说明不用分页,直接添加图片数据导出,源码如下:
if(contentHeight < pageHeight){ pdf.addImage(imgData, 'JPEG', 0, 0,pdfFormat[format][0],pdfFormat[format][1]/pageHeight*contentHeight); pdf.save(pdfName); }
若前者大于后者,则需要分页:
- 先求出页数
count
,循环次数为count-1
- 设置
page
的background
偏移 - 接着渲染page为canvas获取图片url数据
pageData
插入pdf
对象中,pdf
对象执行addPage()
函数 - 添加最后一页,因为最后一页高度可能和
pageHeight
大小不一致,因此设置page
的高度为计算的得出的lastPageHeight
,渲染成canvas获取图片数据插入`pdf
中 导出保存,源码如下:
var index = 0; var count = parseInt(contentHeight / pageHeight); var page = document.createElement("div"); page.style.position = "absolute"; page.style.width = contentWidth + "px"; page.style.height = pageHeight + "px"; page.style.backgroundImage = "url(" + imgData + ")"; page.style.backgroundRepeat = "norepeat"; document.body.appendChild(page); function addPage(i, onFinished){ page.style.backgroundPositionY = -pageHeight * i + "px"; html2canvas(page, { onrendered: function(canvas) { var pageData = canvas.toDataURL('image/jpeg'); pdf.addImage(pageData, 'JPEG', 0, 0,pdfFormat[format][0],pdfFormat[format][1]); if(i + 1 < count){ pdf = pdf.addPage(); addPage(i + 1, onFinished); } else{ onFinished() } } }); } addPage(index, function(){ page.style.backgroundPositionY = -pageHeight * count + "px"; var lastPageHeight = contentHeight % pageHeight; page.style.height = lastPageHeight + "px"; html2canvas(page, { onrendered: function(canvas) { var pageData = canvas.toDataURL('image/jpeg'); pdf = pdf.addPage(); pdf.addImage(pageData, 'JPEG', 0, 0,pdfFormat[format][0], pdfFormat[format][1]/pageHeight*lastPageHeight); document.body.removeChild(page); onSuccess && onSuccess(); pdf.save(pdfName); } }); });
- 先求出页数
最后,
body
删除名为page
的div
写在后面
因为个人能力不足,这个方法在导出页数过多的PDF的时候(例如20页以上)会有明显的浏览器卡顿。
而且没有进行什么优化,导出的PDF有点模糊,这个大佬们若有解决方法可以私信哈。
还有这方法有点 dirty hack,其实最 smart hack 的方法是,直接js执行函数 window.print()
,导出的 PDF
效果也十分好,毕竟是浏览器的官方实现。
- JS 如何将 HTML 页面导出为多页 PDF
- JS 如何将 HTML 页面导出为 PDF
- 将HTML页面部分内容导出为PDF
- IE下用JavaScript将HTML导出为Word、Pdf
- CSDN博客导出(三) - 将HTML转换为PDF
- CSDN博客导出(三) - 将HTML转换为PDF
- IE下用JavaScript将HTML导出为Word、Pdf
- 利用JS将页面指定部分存为HTML页
- 如何将一个PDF文件页面进行的拆分为多个PDF文件
- 如何将头部html和尾部html转换为js,并加载到每个页面中
- 利用TCPDF将html页面转换为PDF格式
- 网站开发进阶(二十五)js如何将html表格导出为excel文件
- 网站开发进阶(三十一)js如何将html表格导出为excel文件(后记)
- Drupal7 当中如何将book导出为pdf/word
- 如何将FusionCharts图表导出为图像/PDF
- 将DataGridView导出为PDF
- 如何将ipynb转换为html,md,pdf等格式
- 如何将PDF文件页面转换为图片
- java DVD迷你管理系统
- Linux中的一个很重要的命令-vi
- android 中 shape 及 select详解
- 基于区域增长的点云分割
- 二维数组中的查找
- JS 如何将 HTML 页面导出为多页 PDF
- 复杂链表的复制
- Vue+WebPack+HBuilder 项目记录
- Ubuntu跑分
- java中的对象创建过程
- AS创建assets文件夹与字体
- java创建子线程为什么要有两种方法?
- tomcat启动startup闪退bat解决方案
- java验证手机号