vue3将页面生成pdf导出的操作指南

 更新时间:2023年07月31日 11:22:49   作者:唐志远  
最近工作中有需要将一些前端页面(如报表页面等)导出为pdf的需求,下面这篇文章主要给大家介绍了关于vue3 如何将页面生成 pdf 导出,文中通过实例代码介绍的非常详细,需要的朋友可以参考下

前言

最近工作中有需要将一些前端页面(如报表页面等)导出为pdf的需求,博主采用的是html2Canvas + jspdf

步骤

1.引入两个依赖

npm i html2canvas
npm i jspdf

点击jsPDF GitHubjsPDF 文档 查看关于jsPDF更多信息。

2.在utils文件夹下新建html2pdf.ts文件

import html2canvas from 'html2canvas';
import jsPDF from 'jspdf'
export const htmlToPDF = async (htmlId: string, title: string = "报表", bgColor = "#fff") => {
    let pdfDom: HTMLElement | null = document.getElementById(htmlId) as HTMLElement
    pdfDom.style.padding = '0 10px !important'
    const A4Width = 595.28;
    const A4Height = 841.89;
    let canvas = await html2canvas(pdfDom, {
        scale: 2,
        useCORS: true,
        backgroundColor: bgColor,
    });
    let pageHeight = (canvas.width / A4Width) * A4Height;
    let leftHeight = canvas.height;
    let position = 0;
    let imgWidth = A4Width;
    let imgHeight = (A4Width / canvas.width) * canvas.height;
    /*
     根据自身业务需求  是否在此处键入下方水印代码
    */
    let pageData = canvas.toDataURL("image/jpeg", 1.0);
    let PDF = new jsPDF("p", '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 -= A4Height;
            if (leftHeight > 0) PDF.addPage();
        }
    }
    PDF.save(title + ".pdf");
}

如果你想给pdf加上水印,则添加下面这段代码:

const ctx: any = canvas.getContext('2d');
ctx.textAlign = 'center';
ctx.textBaseline = 'middle';
ctx.rotate((20 * Math.PI) / 180);
ctx.font = '20px Microsoft Yahei';
ctx.fillStyle = 'rgba(184, 184, 184, 0.8)';
for (let i = canvas.width * -1; i < canvas.width; i += 240) {
    for (let j = canvas.height * -1; j < canvas.height; j += 200) {
        // 填充文字,x 间距, y 间距
        ctx.fillText('水印名', i, j);
    }
}

3.在目标页面引入方法即可

import { htmlToPDF } from '@/utils/html2pdf'
<div id="test-id" style="padding: 20px 0;">
    <div style="background: #000;width: 100px;height: 100px;margin: auto;"></div>
    <p>test</p>
    <p>test</p>
    <p>test</p>
    <p>test</p>
    <p>test</p>
    <p>test</p>
    <p>test</p>
</div>
<button @click="() => htmlToPDF('test-id','test pdf')">导出</button>

效果如下:

到此这篇关于vue3将页面生成pdf导出的操作指南的文章就介绍到这了,更多相关vue3将页面生成pdf内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解Vue 换肤方案验证

    详解Vue 换肤方案验证

    这篇文章主要介绍了Vue 换肤方案验证,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • Vue路由跳转问题记录详解

    Vue路由跳转问题记录详解

    本篇文章主要介绍了Vue路由跳转问题记录详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • Vue完整版和runtime版的区别详解

    Vue完整版和runtime版的区别详解

    这篇文章主要为大家介绍了Vue完整版和runtime版的区别详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • 在vue2项目中使用dart-sass的问题及解决方法

    在vue2项目中使用dart-sass的问题及解决方法

    在Vue2项目中,使用dart-sass替代node-sass可以解决安装困难和环境兼容问题,VueCLI3+用户可直接使用,而VueCLI2用户需升级VueCLI和项目,具体方法包括修改package.json依赖并使用.scss文件编写样式,此更改有助于提升项目的开发效率和跨平台兼容性
    2024-09-09
  • element组件中自定义组件的样式不生效问题(vue scoped scss无效)

    element组件中自定义组件的样式不生效问题(vue scoped scss无效)

    这篇文章主要介绍了解决element组件中自定义组件的样式不生效问题(vue scoped scss无效),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • vue2.0项目中使用Ueditor富文本编辑器示例代码

    vue2.0项目中使用Ueditor富文本编辑器示例代码

    本篇文章主要介绍了vue2.0项目中使用Ueditor富文本编辑器示例代码,具有一定的参考价值,有兴趣的可以了解一下
    2017-08-08
  • vue实现带自动吸附功能的悬浮球

    vue实现带自动吸附功能的悬浮球

    这篇文章主要为大家详细介绍了vue实现带自动吸附功能的悬浮球,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • vue鼠标悬停事件监听实现方法

    vue鼠标悬停事件监听实现方法

    页面在鼠标悬停(不动)n秒之后,页面进行相应的事件,下面这篇文章主要给大家介绍了关于vue鼠标悬停事件监听的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • axios 实现post请求时把对象obj数据转为formdata

    axios 实现post请求时把对象obj数据转为formdata

    今天小编就为大家分享一篇axios 实现post请求时把对象obj数据转为formdata,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-10-10
  • 解决vue动态下拉菜单 有数据未反应的问题

    解决vue动态下拉菜单 有数据未反应的问题

    这篇文章主要介绍了解决vue动态下拉菜单 有数据未反应的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08

最新评论