使用html2Canvas跟jspdf将一部分页面生成PDF

2023-10-30

刚好碰到这么一个需求,前端需要将后端返回的json对象数据生成表单样式的pdf文件,首次接触所以简单记录一下。

经过反复查找大致流程为:现在页面画一个表单=====>拿到数据将数据放表单中=====>给表单最外层加个ref利用html2Canvas生成base64图片=====>最后用jspdf将图片生成pdf。

先上个图:

 

 首先安装依赖组件

npm install --save html2canvas  // 页面转图片
npm install jspdf --save  // 图片转pdf

然后将拿到的数据放入表单(表单大家都会吧,我就不往出贴了,放个图好了,主要看下ref的位置,一些其他的样式问题可根据自身需求调整)中

 通过引用并调用html2canvas先生成base64图片

import html2canvas from 'html2canvas'
import jsPDF from "jspdf";


//点击事件  row是json对象数据,里面有要用的PDF文件名
AccountStatement(row) {         
    html2canvas(this.$refs.vueDomSaveToImage).then(res=>{ //图片生成
	    downloadPDF(res) //pdf生成 将图片生成后的json对象带过去,里面有要用到的参数
    })
}

//调用jspdf方法
downloadPDF(canvas){
  let contentWidth = canvas.width;
  let contentHeight = canvas.height;
  
  //一页pdf显示html页面的canvas高度;
	var pageHeight = contentWidth / 592.28 * 841.89;
	//未生成pdf的html页面高度
	var leftHeight = contentHeight;
	//页面偏移
	var position = 0;
	//a4纸的尺寸[595.28,841.89],生成的canvas在pdf中图片的宽高
	var imgWidth = 595.28;
	var imgHeight = 592.28 / contentWidth * contentHeight;
	
	var pageData = canvas.toDataURL('image/jpeg', 1.0); //html2canvas生成的图片
	// 第一个参数: l:横向  p:纵向
	// 第二个参数:测量单位("pt","mm", "cm", "m", "in" or "px")
	var pdf = new jsPDF('p', 'pt', 'a4');

	//有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)
	//当内容未超过pdf一页显示的范围,无需分页
	if (leftHeight < pageHeight) {
		pdf.addImage(pageData, 'JPEG', 0, 0, imgWidth, imgHeight);
	} else { //分页
		while (leftHeight > 0) {
			pdf.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight)
			// pdf.addImage(pageData,'JPEG', 25, position, imgWidth, Math.min(imgHeight, imgWidth * canvas.height / canvas.width)); 
			leftHeight -= pageHeight;
			position -= 841.89;
			//避免添加空白页
			if (leftHeight > 0) {
				pdf.addPage();
			}
		}
	}
  
	//这里自己加参数判断一下
	if(type==0){ //预览
		pdf.output('dataurlnewwindow', "pdf名称.pdf"); //经过测试这里自定义名称无效并且在谷歌浏览器打开的预览页面下载按钮无效,火狐浏览器下载按钮可用
	}else{
		pdf.save( "pdf名称.pdf"); //导出
	}
}

到这里功能上就基本搞定了,,只不过终究是截图转的pdf,可能会存在失真问题,可以在html2canvas截图时候加高一下精度跟倍数(不过倍数加到1.5以后在火狐就无效了,谷歌还行,加到2就比较清晰了)

还有其他的一些细节问题,比如分页截断问题暂时搞不定,,等有解决办法会重新发一下,,欢迎交流!!!

 

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

使用html2Canvas跟jspdf将一部分页面生成PDF 的相关文章

随机推荐

  • 领域建模概述

    0 概述 在软件工程中 有两个高阶的工作的分别是架构和建模 如果把写代码比喻成施工 那么架构和建模就是设计图纸 相比编码 那么建模的确是对设计经验和抽象能力要求更高的一种技能 本文主要探讨一下对领域建模相关知识的理解 1 什么是领域建模 1
  • 算法:通过迪杰斯特拉(Dijkstra)算法,求出图中任意顶点到其他顶点的最短路径

    请看如下的示例图 该图有 V1 V7 七个顶点 每个顶点之间的距离 路径走向如图所示 假设这是一幅地图 我们很多时候都需要搜路径 比如从家到公司的路线图 也就是说 家是一个点 公司是另一个点 上图的各个点可以想象成分岔路口 当然 如果你不在
  • 安装Apache Atlas遇到的错误

    安装apache atlas 启动atlas server报错 查看logs atlas 20220524 115239 out文件 Caused by org springframework beans factory Unsatisfi
  • mysql从视图中获取字段值_MYSQL中视图的使用

    1 什么是视图 执行一条SQL 将结果集保存在一张虚拟表中 2 为什么要使用视图 重复利用SQL语句 简化SQL查询 快速取数据 只用知道表的部分结构 保护数据 根据特定授权 更改数据格式和表示 视图可返回与底层表的表示和格式不同的数据 注
  • maven私有仓库nexus3.5搭建与使用

    maven私有仓库nexus3 5搭建与使用 参考网址 http blog csdn net clj198606061111 article details 52200928 http www cnblogs com jingmoxukon
  • leetcode刷题日志4.0

    目录 前言 1 三个数的最大乘积 2 错误的集合 3 机器人能否返回原点 4 最长连续递增序列 5 验证回文串 II 6 交替位二进制数 前言 五一假期结束了 大家玩的开心吗 不过我们还得回到我们的日常生活学习工作当中 那今天我就分享一下我
  • 性能测试最佳实践的思考,7个要点缺一不可!

    性能测试是软件开发和应用过程中至关重要的环节 它是评估系统性能 稳定性和可扩展性的有效手段 可以确保软件在真实环境中高效运行 在现代技术快速发展的时代 性能测试的重要性愈发显著 性能测试在软件开发和应用过程中的重要性不可低估 它是保障用户体
  • 预编码技术

    预编码的基本原理 TD LTE下行传输采用了MIMO OFDM的物理层构架 通过最多4个发射天线并行传输多个 最多4个 数据流 能够有效地提高峰值传输速率 LTE的物理层处理过程中 预编码是其核心功能模块 物理下行共享信道的几种主要传输模式
  • The ‘import.meta‘ meta-property is only allowed when the ‘--module‘ option is ‘esnext‘ or ‘system‘

    问题描述 使用vite的import meta const allImage import meta glob assets images console log allImage 报提示 需要配置 module option为exnext
  • 根据fabric官方文档,自己整理hello world的过程中出现的bug

    在对fabric的官方文档下的 fabric samples中的test network项目中的network sh的分析 进行到创建通道时候又出现了之前出现的bug Error got unexpected status BAD REQU
  • mysql查询练习(二)

    11 查询每门课的平均成绩 查询3 105课程的平均分 mysql gt select avg degree from score where cno 3 105 avg degree 81 7500 1 row in set 0 00 s
  • 零拷贝( Zero-copy )

    一 背景 零拷贝 描述了计算机操作 其中CPU 不执行将数据从 一个存储区 复制到 另一个存储区 的任务 通过网络传输文件时 通常用于节省CPU周期和内存带宽 在传统的 Linux 操作系统的标准 I O 接口是基于数据拷贝操作的 即 I
  • C++基本语句(一)

    学习C 的第二天 一 C 的基本语句 1 1声明语句和变量 P21 P22 声明语句和变量 各自的作用是什么 为什么变量必须要声明 以及下面这段代码提供了哪两项信息 定义一个整型变量 int carrots 定义一个整型变量 int car
  • 尤里的复仇Ⅰ 小芳!

    尤里的复仇 小芳 作者 admin 时间 2021 06 15 分类 封神台 第一章 为了女神小芳 找到get参数id 使用 1 1 or 1 1 1 or 1 2 测试 发现存在sql注入 最终payload为 id 1 and 1 2
  • XMind中的 “甘特图”视图

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 甘特图 视图 当所有任务信息添加完成后 点击 任务信息 视图底部的 显示甘特图 按钮 XMind将弹出 甘特图 视图 所有任务信息将不同属性的线条展现 如果此时切换画布或者
  • math模块

    math 模块是Python中的标准模块 并且始终可用 要在此模块下使用数学函数 您必须使用导入模块import math 它提供对基础C库函数的访问 导入数学函数库 import math 查看 math 查看包中的内容 print di
  • C99与C89主要区别

    http www cnblogs com xiaoyoucai p 6146784 html
  • P4162 [SCOI2009]最长距离

    题目链接 这道题数据范围比较小 所以方法还是比较暴力的 思路 先按每个格子的状态 让所有格子与他周围的格子连一条权值为它连向那个格子的值 0或1 然后我们n方枚举所有格子跑最短路 最短路即为从起点到终点的最小障碍数 然后我们枚举所有最短路
  • Spring的两种定时器

    1 spring学习系列 定时器一TimerTask spring定时器一般有两种 TimerTask Quartz 本节只讲TimerTask 需要的包 aopalliance 1 0 jar commons logging 1 1 1
  • 使用html2Canvas跟jspdf将一部分页面生成PDF

    刚好碰到这么一个需求 前端需要将后端返回的json对象数据生成表单样式的pdf文件 首次接触所以简单记录一下 经过反复查找大致流程为 现在页面画一个表单 gt 拿到数据将数据放表单中 gt 给表单最外层加个ref利用html2Canvas生