html生成pdf的js插件的简单使用

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>jspdf</title>
    <link href="./plugins/bootstrap-5.1.3-dist/css/bootstrap.min.css" rel="stylesheet" />
    <script src="./plugins/jquery/jquery-1.9.1.js"></script>
    <script src="./plugins/jspdf/dist/jspdf.umd.min.js"></script>
    <script src="./plugins/html2canvas.min.js"></script>
    <script src="./plugins/jspdf/msyh-normal.js"></script>
    <script src="./plugins/html2pdf.bundle.min.js"></script>
    <script src="./plugins/jsPDF-AutoTable-master/dist/jspdf.plugin.autotable.js"></script>
    <style>
      body * {
        font-family: "msyh";
        letter-spacing: 0.01px; /*解决jspdf的英文字母间隔问题  */
      }
      tr {
        height: 5rem;
      }
    </style>
  </head>
  <body style="width: 140mm">
    <div id="myExportArea">
      <div class="row m-3">
        <table border="1" style="border: 1px solid black; width: 100%" class="table table-bordered" id="table1">
          <tr class="text-center">
            <th scope="col">中文</th>
            <th scope="col">First</th>
            <th scope="col">Last</th>
            <th scope="col">Handle</th>
          </tr>
          <tr>
            <th scope="row">1</th>
            <td style="background-color: #f5da55">Mark</td>
            <td>Otto</td>
            <td>@mdo</td>
          </tr>
          <tr>
            <th scope="row">2</th>
            <td>Jacob</td>
            <td>Thornton</td>
            <td>@fat</td>
          </tr>
          <tr>
            <th scope="row">3</th>
            <td colspan="2">Larry the Bird</td>
            <td>@twitter</td>
          </tr>
        </table>
      </div>
      <div class="row m-3" id="exportArea">
        <div class="col-6">
          <div class="card">
            <img src="./images/1.jpg" class="card-img-top" />
            <div class="card-body">
              <h5 class="card-title">明天</h5>
              <p class="card-text">明天,又是新的一天。</p>
            </div>
          </div>
        </div>
        <div class="col-6">
          <div class="card">
            <img src="./images/1.jpg" class="card-img-top" />
            <div class="card-body">
              <h5 class="card-title">明天</h5>
              <p class="card-text">明天,又是新的一天。</p>
            </div>
          </div>
        </div>
      </div>
    </div>
    <div style="margin-top: 3rem">
      <button type="button" class="btn btn-primary mb-2" onclick="downloadPdf1('myExportArea')">jspdf downloadPdf</button>
      <button type="button" class="btn btn-primary mb-2" onclick="downloadPdf3('exportArea','table1')">jspdf AutoTable downloadPdf</button>
      <button type="button" class="btn btn-primary mb-2" onclick="downloadPdf2('myExportArea')">html2pdf downloadPdf</button>
      <button type="button" class="btn btn-primary mb-2" onclick="exportPdf('myExportArea')">exportPdf</button>
    </div>
  </body>
  <script>
    function downloadPdf1(domId) {
      // var doc = new jspdf.jsPDF("landscape", "pt", "a4"); // 170宽度
      var doc = new jspdf.jsPDF("portrait", "pt", "a4"); //140宽度
      doc.setFont("msyh");
      //表格样式支持较好,带有表格标签的生成多个空白页  bug尚未修复
      doc.html(document.getElementById(domId), {
        callback: function (doc) {
          var pageCount = doc.internal.getNumberOfPages();
          // for (let i = pageCount; i > 1; i--) {
          //   doc.deletePage(i);
          // }
          console.log(pageCount);
          doc.save("test.pdf"); //下载pdf
          // window.open(doc.output("bloburl"));  //预览pdf
        },
      });
    }

    function downloadPdf3(domId, domIdTable) {
      // var doc = new jspdf.jsPDF("landscape", "pt", "a4"); // 170宽度
      var doc = new jspdf.jsPDF("portrait", "pt", "a4"); //140宽度
      doc.setFont("msyh");
      //使用autotable生成表格,表格行高无法调整,部分样式不支持,不会生成多个空白页
      doc.autoTable({ html: "#" + domIdTable, styles: { font: "msyh", fontStyle: "normal" }, startY: 20, useCss: true });
      const beginY = doc.lastAutoTable.finalY;
      doc.html(document.getElementById(domId), {
        callback: function (doc) {
          var pageCount = doc.internal.getNumberOfPages();
          console.log(pageCount);
          doc.save("test.pdf"); //下载pdf
          // window.open(doc.output("bloburl"));  //预览pdf
        },
        y: beginY + 10,
      });
    }

    function downloadPdf2(domId) {
      var element = document.getElementById(domId);
      var opt = {
        margin: 1,
        filename: "myfile.pdf",
        image: { type: "jpeg", quality: 0.98 },
        html2canvas: { dpi: 192, scale: 2, letterRendering: true },
        jsPDF: { unit: "mm", format: "a4", orientation: "portrait" },
        pagebreak: { mode: "avoid-all" },
      };
      html2pdf().set(opt).from(element).save();

   }

    function exportPdf(domId) {
      html2canvas(document.getElementById(domId), { scale: 2 }).then((canvas) => {
        var contentWidth = canvas.width;
        var contentHeight = canvas.height;
        //一页pdf显示html页面生成的canvas高度;
        var pageHeight = (contentWidth / 595.28) * 841.89;
        //未生成pdf的html页面高度
        var leftHeight = contentHeight;
        //pdf页面偏移
        var position = 0;
        //a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高
        var imgWidth = 555.28;
        var imgHeight = (555.28 / contentWidth) * contentHeight;

        var pageData = canvas.toDataURL("image/jpeg", 1.0);

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

 

posted @ 2022-11-19 10:02  carol2014  阅读(620)  评论(0编辑  收藏  举报