乐趣区

html保存为PDF

PDF 保存

原理 html 转 canvas 再转 pdf
以下是 React 中使用,改成 VUE 使用原理也差不多

第三方库

yarn add html2canvas jspdf

代码

直接调用 handlePDF 方法即可下载。

import html2Canvas from "html2canvas";
import * as jsPDF from "jspdf";

 
handlePDF = () => {
   // 获取需要打印的 Dom 节点
  const pdfDom = document.getElementsByClassName("pdf")[0];
  html2Canvas(pdfDom, {
    windowWidth: pdfDom.scrollWidth,
    windowHeight: pdfDom.scrollHeight + 200,
    height: pdfDom.scrollHeight + 200,
    // 截屏起止位置 scrollX、scrollY
    scrollY: 0,
    // 放大两倍,防止模糊
    scale: 2
  }).then(canvas => {
    var contentWidth = canvas.width;
    var contentHeight = canvas.height;
    var pageHeight = (contentWidth / 592.28) * 841.89;
    var leftHeight = contentHeight;
    // 页面偏移
    var position = 0;
    //a4 纸的尺寸[595.28,841.89],html 页面生成的 canvas 在 pdf 中图片的宽高
    var imgWidth = 595.28;
    var imgHeight = (595.28 / contentWidth) * contentHeight;

    var pageData = canvas.toDataURL("image/jpeg", 1.0);
    var pdf = new jsPDF("","pt","a4");

    // 有两个高度需要区分,一个是 html 页面的实际高度,和生成 pdf 的页面高度(841.89)
    // 当内容未超过 pdf 一页显示的范围,无需分页
    if (leftHeight < pageHeight) {pdf.addImage(pageData, "JPEG", 20, 40, imgWidth, imgHeight);
    } else {while (leftHeight > 0) {pdf.addImage(pageData, "JPEG", 20, position + 40, imgWidth, imgHeight);
        leftHeight -= pageHeight;
        position -= 841.89;
        // 避免添加空白页
        if (leftHeight > 0) {pdf.addPage();
        }
      }
    }
    pdf.save(` 方案配置.pdf`);
  });
};

代码基于 html2Canvas + jspdf 实现下载 pdf 功能修改,原代码无法截屏外内容。

退出移动版