searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

前端实现将 HTML 转换为 PDF

2024-03-06 06:13:33
155
0

在网页开发中,有时我们需要将网页内容转换为 PDF 格式,以供用户保存或打印。在将 HTML 内容转换为 PDF 时,有多种方法可供选择,其中包括使用 Puppeteer、pdfmake 和 html2canvas + jspdf。本文将对如何使用 html2canvas 和 jspdf 来将 HTML 内容转换为可下载和打印的 PDF 文件进行简介。

一、html2canvas + jspdf简单使用

1、安装

npm install --save html2canvas
npm install --save jspdf

2、绘制较短页面

convertToPDF() {
        const html2pdf = (element, fullPage) => {
          html2canvas(element, {
            scale: 2,
            scrollX: 0,
            scrollY: 0
          }).then((canvas) => {
            const imgData = canvas.toDataURL('image/png')
            const pdfWidth = fullPage ? canvas.width : element.clientWidth * 1.5
            const pdfHeight = fullPage ? canvas.height : element.clientHeight * 1.5
            const pdf = new jsPDF({
              orientation: fullPage ? 'landscape' : 'portrait', // 调整是否打印整页
              unit: 'px',
              format: [pdfWidth, pdfHeight]
            })
            pdf.addImage(imgData, 'PNG', 0, 0, pdfWidth, pdfHeight)
            pdf.save('pdf文件名.pdf')
          })
        }

        const fullPageElement = document.body
        const partialPageElement = document.getElementById('your-page-id') // 需要打印的页面id
        html2pdf(fullPageElement, true)
        html2pdf(partialPageElement, false)
      }

3、绘制长页面(.html2canvas能够抓取的页面长度有限,超出不会抓取,需要分页抓取并合并到一个 PDF 文件中。)

长度超过时提示:

A page in a PDF can not be wider or taller than 14400 userUnit. jsPDF limits the width/height to 14400

解决方案:分页

convertToPDF() {
        const html2pdf = (element) => {
          html2canvas(element, { scrollY: 0 }).then((canvas) => {
            const pdf = new jspdf('p', 'mm', 'a4')
            const imgData = canvas.toDataURL('image/jpeg', 1.0)
            const pdfWidth = pdf.internal.pageSize.getWidth()
            const pdfHeight = pdf.internal.pageSize.getHeight()
            const imgHeight = (canvas.height * pdfWidth) / canvas.width

            let heightLeft = imgHeight
            let position = 0

            while (heightLeft > 0) {
              pdf.addImage(imgData, 'JPEG', 0, position, pdfWidth, imgHeight)
              heightLeft -= pdfHeight
              position -= pdfHeight
              if (heightLeft > 0) {
                pdf.addPage()
              }
            }

            pdf.save('pdf文件名.pdf')
          })
        }

        const fullPageElement = document.getElementById('your-page-id') // 需要打印的页面id
        html2pdf(fullPageElement)
      }

二、总结

优点

  • 简单易用:html2canvas 和 jspdf 提供了直观的 API,可使页面内容转为 PDF 变得十分简单。
  • 灵活性:html2canvas 允许捕获整个页面或特定的 DOM 元素,而 jspdf 允许自定义生成的 PDF 文件的布局和样式。
  • 快速实现:使用这种方法,可以快速实现将页面内容转换为 PDF 的功能,并在客户端直接生成和下载 PDF 文件。

缺点

  • 局限性:在处理复杂布局和样式时,html2canvas 可能会出现一些限制,导致生成的 PDF 内容和页面显示的效果不尽相同。
  • 大量数据处理:对于包含大量数据或需要更复杂布局的情况,可能需要编写大量自定义代码来处理。
  • 页面绘制转码时间比较长

总结:html2canvas 用于捕获页面的图像,而 jspdf 则可以将图像转换为 PDF 文件。尽管这种方法在处理一些特定场景下可能存在一定局限性,但对于简单的需求来说,它提供了一种简单、快速的解决方案。

0条评论
0 / 1000
小卡拉米
4文章数
1粉丝数
小卡拉米
4 文章 | 1 粉丝
小卡拉米
4文章数
1粉丝数
小卡拉米
4 文章 | 1 粉丝
原创

前端实现将 HTML 转换为 PDF

2024-03-06 06:13:33
155
0

在网页开发中,有时我们需要将网页内容转换为 PDF 格式,以供用户保存或打印。在将 HTML 内容转换为 PDF 时,有多种方法可供选择,其中包括使用 Puppeteer、pdfmake 和 html2canvas + jspdf。本文将对如何使用 html2canvas 和 jspdf 来将 HTML 内容转换为可下载和打印的 PDF 文件进行简介。

一、html2canvas + jspdf简单使用

1、安装

npm install --save html2canvas
npm install --save jspdf

2、绘制较短页面

convertToPDF() {
        const html2pdf = (element, fullPage) => {
          html2canvas(element, {
            scale: 2,
            scrollX: 0,
            scrollY: 0
          }).then((canvas) => {
            const imgData = canvas.toDataURL('image/png')
            const pdfWidth = fullPage ? canvas.width : element.clientWidth * 1.5
            const pdfHeight = fullPage ? canvas.height : element.clientHeight * 1.5
            const pdf = new jsPDF({
              orientation: fullPage ? 'landscape' : 'portrait', // 调整是否打印整页
              unit: 'px',
              format: [pdfWidth, pdfHeight]
            })
            pdf.addImage(imgData, 'PNG', 0, 0, pdfWidth, pdfHeight)
            pdf.save('pdf文件名.pdf')
          })
        }

        const fullPageElement = document.body
        const partialPageElement = document.getElementById('your-page-id') // 需要打印的页面id
        html2pdf(fullPageElement, true)
        html2pdf(partialPageElement, false)
      }

3、绘制长页面(.html2canvas能够抓取的页面长度有限,超出不会抓取,需要分页抓取并合并到一个 PDF 文件中。)

长度超过时提示:

A page in a PDF can not be wider or taller than 14400 userUnit. jsPDF limits the width/height to 14400

解决方案:分页

convertToPDF() {
        const html2pdf = (element) => {
          html2canvas(element, { scrollY: 0 }).then((canvas) => {
            const pdf = new jspdf('p', 'mm', 'a4')
            const imgData = canvas.toDataURL('image/jpeg', 1.0)
            const pdfWidth = pdf.internal.pageSize.getWidth()
            const pdfHeight = pdf.internal.pageSize.getHeight()
            const imgHeight = (canvas.height * pdfWidth) / canvas.width

            let heightLeft = imgHeight
            let position = 0

            while (heightLeft > 0) {
              pdf.addImage(imgData, 'JPEG', 0, position, pdfWidth, imgHeight)
              heightLeft -= pdfHeight
              position -= pdfHeight
              if (heightLeft > 0) {
                pdf.addPage()
              }
            }

            pdf.save('pdf文件名.pdf')
          })
        }

        const fullPageElement = document.getElementById('your-page-id') // 需要打印的页面id
        html2pdf(fullPageElement)
      }

二、总结

优点

  • 简单易用:html2canvas 和 jspdf 提供了直观的 API,可使页面内容转为 PDF 变得十分简单。
  • 灵活性:html2canvas 允许捕获整个页面或特定的 DOM 元素,而 jspdf 允许自定义生成的 PDF 文件的布局和样式。
  • 快速实现:使用这种方法,可以快速实现将页面内容转换为 PDF 的功能,并在客户端直接生成和下载 PDF 文件。

缺点

  • 局限性:在处理复杂布局和样式时,html2canvas 可能会出现一些限制,导致生成的 PDF 内容和页面显示的效果不尽相同。
  • 大量数据处理:对于包含大量数据或需要更复杂布局的情况,可能需要编写大量自定义代码来处理。
  • 页面绘制转码时间比较长

总结:html2canvas 用于捕获页面的图像,而 jspdf 则可以将图像转换为 PDF 文件。尽管这种方法在处理一些特定场景下可能存在一定局限性,但对于简单的需求来说,它提供了一种简单、快速的解决方案。

文章来自个人专栏
数据结构
4 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
3
2