vue3导出pdf

把页面利用canvas转换成图片,然后再用图片的base64码转成pdf

安装2个插件:

npm install --save html2canvas //html页面转换成图片
npm install jspdf --save //把base64转换为PDF

js配置文件:

// 导出页面为PDF格式
import html2Canvas from "html2canvas";
import JsPDF from "jspdf";

export function getPdf(title, id) {
  html2Canvas(document.querySelector(`#${id}`), {
    allowTaint: true,
  }).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 = 595.28;
    let imgHeight = (592.28 / contentWidth) * contentHeight;
    let pageData = canvas.toDataURL("image/jpeg", 1.0);
    let PDF = new JsPDF("", "pt", "a4");
    if (leftHeight < pageHeight) {
      PDF.addImage(pageData, "JPEG", 0, 0, imgWidth, imgHeight);
    } else {
      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");
  });
}

页面使用:

<m-button @click="getPdf('导出pdf', 'pcctable')">导出pdf</m-button>

<m-table :columns="columns" :data-source="data" @pageChange="pageChange" :total="formState.queryData.total" id="pcctable"></m-table>
import { getPdf } from "@/utils/exportPdf";

整张pdf:

// 导出页面为PDF格式
import html2Canvas from "html2canvas";
import JsPDF from "jspdf";
 
export function getPdf(title:string, id:string) {

    document.documentElement.scrollTop = 0
      let canvas = document.createElement("canvas") // 生成canvas上下文
      let context = canvas.getContext("2d")
      let _articleHtml = document.querySelector(`#${id}`)
      let _w = _articleHtml.clientWidth //获取需要导出pdf区域的宽度和高度
      let _h = _articleHtml.clientHeight 
      let scale = 3   //将画布宽&&高放大三倍,提高清晰度
      if(_w >_h){
        _h = _w
      }
      canvas.width = _w * scale
      canvas.height = _h * scale
      context.scale(scale, scale)
      let opts = {
        scale: 1,
        width: _w,//dom 原始宽度
        height: _h,
        canvas: canvas,
        // useCORS: true  //允许canvas画布内可以跨域请求外部链接图片, 允许跨域请求。
      }

    // 以上部分都是为了强化清晰度的,放大canvas画布
    html2Canvas(_articleHtml, opts).then(canvas => {
        createPdfAll(canvas, scale)
    })

    // 自定义宽高
    function createPdfAll (canvas, scale) {
        let contentWidth = canvas.width / scale 
        let contentHeight = canvas.height / scale
        let pdf = new JsPDF('', 'pt', [contentWidth, contentHeight])  //自定义宽高
        let pageData = canvas.toDataURL('image/jpeg', 1.0) //转换图片为dataURL
        pdf.addImage(pageData, 'JPEG', 0, 0, contentWidth, contentHeight) //添加图像到页面
        pdf.save(`${title}.pdf`)
    }

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue导出PDF文件,可以使用一些第三方库来实现,例如jsPDF和html2canvas。下面是一个简单的示例代码: 1. 首先,安装所需的库: ```bash npm install jspdf html2canvas ``` 2. 在Vue组件中,导入所需的库: ```javascript import jsPDF from 'jspdf'; import html2canvas from 'html2canvas'; ``` 3. 创建一个方法来处理导出PDF的逻辑: ```javascript methods: { exportAsPDF() { // 获取要导出PDF的元素 const element = document.getElementById('pdf-content'); // 使用html2canvas将元素转换为canvas html2canvas(element).then((canvas) => { const imgData = canvas.toDataURL('image/png'); // 创建一个新的jsPDF实例 const pdf = new jsPDF(); // 计算页面宽度和高度 const pdfWidth = pdf.internal.pageSize.getWidth(); const pdfHeight = pdf.internal.pageSize.getHeight(); // 将canvas转换为图像添加到PDFpdf.addImage(imgData, 'PNG', 0, 0, pdfWidth, pdfHeight); // 保存PDF文件 pdf.save('exported.pdf'); }); } } ``` 4. 在模板中添加一个按钮,并调用导出方法: ```html <template> <div> <div id="pdf-content"> <!-- 要导出PDF的内容 --> </div> <button @click="exportAsPDF">导出PDF</button> </div> </template> ``` 确保将要导出PDF的内容包装在一个具有指定id的元素中(在上述示例中为`pdf-content`),然后单击按钮将调用`exportAsPDF`方法,将该元素导出PDF文件并保存到本地。 请注意,这只是一个简单的示例,可能需要根据实际需求进行适当的调整和扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值