当前位置:   article > 正文

vue使用html2canvas结合jsPDF实现前端页面转pdf功能,支持分页_vue+jspdf+html2canvas实战操作

vue+jspdf+html2canvas实战操作

简单的记录一下再vue中使用html2canvas结合jsPDF实现对页面转pdf功能的实现,主要是通过html2canvas将页面转化为高清的图片,后在进行导出pdf,话不多说,直接上代码

注意:如果使用的是uniapp的话,需要将div替换成view,以下代码可直接使用

第一步:通过npm安装html2canvas和jsPDF

  1. npm install --save htmlcanvas2
  2. npm install --save jspdf

第二步:则是在需要的页面引入后,通过$refs获取需要转成pdf容器的dom元素 ,通过html2canvas将页面转化为高清图片后在通过jsPDF导出为pdf文件(以下代码复制可直接使用)

  1. <template>
  2. <div>
  3. <div @click="print" class="btn">转PDF</div>
  4. <div ref="box" class="box">
  5. <div class="item" v-for="item in data">{{item.title}}</div>
  6. </div>
  7. </div>
  8. </template>
  9. <script>
  10. import html2canvas from 'html2canvas'
  11. import jsPDF from 'jspdf'
  12. export default {
  13. data() {
  14. return {
  15. data: [{
  16. title: '这是第一页',
  17. }, {
  18. title: '这是第二页',
  19. }]
  20. }
  21. },
  22. components: {
  23. },
  24. methods: {
  25. async print() {
  26. const el = this.$refs.box.$el
  27. html2canvas(el, {
  28. logging: false,
  29. background: '#fff',
  30. allowTaint: true,
  31. taintTest: false,
  32. height: el.scrollHeight,
  33. width: el.scrollWidth,
  34. useCORS: true, //允许canvas画布内可以跨域请求外部链接图片, 允许跨域请求。
  35. dpi: 300, // 提升导出的文件的分辨率
  36. scale: 5
  37. }).then(canvas => {
  38. var canvasWidth = canvas.width; //图片容器宽度
  39. var canvasHeight = canvas.height; //图片容器高度
  40. let pagesHeight = '' //页面高度
  41. let leftHeight = canvasHeight //未生成pdf的高度
  42. var position = 0 //页面偏移
  43. var imgWidth = 0
  44. var imgHeight = 0
  45. pagesHeight = canvasWidth / 592.28 * 841.89
  46. imgWidth = 592.28;
  47. imgHeight = 592.28 / canvasWidth * canvasHeight;
  48. var pdf = new jsPDF('', 'pt', 'a4', true);
  49. var pageData = canvas.toDataURL('image/jpeg', 1.0);
  50. //有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)
  51. //当内容未超过pdf一页显示的范围,无需分页
  52. if (leftHeight < pagesHeight) {
  53. pdf.addImage(pageData, 'JPEG', 0, 0, imgWidth, imgHeight, '', 'FAST')
  54. } else {
  55. while (leftHeight > 0) {
  56. pdf.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight, '',
  57. 'FAST')
  58. leftHeight -= pagesHeight;
  59. position -= 841.89;
  60. //避免添加空白页
  61. if (leftHeight > 0) {
  62. pdf.addPage();
  63. }
  64. }
  65. }
  66. pdf.save('1')
  67. //此处为保存到本地的pdf操作,如果需要上传到服务器的话,则在这个位置加入第三步代码替换pdf.save('1')
  68. })
  69. },
  70. }
  71. }
  72. </script>
  73. <style>
  74. .btn {
  75. height: 50px;
  76. display: flex;
  77. align-items: center;
  78. justify-content: center;
  79. background-color: palegreen;
  80. }
  81. .box {
  82. background-color: paleturquoise;
  83. font-size: 18px;
  84. font-weight: 700;
  85. width: 592px;
  86. }
  87. .box .item {
  88. height: 841px;
  89. }
  90. </style>

第三步:以上代码只能简单的实现转pdf后下载到本地,如果需要实现通过后端接口上传到服务器的话, 则需要转base64后通过转文件流的形式调用后端接口上传到服务器

①将此处代码替换第二步中的pdf.save('1')

  1. let base64 = pdf.output("datauristring")
  2. let file = this.convertBase64ToFile(base64, '转pdf的文件名称')

②以下方法为将pdf转化为file文件流代码

  1. // base64转文件
  2. convertBase64ToFile(urlData, filename) {
  3. var arr = urlData.split('base64,');
  4. var type = arr[0].match(/:(.*?);/)[1];
  5. var fileExt = type.split('/')[1];
  6. var bstr = atob(arr[1]);
  7. var n = bstr.length;
  8. var u8arr = new Uint8Array(n);
  9. while (n--) {
  10. u8arr[n] = bstr.charCodeAt(n);
  11. }
  12. return new File([u8arr], filename + "." + fileExt, {
  13. type: type
  14. });
  15. },

 第四步:可以结合element中的upLoad实现上传,以下实例为使用uniapp中的uni.uploadFile()实现文件的上传

①uniapp中的uni.uploadFile()实现文件的上传

  1. uni.uploadFile({
  2. url: 'xxxx', //上传地址
  3. file: file, //文件对应第三步中的let file = this.convertBase64ToFile(base64, '转pdf的文件名称')
  4. name: 'file',
  5. formData: {
  6. id: '123456',
  7. }, //其他参数
  8. success: () => {
  9. } //成功后的回调
  10. })

②其他上传实现可参考element组件或者原生请求方式(后续有时间再进行更新)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/880346
推荐阅读
相关标签
  

闽ICP备14008679号