js操作-页面元素转canvas并打印或转成图片下载(包含滚动条隐藏的内容)

js 调用浏览器打印功能 废话不多说,功能需求:店家从商家后台调用打印机打印送货单,送货单信息:二维码,地址,电话,送货员拿单送货… 首先拆分功能点:生成二维码、调用浏览器打印机打印订单 (剧透一下,二维码使用qrcode.react第三方生成,二维码格式为canvas,但是浏览器打印不能试别canvas格式,qrcode.react (v7.1.2,) value奇葩写法。具体如下) 二维码生成使用qrcode.rea... 阅读详情

接到一个需求,客户要求将一个详情表格数据(单元格存在图片)转成一个图片并下载或者直接打印的功能;

思路是这样的,有一个js文件(html2canvas.min.js)可以将指定的元素转成canvas,而casvas可以转成图片,这样就可以下载了。

打印的话使用的是js中window对象的print()方法;具体代码与效果请往下看:

页面基本布局

<!DOCTYPE html>
<html>
	<head>
		<meta name="layout" content="main">    
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
		<title></title>
		<script src="./jquery.min.js"></script>
		<script src="./html2canvas.min.js"></script>
		<style type="text/css">
			#div2img{
				height: 300px;
				overflow-y: auto;
			}
			#div2img table tr{
				height: 40px;
				line-height: 40px;
			}
		</style>
	</head>
	<body>
		<h1>转图片</h1>
		<input class="button" type="button" value="测试" /> 
		<div id="div2img">
			<table border="1" cellspacing="0" cellpadding="0" width="100%">
				<thead style="background-color: #007DDB;">
					<tr>
						<th>姓名</th>
						<th>性别</th>
						<th>年龄</th>
						<th>地址</th>
						<th>头像</th>
					</tr>
				</thead>
				<tbody>
					<tr>
						<td>张三</td>
						<td>男</td>
						<td>32</td>
						<td>上海</td>
						<td background="./img/timg.jpg"></td>
					</tr>
					<tr>
						<td>张三1</td>
						<td>男</td>
						<td>32</td>
						<td>上海</td>
						<td background="./img/timg.jpg"></td>
					</tr>
					<tr>
						<td>张三2</td>
						<td>男</td>
						<td>32</td>
						<td>上海</td>
						<td background="./img/timg.jpg"></td>
					</tr>
                    <!-- 这里是很多行,不过多写了,要看效果的可以多copy几次 -->
				</tbody>
			</table>
		</div>
		
		<script type="text/javascript">
			
			$(function(){
				$(".button").on("click", function(event) {  
					//要实现的功能
				});     
			});
		</script>
	</body>
</html>

现在基本的页面布局完成了,具体打印的代码如下

//调用html2canvas.min.js中的方法,document.getElementById("div2img")指的是要转成canvas的元素
html2canvas(document.getElementById("div2img")).then(canvas => {
						
	//创建一个打开的窗口,也就是新打开的标签页
	var mywindow = window.open("打印窗口","_blank");
						
    //给新打开的标签页添加画布内容(这里指的是id=div2img元素的内容)
	mywindow.document.body.appendChild(canvas);
	
    //焦点移到新打开的标签页
	mywindow.focus(); 

	//执行打印的方法(注意打印方法是打印的当前窗口内的元素,所以前面才新建一个窗口:print()--打印当前窗口的内容。)
	mywindow.print();
    
    //操作完成之后关闭当前标签页(点击确定或者取消都会关闭)
	mywindow.close(); 
});

转成图片下载是将canvas转成图片连接并绑定到一个可点击的标签(我用的是a标签),如果有滚动条的情况下请看文章最后的修改内容,具体代码如下:

//调用html2canvas.min.js中的方法,document.getElementById("div2img")指的是要转成canvas的元素
html2canvas(document.getElementById("div2img")).then(canvas => {
						
	//转成图片并下载
	var domA = document.createElement("a");
    
    //设置下载下来的文件名字,默认的是“下载”
	domA.download = '钻孔详情';

    //图片连接,canvas转成的图片连接(image/png指的是图片文件格式,png可以改成jpg、jpeg)
	domA.href = canvas.toDataURL("image/png");
    
    //触发点击事件,这是真正开始下载的一步
	domA.click();
});

到这就完成了,看下效果把:(注意:我用的谷歌浏览器,其他的浏览器兼容性未测试!!!)

完成布局之后的页面是这样的:

打印的效果触发:

转成图片下载效果是

下载下来的图片是

至此,该需求已完成。注意这是我测试的一个demo,不是我实际应用再项目中的代码,希望对大家有所帮助!!!

2020-09-03更新

发现一个问题,就是如果元素有滚动条的情况下,截取的时候没有包含滚动条隐藏掉的那些内容;我的思路是这样的,我获取元素的可滚动高度(scrollHeight),就是真实内容的高度(包含原来滚动条隐藏的内容),把这个高度设置给这个元素的可视高度(clientHeight),这个时候在进行转成图片就可以了,完成这一步之后再把高度转过来就行了!具体修改内容请看下面的代码,依然是卸载按钮点击触发的事件内,代码调整如下

//获取进行下载的元素
let dom = document.getElementById('div2img');
//获取元素的真实高度(包含滚动条隐藏的内容)
let height = dom.scrollHeight;
//记录一下可视窗口高度(原有的高度样式)
let domheight = dom.clientHeight;
//设定元素的高度为真实高度
$(dom).css("height", height+"px");
html2canvas(dom,{
	height: height //canvas 窗口的高度
}).then(function(canvas) {
    //转成图片进行下载
	var domA = document.createElement("a");
	domA.download = '下载';//下载下来的图片命名
	domA.href = canvas.toDataURL("image/png");
	domA.click();
	//恢复元素的高度
	$(dom).css("height", domheight+"px");
});

最后这个示例的代码下载地址:https://download.youkuaiyun.com/download/it_java_shuai/12803858

【Vue】Vue 使用 Print.js 打印选中区域的html,用到的是Element ui table表格,解决页面样式不出现或者table表格样式错乱问题!!! 阅读详情

相关推荐

canvas-template:HTML画布模板

画布模板 HTML画布模板

快速将网页界面 生成为 canvas 图片

1.第一步 映入 &lt;script src="https://cdn.bootcss.com/html2canvas/0.5.0-beta4/html2canvas.min.js"&gt;&lt;/script&gt; 2.绘制canvas this.drawCanvas('.cardBc') async drawCanvas (selector) { // 获取想要...

qq_41563226的博客 817

单精度浮点数存储、双精度浮点数存储

单精度浮点数存储、双精度浮点数存储

fancynthia的博客 1312

js将div内所有内容转为canvas,并实现点击下载为png图片

js将div内所有内容转为canvas,并实现点击下载为png图片

前端金牌摸鱼达人 6041

MATLAB实战:Gardner定时同步算法实现与BER曲线优化指南

本文详细介绍了Gardner定时同步算法在MATLAB中的实现与优化方法,重点解析了算法原理、关键步骤实现及BER曲线绘制中的常见问题解决方案。通过优化参数设置和系统架构,提升数字通信系统的符号同步性能,为QPSK、QAM等调制系统提供实用参考。

weixin_29085865的博客 231

糖尿病预测(深度学习pytorch实现-最新)

本次做的项目是糖尿病的预测,也是来自kaggle上面的一个小项目。根据一个人的怀孕次数、血糖、血压、皮肤厚度、胰岛素指标、身体质量指数、糖尿病谱系指数、年龄等身体参数来预测一个人是否患有糖尿病。

NangoGreen的博客 5359

【JS】前端图片下载的深度解析:从0字节问题到跨域与Canvas原理

前端图片下载那些坑:为什么第一次下载是0字节,第二次才正常?(含跨域与canvas原理详解)

Allen_Sushi首页 842

cuRobo 入门教程(一)基于CUDA的机器人运动规划加速库

cuRobo是一款基于CUDA加速的机器人算法库,提供运动学计算、碰撞检测、轨迹优化等功能。该库采用并行优化技术,在GPU上实现高效运算,比现有方案快60倍。cuRobo支持多种机器人模型和环境表示,包含正向/逆向运动学、无碰撞轨迹生成、模型预测控制等核心算法,并可与IsaacSim等仿真平台集成。其特点包括:1) 支持多种碰撞检测方式(长方体/网格/深度图像);2) 提供批量环境处理和实时世界更新;3) 通过CUDA Graphs加速优化迭代;4) 在Jetson Orin等平台实现毫秒级运动规划。安装支

2506_90492529的博客 1931

h5 Canvas转换为图片格式并下载

HTMLCanvasElement.toDataURL() 方法返回一个包含图片展示的 data URI 。可以使用 type 参数其类型,默认为 PNG 格式。图片的分辨率为96dpi。 如果画布的高度或宽度是0,那么会返回字符串“data:,”。 如果传入的类型非“image/png”,但是返回的值以“data:image/png”开头,那么该传入的类型...

suwu150 8322

基于Matlab生成并可视化多架飞机轨迹仿真(附源码)

这使我们可以轻松地对直线和恒定转弯进行建模,并具有额外的自由度,可以在直线段和曲线段之间平滑过渡。同样,空气中的物体会经历重力的影响,遵循抛物线(二次)路径。需要更多的航点来适应这些变化,但是轨迹的其余部分需要更少的点。第三个轨迹,如下所示,代表了一架速度更高的飞机。它由两个恒定的转弯组成,飞机在第二个转弯的中间减速。一旦知道(并设置了)物体穿过空间的物理路径,物体的速度作为行进距离的函数就通过三次埃尔米特插值来确定。在此示例中,学习了内部使用的插值符背后的概念,并展示了如何使用少量航点重现场景。

珞瑜的博客 5464

windows 配置 libxml2

路径:\libiconv-1.9.2-1-src.zip\src\libiconv\1.9.2\libiconv-1.9.2\include\。执行完后,在当前win32目录中会生成了一个bin.msvc目录,其中就有开发需要的libxml2.lib和libxml2.dll文件。将 libiconv.la 复制到 新建的 lib 目录,并将其改名为 iconv.lib。路径:libiconv-1.9.2-1-bin.zip\lib\。将如下的 iconv.h 复制到新建的 include 目录。

SHELLCODE_8BIT的博客 3886

JS下载canvas或图片到到本地

【代码】JS下载canvas或图片到到本地。

qq_40178497的博客 229

`tokenizer.decode` 出现乱码或异常输出,怎么处理

摘要: 在使用Hugging Face Transformers库时,tokenizer.decode出现乱码或异常输出的解决方案包括:1)确保模型与分词器严格匹配,加载时使用trust_remote_code=True;2)谨慎处理特殊token,先保留所有token再针对性清理;3)校验模型输出token的维度和数值是否合法;4)通过convert_tokens_to_string替代解码;5)检查生成配置如max_new_tokens等参数。核心思路是确保模型与分词器逻辑对齐、输出token合法,必要

ZhangJiqun&191cm&85kg 585

canvas 转图片toBlob 方式

function downloadByBlob(blobObj) { const link = document.createElement('a'); link.style.display = 'none'; const downloadUrl = window.URL.createObjectURL(blobObj); console.log("downloadUrl--", downloadUrl); .

felicity_zll的博客 7351

手把手教你学Simulink——基于Simulink的全双工无线通信仿真建模示例

目录手把手教你学Simulink——基于Simulink的全双工无线通信仿真建模示例一、背景介绍二、所需工具和环境三、步骤详解步骤1:创建Simulink模型步骤2:设计输入信号步骤3:添加调制模块步骤4:添加自干扰消除模块步骤5:添加AWGN信道步骤6:添加接收端处理步骤7:添加解调模块步骤8:计算误码率(BER)步骤9:添加显示模块步骤10:设置仿真参数步骤11:运行仿真并分析结果四、总结 全双工(Full-Duplex)无线通信技术允许在同一频段上同时进行数据的发送和接收,这与传统的半双工(Half-

MHD0815的博客 182

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

php+canvas+保存图片,如何通过js实现canvas保存图片为png格式并下载到本地!

看题主标题,应该有两点需求:canvas 保存图片下载到本地针对canvas保存图片,bf 童鞋给出了代码了前段时间也捣鼓了一下,列一下我当时的代码片段:function base64Img2Blob(code){var parts = code.split(';base64,');var contentType = parts[0].split(':')[1];var raw = window....

weixin_29507477的博客 261

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

js实现canvas保存图片为png格式并下载到本地

canvas 保存图片 下载到本地 function base64Img2Blob(code){ var parts = code.split(';base64,'); var contentType = parts[0].split(':')[1]; var r...

dianni7443的博客 667

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

vue实现图片下载至本地

【代码】vue实现图片下载至本地。

weixin_45835723的博客 2106

使用JavaScript或Vue框架解决SVG转图片时自定义字体无法正确显示的问题

为了解决这个问题,曾尝试使用第三方库,如html2canvas或dom-to-image,期望通过截图的方式来实现。最近,在我负责的一个项目中,由于使用了自定义字体,遇到了一个问题:SVG无法以正确的方式转换为图片下载,导致缺失了自定义样式。最后,我灵光一闪,如果我们尝试以编程的方式直接绘制字体,而不是依赖外部资源文件,是否能够绕过这个难题呢?标签中对其进行定义。然而,令人遗憾的是,尽管我尝试了多次,却始终未能成功解决这个问题。经过我的深入剖析,问题的根源在于资源文件未能正确加载,因此需要确保在SVG的。

ouzengqi2010的专栏 1008

移动端js下载图片

// 利用canvas <img :src="'data:image/jpeg;base64,'+ imgurl " id="ewm"> // imgurl为base64格式 <div @click="downImg('ewm')"></div> // js downImg(id){ let imgObj=document.getElementById(id); imgObj.crossOrigin='anonymous'

丁贵龙学习技术的博客 2535

使用canvas在一张图片上动态显示文字信息,并支持图片下载。

前端jsp页面:     下载 js方法:     //预加载将图片绘制到画布     $(function(){         hecheng();     });     function hecheng(){                  //获取画布对象         var mainCtx = getCanvasC

what_error的博客 4547

Vue.js 3 + Canvas 实现原神风格字体生成器:从响应式到实时渲染

在前端开发中,Canvas 2D绘图是实现动态图形和自定义视觉效果的核心技术,它允许开发者在浏览器中直接进行像素级绘图操作。其原理是通过JavaScript API操作画布上下文,绘制文本、形状和应用样式,结合响应式数据绑定技术,可以实现参数的实时同步与图形更新。这种技术组合在创意工具开发中具有重要价值,能够快速构建交互式、可视化的应用。应用场景广泛,包括在线设计工具、游戏UI生成、艺术字体制作等。本文以开发一个原神风格字体生成器为例,深入探讨了如何利用Vue.js 3的Composition API管理复

weixin_30443731的博客 518

普通下载 && Vue文件图片下载处理

一般的下载,也就a标签加个链接地址,标签内加个download属性. 当地址是后端提供时:可通过创建a标签, 随即给a便签附下载链接,文件名和属性, 最后再创建点击效果,最后清楚生成的a标签. 再则是图片地址提供:可以通过Base64加canvas,对图片的下载可以进行处理. 下面就是相关方法处理函数 HTML与文件下载 HTML与文件下载 <a href="large.jpg" download>下载</a> 文件下载配合后端表格导出 export function dow

易函123 200

js 利用canvas + flv.js实现视频流 截屏 、本地下载功能实现

js 利用canvas + flv.js实现视频流 截屏 、本地下载功能实现 flv.js demo Your browser is too old which doesn't support HTML5 video. 开始 暂停 停止 跳转 截图 下载

thomas.he 2434

canvas下载图片方法

有个需求说要把网站上的图表可以保存到本地,查看了一下表单的元素,是canvas内的。 用了好多种方法,都失败了。最后搜到了stackoverflow上的一种方法成功导出,代码贴在下面 //canvas下载图片 exportCanvasAsPNG:function (id, fileName) { var canvasElement = document.getElementById(id); var MIME_TYPE = "image/png"; v

Edward_Cullens的博客 3773

下载canvas图片

【代码】下载canvas图片。

长缨缚苍龙 287
上一篇: 动态响应式进度条
下一篇: 页面监听-iframe子父页面信息传递与监听
异常的昵称
博客等级 码龄10年 18粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

异常的昵称

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值