前端将pdf转为图片,拿来即用

一般情况下,pdf转图片都是后端来做的,但是前端也可以实现他。通过pdfjs和一些js代码就可以轻松实现。以下是完整的实现代码。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>Convert PDF to Image</title>
  </head>
  <body>
    <form>
      <label for="pdf-url">PDF URL:</label>
      <input type="text" id="pdf-url" />
      <br />
      <label for="pdf-file">PDF File:</label>
      <input type="file" id="pdf-file" />
      <button type="submit">Convert to Image</button>
    </form>

    <canvas id="pdf-canvas"></canvas>

    <script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.11.338/pdf.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/file-saver@2.0.5/dist/FileSaver.min.js"></script>
    <script>
      const canvas = document.getElementById("pdf-canvas");
      const ctx = canvas.getContext("2d");

      const urlField = document.getElementById("pdf-url");
      const fileInput = document.getElementById("pdf-file");

      document
        .querySelector("form")
        .addEventListener("submit", function (event) {
          event.preventDefault();

          if (urlField.value.trim() !== "") {
            // 从给定 URL 加载 PDF 文件
            loadPdfFromUrl(urlField.value);
          } else if (fileInput.files.length > 0) {
            // 从上传的文件中加载 PDF 文件
            const file = fileInput.files[0];
            const reader = new FileReader();
            reader.onload = function () {
              loadPdfFromData(new Uint8Array(reader.result));
            };
            reader.readAsArrayBuffer(file);
          }
        });

      function loadPdfFromUrl(url) {
        pdfjsLib
          .getDocument(url)
          .promise.then(function (pdf) {
            // 获取PDF文件的所有页面
            const pageNumbers = Array.from(
              new Array(pdf.numPages),
              (val, index) => index + 1
            );
            return Promise.all(
              pageNumbers.map(function (num) {
                return pdf.getPage(num);
              })
            );
          })
          .then(function (pages) {
            // 渲染每一页到画布上
            const canvases = pages.map(function (page) {
              const viewport = page.getViewport({ scale: 1 });
              const canvas = document.createElement("canvas");
              canvas.width = viewport.width;
              canvas.height = viewport.height;

              return page
                .render({
                  canvasContext: canvas.getContext("2d"),
                  viewport: viewport,
                })
                .promise.then(function () {
                  return canvas;
                });
            });

            // 等待所有画布都准备好之后,将它们合并成一个大的画布
            return Promise.all(canvases).then(function (screenshots) {
              const combinedCanvas = document.createElement("canvas");
              combinedCanvas.width = Math.max(
                ...screenshots.map((shot) => shot.width)
              );
              combinedCanvas.height = screenshots.reduce(
                (sum, shot) => sum + shot.height,
                0
              );

              let yPosition = 0;
              screenshots.forEach(function (shot) {
                combinedCanvas.getContext("2d").drawImage(shot, 0, yPosition);
                yPosition += shot.height;
              });

              return combinedCanvas;
            });
          })
          .then(function (combinedCanvas) {
            // 保存为本地文件
            const filename = "combined.png";
            combinedCanvas.toBlob(function (blob) {
              saveAs(blob, filename);
            },0.88);
          })
          .catch(function (reason) {
            console.error(`Failed to load PDF: ${reason}`);
          });
      }

      function loadPdfFromData(data) {
        pdfjsLib
          .getDocument({ data: data })
          .promise.then(function (pdf) {
            // 获取PDF文件的所有页面
            const pageNumbers = Array.from(
              new Array(pdf.numPages),
              (val, index) => index + 1
            );
            return Promise.all(
              pageNumbers.map(function (num) {
                return pdf.getPage(num);
              })
            );
          })
          .then(function (pages) {
            // 渲染每一页到画布上
            const canvases = pages.map(function (page) {
              const viewport = page.getViewport({ scale: 1 });
              const canvas = document.createElement("canvas");
              canvas.width = viewport.width;
              canvas.height = viewport.height;

              return page
                .render({
                  canvasContext: canvas.getContext("2d"),
                  viewport: viewport,
                })
                .promise.then(function () {
                  return canvas;
                });
            });

            // 等待所有画布都准备好之后,将它们合并成一个大的画布
            return Promise.all(canvases).then(function (screenshots) {
              const combinedCanvas = document.createElement("canvas");
              combinedCanvas.width = Math.max(
                ...screenshots.map((shot) => shot.width)
              );
              combinedCanvas.height = screenshots.reduce(
                (sum, shot) => sum + shot.height,
                0
              );

              let yPosition = 0;
              screenshots.forEach(function (shot) {
                combinedCanvas.getContext("2d").drawImage(shot, 0, yPosition);
                yPosition += shot.height;
              });

              return combinedCanvas;
            });
          })
          .then(function (combinedCanvas) {
            // 保存为本地文件
            const filename = "combined.png";
            combinedCanvas.toBlob(function (blob) {
              saveAs(blob, filename);
            },0.88);
          })
          .catch(function (reason) {
            console.error(`Failed to load PDF: ${reason}`);
          });
      }
    </script>
  </body>
</html>

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用html2canvas和pdfmake将HTML转为PDF并下载,您可以按照以下步骤操作: 1. 首先,您需要在HTML页面中引入html2canvas和pdfmake的库文件。您可以通过以下方式在HTML文件中添加这两个库: ```html <script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/0.4.1/html2canvas.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.66/pdfmake.min.js"></script> ``` 2. 接下来,您需要创建一个按钮或触发器,以便在单击时开始转换并下载PDF。例如: ```html <button onclick="generatePDF()">Download PDF</button> ``` 3. 然后,您需要编写一个JavaScript函数来执行转换和下载操作。该函数将使用html2canvas将HTML元素转换为图像,然后使用pdfmake将这些图像添加到PDF文档中。最后,该函数将使用pdfmake下载PDF文档。以下是一个示例函数: ```javascript function generatePDF() { // 获取要转换为PDF的HTML元素 const element = document.getElementById("html-content"); // 使用html2canvas将HTML元素转换为图像 html2canvas(element).then((canvas) => { // 将图像转换为DataURL const imgData = canvas.toDataURL("image/png"); // 创建一个PDF文档对象 const docDefinition = { content: [ { image: imgData, width: 500, }, ], }; const pdfDocGenerator = pdfMake.createPdf(docDefinition); // 下载PDF文档 pdfDocGenerator.download("document.pdf"); }); } ``` 在这个示例中,我们使用了一个id为“html-content”的HTML元素,并将其转换为PNG图像。然后,我们创建了一个pdfmake文档定义对象,其中包含一个图像元素,该元素使用先前创建的DataURL。最后,我们使用pdfmake的下载方法下载PDF文档。 4. 最后,您需要确保您的HTML元素可以正确转换为图像。这意味着您需要确保该元素在屏幕上可见,并且没有被另一个元素遮盖。 通过这些步骤,您应该能够使用html2canvas和pdfmake将HTML转换为PDF并下载。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值