vue3 如何将页面生成 pdf 导出

news2025/2/1 2:54:51

原文链接:vue3 如何将页面生成 pdf 导出

64b3b7cd1f0c8.png

前言

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

效果图

步骤

1.引入两个依赖

npm i html2canvas
npm i jspdf

点击 jsPDF GitHub、jsPDF 文档 查看关于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>

效果如下:

参考

  • jsPDF
  • Vue3 导出 pdf 方案
  • 纯前端生成 PDF 之 jspdf 使用及注意事项
  • jsPDF + html2canvas A4 分页截断 完美解决方案(含代码 + 案例)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/762993.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

连续两个季度利润暴跌95%以上,三星回不去了

这两年&#xff0c;小编本人电脑的 CPU、显卡等核心硬件毫无升级欲望不愿折腾。 反倒是内存条、固态硬盘容量不知不觉翻了好几倍! 老实说&#xff0c;对大多数像咱这样的普通用户来说&#xff0c;CPU、显卡从两三年前的主流型号升级到现在的主流型号&#xff1b; 价格明显上涨…

求助:交流耦合放大电路(HPF)的阻抗匹配问题

1、同向的交流耦合放大电路 电路如下图所示&#xff0c;信号源是一个上升时间1ns&#xff0c;下降时间15ns的脉冲信号&#xff0c;经过传输线的时延为5ns&#xff0c;然后通过放大器的同向交流耦合放大&#xff0c;这里我们可以明确的直到&#xff0c;下图中的R25就是端接电阻…

JavaWeb——基于Spring Boot的图书数字化管理系统的设计与实现

课程设计总结 1 概述 1.1 项目开发背景 随着信息技术的快速发展&#xff0c;数字化管理已经成为各行各业提高效率和管理水平的重要手段。在图书管理领域&#xff0c;数字化管理系统可以有效地提高管理效率&#xff0c;提供更好的用户体验。本项目旨在开发一个基于Spring…

静态反射C++枚举名字的超简方案——C++闲得慌系列之(一)

C 有枚举&#xff0c;编译后其值就被转成整数了&#xff0c;有时程序会有输出枚举名字的需求&#xff0c;朴素的做法就是手工一个个写字符串&#xff08;名字&#xff09;&#xff0c;并实现匹配&#xff0c;比如&#xff1a; enum class Shape {rectangle, circular}; std::s…

再获信通院认可!华住&持安零信任项目获评零信任最佳方案奖!

2023年7月12日&#xff0c;在中国通信标准化协会算网融合产业及标准推进委员会&#xff08;CCSA TC621&#xff09;在京组织召开“2023算网融合产业发展峰会-零信任产业发展论坛”上&#xff0c;“2022零信任优秀案例”成果正式发布。 持安科技与华住集团共同完成的 “华住集团…

【SpringBoot】| Spring Boot 常见的底层注解剖析

目录 一&#xff1a;Spring Boot 常见的底层注解 1. 容器功能 1.1 组件添加 方法一&#xff1a;使用Configuration注解Bean注解 方法二&#xff1a;使用Configuration注解Import注解 方法三&#xff1a;使用Configuration注解Conditional注解 1.2 原生xml配置文件引入…

ITDR何以成为IAM的最佳搭档?

摘 要 ❖随着零信任方案的逐渐落地&#xff0c;身份成为企业的新边界。同时&#xff0c;身份基础设施成为了攻击焦点。 ❖最近的身份攻击变得更加巧妙和复杂&#xff0c;甚至可以绕过MFA。 ❖当前的IAM解决方案只能起到预防作用。 ❖企业更需要一个能够检测和响应身份威胁的…

Mysql 备份与还原

目录 一 数据库备份的重要性与分类 1.数据备份的重要性 2. 造成数据丢失的原因 3.从物理与逻辑的角度&#xff0c;备份分为 4.从数据库的备份策略角度&#xff0c;备份可分为 二、常见的备份方法 1.物理冷备 2.专用备份工具mydump或mysqlhotcopy 3.启用二进制日志进行增量…

上手vue2的学习笔记5之在vue2项目中调用elment-ui

前言 上手vue2的学习笔记4之搭建vue环境 参考链接&#xff1a;vue2.0项目引入element-ui 一、安装elment-ui 进入搭建的vue项目中 cd vue_bing_test 安装 element npm i element-ui二、引入elment-ui elment官方教程 将main.js改成如下内容&#xff1a; import Vue fro…

详解C语言自定义类型

目录 一&#xff0c;结构体 1.结构体的基础知识 2.结构体的声明 一般的声明 ‍特殊的声明&#xff08;匿名结构体类型&#xff09; 3.结构体的自引用 4.结构体变量的定义和初始化 ‍结构体变量的定义 结构体变量的初始化 结构体变量的嵌套初始化 5.结构体内存对齐 …

240-960MHz带编码器的单片OOK 发射器CMT2157B

CMT2157B 是一款真正意义上的单芯片、高灵活性、超低功耗、带编码器的OOK 射频发射芯片&#xff0c;非常适合于240 至960 MHz 的无线应用场 合。该芯片可实现完全兼容市面上最常用的527、1527、2262 和2240 等编码格式。此外&#xff0c;还支持用户各种自定义编码。该芯片支持4…

c数据类型相关的关键字

变量的相关关键字 charshortintlongfloatdoublestructunion&#xff1a;与共用体相关的关键字enum&#xff1a;枚举signed&#xff1a;定义有符号的&#xff0c;可以保存正数&#xff0c;也可以保存负数unsigned&#xff1a;定义无符号&#xff0c;只能保存正数和0&#xff1b…

【知识点汇总】

罗曼罗兰说&#xff1a;“世界上只有一种真正的英雄主义&#xff0c;那就是在看清生活的真相之后&#xff0c;依然热爱生活。” JAVA开发知识点汇总 JAVAJVM垃圾标记算法三色标记法可达性分析法引用计数法 可以作为GCroots的对象有哪些&#xff1f;GC的种类和触发机制年轻代触…

1、nacos配置中心

一、配置中心存的意义 1、微服务中配置文件的问题 配置文件的问题&#xff1a; 配置文件的数量会随着服务的增加持续递增单个配置文件无法区分多个运行环境配置文件内容无法动态更新&#xff0c;需要重启服务 引入配置文件&#xff1a;刚才架构就会成为这样。是由配置中心统…

openvpnas安装,可视化远程连接控制

本次安装环境为 centos7.9 本次安装软件为 openvpnas, 默认是两个连接授权&#xff0c;可以通过代码注入实现多连接授权 1.基础环境以及Python36安装 yum install python36 python36-devel wget -y 2.安装 openvpnas 1.在线安装 yum -y install https://as-repository.openv…

ASEMI快恢复二极管MURF2080CT怎么看芯片的第一脚

编辑-Z MURF2080CT是一款高压、高速二极管&#xff0c;常用于电源、逆变器、电机驱动器等领域。该二极管具有以下特点&#xff1a; 1. 高压承受能力&#xff1a;MURF2080CT的最大反向电压可达800V&#xff0c;能够承受较高的电压。 2. 快速开关速度&#xff1a;该二极管的开关…

二叉树Morris遍历改写成后序遍历(java)

Morris 遍历 Morris 遍历改写成后序遍历解题思路代码演示 Morris 遍历 Morris 遍历改写成后序遍历 通过Morris遍历的顺序&#xff0c;将其调整为后序遍历的顺序&#xff0c; 解题思路 不明白morris 遍历&#xff0c;先查看上期 遍历二叉树的神级方法–Morris遍历 morris 遍历改…

ros2 foxy robot-localization 里程计 imu多传感器融合踩坑指南

前言 Robot_localization是一个基于卡尔曼滤波 ROS的包&#xff0c;可以对里程计 imu gps多种传感器进行数据融合&#xff0c;进而完成机器人的定位的算法。对于不懂卡尔曼滤波的小伙伴&#xff0c;通过修改配置文件就能顺利的使用大佬们造好的轮子&#xff0c;极大的降低了使…

【雕爷学编程】Arduino动手做(163)---大尺寸8x8LED方格屏模块7

37款传感器与模块的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&#x…

Appium+python自动化(八)- 初识琵琶女Appium- 下(超详细)

​简介 通过上一篇给各位小伙伴们的引荐&#xff0c;大家移动对这位美女有了深刻的认识&#xff0c;而且她那高超的技艺和婀娜的身姿久久地浮现在你的脑海里&#xff0c;是不是这样呢&#xff1f;&#xff1f;&#xff1f;不要害羞直接告诉说&#xff1a;是&#xff0c;就对了。…