当前位置:   article > 正文

vue中将html导出成pdf_vue html转pdf

vue html转pdf

vue 中将页面 html 内容导出成 pdf 文件格式,使用 html2canvas 、jspdf 。

首先使用 html2canvas 将内容转换为图片,之后写入 pdf 。

参考链接:vue页面导出pdf,预览并下载(pc端) - 简书

1、引用

  1. 第一个.将页面html转换成图片
  2. npm install --save html2canvas
  3. 第二个.将图片生成pdf
  4. npm install jspdf --save

2、创建  exportToPdf.js ,放入导出方法

  1. // exportToPdf.js
  2. import html2canvas from 'html2canvas';
  3. import jsPDF from 'jspdf';
  4. export function exportToPDF(fileName,elementId) {
  5.   // 根据元素ID获取要导出的元素
  6.   const element = document.getElementById(elementId);
  7.   if (!element) {
  8.     console.error('无法找到指定的元素');
  9.     return;
  10.   }
  11.   // 使用 html2canvas 将元素转换为 canvas
  12.   html2canvas(element).then(canvas => {
  13.     // 创建一个新的 jsPDF 实例
  14.     const pdf = new jsPDF('p''mm''a4');
  15.   // 将 canvas 转换为图片并添加到 PDF
  16.   const imgProps = canvas.toDataURL('image/png');
  17.   const imgPropsArr = imgProps.split(','), mimeType = imgPropsArr[0].match(/:(.*?);/)[1];
  18.   const img = new Image();
  19.   img.onloadfunction() {
  20.     // 获取图片的宽高
  21.     const pdfWidth = pdf.internal.pageSize.getWidth();
  22.     const pdfHeight = (img.height * pdfWidth) / img.width;
  23.     // 添加图片到 PDF
  24.     pdf.addImage(imgProps, mimeType, 0, 0, pdfWidth, pdfHeight);
  25.     // 保存 PDF
  26.     pdf.save(fileName);
  27.     //预览
  28.     /* // 生成PDF的Blob对象
  29.      const pdfBlob = pdf.output('blob');
  30.      // 创建一个指向Blob对象的URL
  31.      const pdfUrl = URL.createObjectURL(pdfBlob);
  32.      // 打开新窗口预览PDF
  33.      const win = window.open();
  34.      win.document.write(`
  35.    <html>
  36.      <head>
  37.        <title>PDF Preview</title>
  38.      </head>
  39.      <body>
  40.        <embed src="${pdfUrl}" type="application/pdf" width="100%" height="100%">
  41.      </body>
  42.    </html>
  43.  `);*/
  44.     // 你可以选择在预览后释放URL,但这会关闭预览(如果浏览器支持)
  45.     //URL.revokeObjectURL(pdfUrl);
  46.   };
  47.   img.src = imgProps;
  48. }).catch(error => {
  49.     console.error('导出PDF时发生错误:', error);
  50. });
  51. }

3、vue中调用

  1. <template>
  2.   <div style="text-align: center">
  3.     <div>
  4.       <div>
  5.         <button type="button" @click="pdfBtn">导出PDF</button>
  6.       </div>
  7.       <div id="pdfDom" >
  8.         <div>内容</div>
  9.       </div>
  10.     </div>
  11.   </div>
  12. </template>
  13. <script>
  14.   // 导入exportToPDF函数
  15.   import { exportToPDF } from '@/utils/feature/exportToPdf';
  16.     export default {
  17.       name"exportpdf",
  18.       data(){
  19.         return{
  20.           htmlTitle:'页面导出PDF文件名',
  21.         }
  22.       },
  23.       methods:{
  24.         pdfBtn(){
  25.           exportToPDF(this.htmlTitle,'pdfDom');
  26.         },
  27.       }
  28.     }
  29. </script>
  30. <style scoped>
  31. </style>

-- 更新,上面方法测试发现仅能导出一页的内容,找到了导出多页的方法

原理:获取需要导出内容页面的总高度,根据A4纸张的高度,pdf中循环添加多页,直到全部绘制结束后导出pdf。

缺点:很多地方强制截断了,看起来很别扭,而且页边距也不好控制。

  1. methods: {
  2. async exportToPDF2() {
  3. const content = document.getElementById('pdfDom');
  4. // 获取页面高度和宽度(这里需要调整以适应你的内容)
  5. const pageHeight = content.scrollHeight || content.clientHeight;
  6. const pageWidth = content.scrollWidth || content.clientWidth;
  7. // 创建一个新的 jsPDF 实例
  8. const pdf = new jsPDF('p', 'mm', 'a4'); // 'p' 代表 portrait(纵向),'mm' 代表毫米,'a4' 代表 A4 纸张大小
  9. // 定义内容的高度和宽度,以及每页的高度(这里需要调整以适应你的内容)
  10. const contentLeft = 0; // 内容左边距
  11. const contentTop = 0; // 内容上边距
  12. const contentWidth = pageWidth - 2 * contentLeft; // 内容宽度(减去左右边距)
  13. // 假设的页面尺寸和边距
  14. const pageSize = {
  15. width: 595.28, // A4 纸宽度,单位:点(1英寸 = 72点)
  16. height: 841.89 // A4 纸高度,单位:点
  17. };
  18. // 计算当前页面可以容纳的内容高度
  19. const contentHeight = pageSize.height - contentTop;
  20. const imgProps = { scale: 1 }; // 用于 html2canvas 的图像属性
  21. let position = 0; // 初始化内容在 PDF 中的位置
  22. let y = contentTop; // 初始化 PDF 页面上的 y 坐标
  23. // 循环直到所有内容都被导出
  24. while (position < pageHeight) {
  25. // 计算当前页面的内容高度(可能需要调整以确保内容不会溢出)
  26. const pageContentHeight = (y + contentHeight > pageHeight) ? pageHeight - y : contentHeight;
  27. // 使用 html2canvas 捕获当前页面的内容
  28. const canvas = await html2canvas(content, {
  29. // 你可以在这里添加更多的 html2canvas 配置选项
  30. height: pageContentHeight,
  31. width: contentWidth,
  32. x: 0,
  33. y: position,
  34. scale: 1,
  35. ...imgProps,
  36. });
  37. // 将 canvas 添加到 PDF 页面中
  38. const imgData = canvas.toDataURL('image/png');
  39. const imgPropsPDF = pdf.getImageProperties(imgData);
  40. const pdfWidth = pdf.internal.pageSize.getWidth();
  41. const pdfHeight = (imgPropsPDF.height * pdfWidth) / imgPropsPDF.width;
  42. pdf.addImage(imgData, 'PNG', pdfWidth, y+pdfHeight, pdfWidth, pdfHeight);
  43. // 更新 y 坐标以便下一页的内容
  44. y += pdfHeight + 10; // 10 是页面间的间距,可以根据需要调整
  45. // 如果内容超出了当前页面,则添加新页面
  46. if (y > pdfHeight) {
  47. if(position+contentHeight < pageHeight) {
  48. pdf.addPage();
  49. }
  50. y = contentTop;
  51. position += contentHeight; // 更新内容在原始 HTML 中的位置
  52. }
  53. }
  54. // 保存 PDF
  55. pdf.save('exported.pdf');
  56. }
  57. }

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

    闽ICP备14008679号