前端实现导出pdf文件

背景:项目遇到了一个要导出pdf模板的需求,后端说没时间做(其实是嫌麻烦,不想写样式,没办法了,只好…)

头脑风暴:Y哒,我之前也没做过,百度了一下,发现前端还真能实现。那就开整!
步骤

1, 安装

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

2.用法(为了方便,我直接封装成一个公共的函数,然后配合element的加载组件一起用),以下是代码:

import html2Canvas from 'html2canvas'
import JsPDF from 'jspdf'
import { Loading, Message } from 'element-ui'
export function getPdf(htmlTitle, id) {
  let downloadLoadingInstance
  var title = htmlTitle //PDF标题
  downloadLoadingInstance = Loading.service({
    text: '正在下载数据,请稍候',
    spinner: 'el-icon-loading',
    background: 'rgba(0, 0, 0, 0.7)'
  })
  html2Canvas(document.querySelector(`${id ? id : '#pdfDom'}`), {
    allowTaint: true,
    taintTest: false,
    useCORS: true,
    dpi: window.devicePixelRatio * 2, //将分辨率提高到特定的DPI 提高四倍
    scale: 2 //按比例增加分辨率
  })
    .then(function (canvas) {
      let contentWidth = canvas.width
      let contentHeight = canvas.height
      let pageHeight = (contentWidth / 592.28) * 841.89
      let leftHeight = contentHeight
      let position = 0
      let imgWidth = 555.28
      let imgHeight = (592.28 / contentWidth) * contentHeight
      let pageData = canvas.toDataURL('image/jpeg', 1.0)
      let PDF = new JsPDF('', 'pt', 'a4')
        imgWidth = 595.28
        while (leftHeight > 0) {
          PDF.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight)
          leftHeight -= pageHeight
          position -= 841.89
          if (leftHeight > 0) {
            PDF.addPage()
          }
        }
      PDF.save(title + '.pdf')
      downloadLoadingInstance.close()
    })
    .catch((r) => {
      console.error(r)
      Message.error('下载文件出现错误,请联系管理员!')
      downloadLoadingInstance.close()
    })
}

3,vue里面使用:

<div  id="pdfDom" class="pdfStyle">
   // 这里展示PDF的内容的代码
</div>
<el-button type="primary" @click="downloadPDF()">下 载</el-button>
---------------------------------------------------------------------------------------------------------

注意:这里最重要的是id, 一定要和上面js里面代码写的id 保持一致,或者传你自己写的id也行

downloadPDF() {
      let title = '123'
      this.getPdf(title)
    }

css: 样式没啥好说的,自己慢慢调吧

缺点:渲染页数最好不超过40页,如果有图片的话最好不要超过10页(页数多的话,后面的内容不能渲染出来,图片多的话,Dom 渲染生成的速度比较慢,图片也出不来)
总结: 只有几页的模板导出pdf前端还是可以做的,页数或者图片比较多的话,建议用 node + Puppeteer 去做(目前我也不会,等我研究明白了再出个博客)。
参考(node + Puppeteer ):

Puppeteer将动态html页面生成pdf

  • 13
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
前端实现导出PDF的功能,可以使用一些第三方库或API来帮助实现。以下是一种常见的实现方式: 1. 使用jsPDF库:jsPDF是一个流行的JavaScript库,可以在前端生成PDF文件。你可以通过以下步骤来实现导出PDF的功能: - 首先,在你的HTML文件中引入jsPDF库的脚本文件。 - 创建一个新的jsPDF实例:`var doc = new jsPDF();` - 使用jsPDF提供的方法来添加内容到PDF中,比如添加文本、图片、表格等。 - 最后,使用`doc.save('filename.pdf')`方法将PDF保存到本地。 2. 使用html2pdf库:html2pdf是另一个常用的JavaScript库,可以将HTML元素转换为PDF文件。你可以按照以下步骤来实现导出PDF的功能: - 首先,在你的HTML文件中引入html2pdf库的脚本文件。 - 选择要导出PDF的HTML元素,可以是整个页面或者特定的部分。 - 使用html2pdf提供的方法将选定的HTML元素转换为PDF文件。 - 最后,使用`pdf.save('filename.pdf')`方法将PDF保存到本地。 3. 使用第三方API:如果你不想在前端处理PDF生成的逻辑,你可以使用一些第三方的PDF生成API来实现导出PDF的功能。这些API通常提供了简单的接口,你只需要将需要导出的内容发送给API,然后API会返回生成好的PDF文件。你可以搜索一些可靠的PDF生成API,并按照其提供的文档来使用。 请注意,以上提到的方法只是其中的一些常见实现方式,实际上还有其他的方法和工具可供选择。具体选择哪种方法取决于你的需求和技术栈。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值