关于在VUE中使用html2canvas+jspdf方案将HTML页面导出为PDF遇到的坑

2023-11-16

首先网上有很多教程,我就简单记录下,主要是记录我遇到的问题
首先 npm install html2canvas jspdf -s
然后在main.js中引入

// 引入html转pdf的js
import htmlToPdf from './assets/js/htmlToPdf.js'
Vue.use(htmlToPdf)

 

因为我多个页面要用到导出,所以我使用了一部分公用js,这部分直接写在页面的方法中也当然是可以的

// 导出页面为PDF格式
import html2Canvas from 'html2canvas'
import JsPDF from 'jspdf'
export default {
    install(Vue, options) {
        Vue.prototype.getPdf = function() {
            // 导出之前先将滚动条置顶,不然会出现数据不全的现象
            window.pageYOffset = 0;
            document.documentElement.scrollTop = 0
            document.body.scrollTop = 0

            const loading = this.$loading({
                lock: true,
                text: '导出中...',
                spinner: 'el-icon-loading',
                background: 'rgba(0, 0, 0, 0.7)'
            });
            var title = this.htmlTitle
            html2Canvas(document.querySelector('#pdfDom'), {
                allowTaint: true,
                useCORS: 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 = new Image();
                //设置图片跨域访问
                pageData.setAttribute('crossOrigin', 'Anonymous');

                setTimeout(() => {
                    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()
                            }
                        }
                    }
                    loading.close();
                    PDF.save(title + '.pdf')
                }, 1000);
            })
        }
    }
}

 

注释的地方就是我的坑,还好填上了

这部分就是我的代码,用法呢
在页面中将要导出为pdf的部分用 id=”pdfDom”包裹起来,当然,你要写成别的也是可以的,自己看着改改名字就行

然后在你的导出按钮上加上点击事件 @click=getPdf(“这里是你的id名称”),
然后就可以等待完美的绘制了。

咳咳,下面说说我的问题

1. 图片跨域无法访问绘制的问题

2. 偶尔会发生页面绘制不全,有时候一半,有时候差一点

我的解决办法是:第一个问题,我与后台沟通,对图片的访问加了跨域访问,还有就是给上面的代码中注释部分加了跨域
而第二个我自己找了良久始终不得方法,最后还是同组的老大在网上找到的答案

这个方案绘制页面为图片时,页面滚动条必须在顶部,不然会导致页面绘制图片不全的情况

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于在VUE中使用html2canvas+jspdf方案将HTML页面导出为PDF遇到的坑 的相关文章

  • Spring 单元测试中如何进行 mock

    我们在使用 Spring 开发项目时 都会用到依赖注入 如果程序依赖了外部系统或者不可控组件 比如依赖数据库 网络通信 文件系统等 我们在编写单元测试时 并不需要实际对外部系统进行操作 这时就要将被测试代码与外部系统进行解耦 而这种解耦方法

随机推荐

  • objects365数据集下载

    链接 https pan baidu com s 1QiWm8hCJus3LstZkz6Mzdw 提取码 wmrx
  • MySQL的索引和事务

    一 索引 一 索引概念 索引是一种特殊的文件 包含数据库中所有记录的引用 可以对表中的一列或多列创建索引 并指定索引的类型 存储引擎 每种索引在不同的存储引擎中的实现都有可能不同 索引类似数组的下标 通过下标拿到数组中的数据是很快的 同样通
  • 字符串右移n位

    题目 实现字符串右移几位 即 abcd 移两位变 cdab 思路 申请一个与待移位同样大小的数组 用来保存移位后的字符串 通过公式计算出简化的移位数 得到某字符移位后的新位置后 就将其字符值存放到新数组的对应位置 循环第3步 直至检测到字符
  • 【JVM】JVM基础知识:常量池、类加载、JVM内存模型、对象的创建过程

    前言 讲一下大概的内容 类加载 JVM内存模型 对象的创建 垃圾回收 JVM调优 入门 最近抽了时间学了一直都很想学的 JVM 之前也学过一点 也发布过一些零散的文章 但这篇文章会更加全面 学完这篇文章就足以应对有关 JVM 的面试 如果遇
  • java实现高斯赛德尔算法解线性方程组

    package linear equation import java util Scanner 使用高斯赛德尔迭代法求解线性方程组 public class Gauss Seidel Iterate 求下三角 private static
  • nodejs如何添加html文件上传,通过nodejs实现文件的上传

    通过nodejs实现文件的上传 主要内容 本文将用来讲述如何通过nodejs进行文件上传 将会涉及到以下知识点 通过express模块进行服务器的搭建 通过multer模块将上传的文件保存到指定目录 通过fs path模块将文件改名 添加后
  • SGMII协议解析

    什么是SGMII 先说什么是GMII MII MII是ethernet协议里面MAC层和PHY层之间的接口标准 MII是4bits的数据位宽 支持10 100M的数据传输 GMII前面G表示Gigabit 代表支持1000M的传输速率 需要
  • conda环境中安装1秒安装秘籍

    无论是pip或者mim安装指令 只需要加上一个参数就能1秒安装完成 pip install opencv python i https mirror baidu com pypi simple 体验完后 点个赞吧
  • SpringBoot学习(三)——SpringBoot的配置

    一 入口类 通常而言 Spring Boot都会拥有一个名为 Application的入口类 如FirstApplication 而该入口类中会有一个main方法 这个main方法起始就是一个标准的Java应用的入口方法 在main方法中使
  • Clark变换和Park变换在三相系统和单相系统中的应用

    1 引言 Clark变换和Park变换在三相系统中应用广泛 并且在单相系统中也有应用 但是以往的资料都是仅分析单相的坐标变换或者三相的坐标变换 并没有总结三相和单相的联系 本文将以坐标变换矩阵为载体 分析坐标变换在单相和三相系统中的应用 2
  • Linux基础命令-echo输出信息

    文章目录 前言 一 echo命令介绍 二 命令语法及参数 三 参考实例 总结 前言 初学linux都会接触到这个echo命令 因为这个echo的用处实在太大了 不管说日常使用上还是写shell脚本中 都是需要用到的 echo命令可以输出用户
  • 分层+TCP三次+四次+TCP和UDP区别+UDP实现可靠传输

    目录 OSI与TCP IP各层的结构与功能 都有哪些协议 TCP 三次握手 三次握手流程 tcp为什么要三次握手 而不能二次握手 四次挥手 为什么要四次挥手 TCP UDP 协议的区别 TCP 协议如何保证可靠传输 滑动窗口和流量控制 拥塞
  • 【错误记录】psql: FATAL: role [User] does not exist

    错误记录 psql FATAL role User does not exist 这是因为 psql 默认是连接的当前用户名的数据库 字面意思就是当前用户名的数据库不存在 当然 PostgreSQL 默认会创建有三个数据库 postgres
  • ESP32-USB Serial/JTAG Controller使用

    ESP32 USB Serial JTAG Controller使用 概述 CDC ACM功能描述 环境说明 硬件查询方式使用 关键函数说明 示例代码 官方中断方式使用 关键函数说明 包含头文件 安装卸载驱动 收发数据 示例程序 概述 ES
  • SignalR应用场景

    SignalR 是一个用于实时通信和即时通讯的开发库 它可以在多种应用场景中提供实时性能和功能 以下是一些适合使用 SignalR 的应用场景 即时聊天应用程序 SignalR 可以用于构建即时聊天应用程序 包括个人聊天 群组聊天和在线客服
  • 第 8 章 Jenkins – 设置Build Job

    通过下面的练习 在Jenkins创建一个job 并获取一个简单的HelloWorld应用程序 编译并运行这个Java程序 step 1 进入Jenkins控制面板然后点击 NewItem step 2 在这个页面 输入Item name 在
  • 小知识-pycharm的debug如何跳过for循环

    pycharm的debug如何跳过for循环
  • ATLAS 加入服务器未响应,路由器设置出现服务器未响应

    路由器设置出现服务器未响应 内容精选 换一换 两者主要有以下区别 一般操作系统的默认路由优先使用主网卡 如果出现使用扩展网卡导致网络不通现象通常是路由配置问题 默认主网卡具备与云公共服务区 PaaS DNS等服务所在区域 互通能力 扩展网卡
  • Apollo源码安装的问题及解决方法

    问题一 在进行git clone时 会报错Failed to connect to github com port 443 Timed out 经过实践后推荐以下两种方法 方法一 在原地址前加https ghproxy com 原地址 gi
  • 关于在VUE中使用html2canvas+jspdf方案将HTML页面导出为PDF遇到的坑

    首先网上有很多教程 我就简单记录下 主要是记录我遇到的问题 首先 npm install html2canvas jspdf s 然后在main js中引入 引入html转pdf的js import htmlToPdf from asset