尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
前端html2canvas结合print-js打印页面,并解决多余空白页问题
一、功能前端html2canvas打印 HTML页面局部打印二、代码结合print-js打印页面importhtml2canvasfromhtml2canvas;importprintJSfromprint-js;/** 打印*/consthandleDownloadasync(){console.log(inputRef.current.scrollWidth,inputRef.current.scrollWidth,inputRef.current.scrollHeight);constcanvasawaithtml2canvas(inputRef.current,{scrollX:0,// 水平滚动位置scrollY:0,// 垂直滚动位置width:inputRef.current.scrollWidth,// 截取的宽度height:inputRef.current.scrollHeight,// 截取的高度useCORS:true,// 启用跨域资源支持allowTaint:true,// 允许污染图像如果需要scale:1,// 缩放比例logging:true,// 开启日志输出以帮助调试backgroundColor: #fff,// 背景颜色如果需要透明背景});constdataURLcanvas.toDataURL(image/png);// 使用 printJS 打印图片printJS({printable:dataURL,type:image,scanStyles:false,base64:true,//方法1style:body{margin:0},//方法2需要调整,按需求修改body{margin:10px}边距style:media print { page {size: auto; margin: 0; } body{margin:10px},targetStyles:[*],});setAssignPersonType(false);};三、容易出现的问题场景打印指定页面元素html2canvas先转成图片再打印发现两页以上就会多出一页空白页边距的原因解决打印图片的时候设置下style属性设置body{margin:0}}或body{margin:10px},按照需求修改margin//方法1style:body{margin:0},//方法2需要调整style:media print { page {size: auto; margin: 0; } body{margin:10px; padding: 0;}},constelementinputRef.current;if(!element){message.error(打印元素不存在);return;}// 获取指定DOM元素的尺寸和位置信息,返回一个DOMRect对象constrectelement.getBoundingClientRect();constoriginalOverflowelement.style.overflow;constoriginalPositionelement.style.position;html2canvaswidth:element.scrollWidth,// 截取的宽度或用rectheight:element.scrollHeight,// 截取的高度或用rect// 确保所有内容都被渲染onclone:(clonedDoc){// 在克隆文档中设置样式以确保完整显示clonedDoc.documentElement.style.overflowvisible;clonedDoc.body.style.overflowvisible;},编译后// 恢复原始样式element.style.overfloworiginalOverflow;element.style.positionoriginalPosition;完整importhtml2canvasfromhtml2canvas;importprintJSfromprint-js;consthandleDownloadasync(){constelementinputRef.current;if(!element){message.error(打印元素不存在);return;}try{// 获取指定DOM元素的尺寸和位置信息,返回一个DOMRect对象constrectelement.getBoundingClientRect();constoriginalOverflowelement.style.overflow;constoriginalPositionelement.style.position;// 临时设置样式以确保完整渲染element.style.overflowvisible;element.style.positionrelative;constcanvasawaithtml2canvas(element,{width:element.scrollWidth,// 截取的宽度或用rectheight:element.scrollHeight,// 截取的高度或用rectscroll:true,// 捕获滚动区域scale:1,// 提高分辨率logging:true,// 开启日志useCORS:true,// 允许跨域图片allowTaint:true,// 允许污染画布backgroundColor:#ffffff,// 背景色// 确保所有内容都被渲染onclone:(clonedDoc){// 在克隆文档中设置样式以确保完整显示clonedDoc.documentElement.style.overflowvisible;clonedDoc.body.style.overflowvisible;},});// 恢复原始样式element.style.overfloworiginalOverflow;element.style.positionoriginalPosition;constdataURLcanvas.toDataURL(image/png);// 使用 printJS 打印图片printJS({printable:dataURL,type:image,scanStyles:false,base64:true,style:media print { page {size: auto; margin: 0; } body{margin:0px; padding: 0;}},targetStyles:[*],});setAssignPersonType(false);}catch(error){console.error(打印失败:,error);message.error(打印失败请重试);setAssignPersonType(false);}};2、handleDownloadasync(){constelementthis.sheetRef.current;if(!element)return;constoriginalOverflowelement.style.overflow;constoriginalPositionelement.style.position;// 临时展开元素使 html2canvas 能捕获全部内容element.style.overflowvisible;element.style.positionrelative;try{constcanvasawaithtml2canvas(element,{width:element.scrollWidth,height:element.scrollHeight,// scroll: true,useCORS:true,allowTaint:true,scale:1,logging:true,backgroundColor:#fff,onclone:(clonedDoc){clonedDoc.documentElement.style.overflowvisible;clonedDoc.body.style.overflowvisible;},});constdataURLcanvas.toDataURL(image/png);printJS({printable:dataURL,type:image,scanStyles:false,base64:true,style:media print { page {size: auto; margin: 0; } body{margin:0px}},targetStyles:[*],});}catch(error){console.error(打印失败:,error);message.error(打印失败请重试);}finally{// 恢复原始样式element.style.overfloworiginalOverflow;element.style.positionoriginalPosition;this.setState({handleDownloadType:false,});}};四、解决打印不全问题使用 scroll: false 避免滚动区域导致的截取问题正确计算元素尺寸优先使用 scrollWidth/scrollHeight通过 onclone 回调确保克隆文档中的元素完整显示
RELATED

相关推荐

基于Django的StockMing股票预测系统:从ORM建模到ECharts可视化全解析

基于Django的StockMing股票预测系统:从ORM建模到ECharts可视化全解析

简介:StockMing股票预测系统是基于Django框架的完整设计源码,面向Python Web开发者、金融数据分析人员以及机器学习实践者,解决从股票数据获取、预处理到价格预测、可视化展示的一站式落地问题。资源共计646个文件,包含334个JavaS…

📅 2026/10/11 19:20:26
Puppeteer 请求拦截完全指南:从基础拦截到 Cooperative Intercept Mode 协作式拦截

Puppeteer 请求拦截完全指南:从基础拦截到 Cooperative Intercept Mode 协作式拦截

Puppeteer 请求拦截完全指南&#xff1a;从基础拦截到 Cooperative Intercept Mode 协作式拦截 【免费下载链接】puppeteer JavaScript API for Chrome and Firefox 项目地址: https://gitcode.com/GitHub_Trending/puppeteer1/puppeteer </&#xff5c;&#xff5c;…

📅 2026/11/8 3:21:18
从JSON数据清洗到数据库导入:背单词词库建设的实战记录

从JSON数据清洗到数据库导入:背单词词库建设的实战记录

我原本以为&#xff0c;把几千个单词塞进数据库&#xff0c;最折磨人的环节是写 INSERT 语句&#xff0c;直到 danci 3 这个项目做到一半&#xff0c;我才发现自己幼稚得可爱。danci 是一个背单词工具&#xff0c;第三版的目标很简单&#xff1a;把散落在多个 JSON 文件里的几千…

📅 2026/10/6 1:04:11
MORE NEWS

更多资讯

📰

事业编中级电工证怎么考?学历不高也能拿,含金量不低!

事业编中级电工证怎么考?学历不高也能拿,含金量不低! 你是不是总觉得自己学历不高,报不了事业编中级电工证?其实不然,这证不是只给高学历人准备的,很多一线电工通过努力也能考下来。而且这个证的 含金量…

📰

滨州邹平怎么考电工证,实操考试心里没底怕挂科?这份干货帮你搞懂含金量

滨州邹平怎么考电工证,实操考试心里没底怕挂科?这份干货帮你搞懂含金量 实操考试心里没底怕挂科?你不是一个人。在滨州邹平,很多人第一次报考电工证时都担心自己会不会因为操作不熟练而挂科,尤其是在电工实操考试这个环节,很多学员因为缺乏经验或训练不…

📰

物业查电工证在哪考?证书过期了不知道怎么复审延期怎么办

物业查电工证在哪考?证书过期了不知道怎么复审延期怎么办 证书过期了不知道怎么复审延期?这是很多电工从业者,特别是像洛阳涧西区水利工程这样的岗位,最头疼的问题。很多人在拿到电工证之后,因为工作繁忙,忽略了证书的复审时间,直到单位检查或项目验收…

📰

电工证 南昌安监局全流程办理指南

电工证南昌安监局怎么考?内部消息教你避坑 你是不是也担心学历不高报不了电工证?别慌,我来给你透露个 内部消息 ,南昌安监局的电工证考试 对学历要求并不高 ,很多初中毕业的朋友都成功考过了,关键是你得选对报名渠道和培训机构。…

📰

工地电工证要考吗网上查询如何查到证件状态

工地电工证要考吗网上查询如何查到证件状态 实操考试心里没底怕挂科,这几乎是每个打算报考工地电工证的人的真实感受。特别是对于漯河的应届毕业生,刚走出校门就面临就业压力,工地电工证是否必须考?网上查询又该怎么操作?这些疑问直接关系到你能否顺利进…

📰

淮安市查低压电工证千万别踩坑,外省证怎么转过来全搞定

淮安市查低压电工证千万别踩坑,外省证怎么转过来全搞定 之前考的证在外省能不能转过来?这是很多在外地工作、想要在淮安本地执业的电工最关心的问题。别急,我来告诉你怎么 淮安市查低压电工证 ,以及怎么把外省证顺利转过来,千万别踩坑!…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬