前端html2canvas结合print-js打印页面,并解决多余空白页问题

发布时间:2026/9/8 19:33:24

前端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 回调确保克隆文档中的元素完整显示

相关新闻

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

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

2026/9/8 19:33:24

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

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

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

2026/9/8 19:33:24

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

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

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

2026/9/8 19:33:24

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

静态链接库与动态链接库 详解

静态链接库与动态链接库 详解

2026/9/8 20:23:26

前言&#xff1a;在软件开发中&#xff0c;库&#xff08;Library&#xff09;是预先编译好的可重用代码集合&#xff0c;开发者可以将其直接集成到自己的程序中&#xff0c;从而避免从零开始编写所有功能。据链接方式的不同&#xff0c;库主要分为静态库和动态库两大类。理解它…

使用 create-twenty-app 脚手架创建 Twenty 应用:从项目生成、OAuth 认证到首次同步的完整指南

使用 create-twenty-app 脚手架创建 Twenty 应用:从项目生成、OAuth 认证到首次同步的完整指南

2026/9/8 20:23:26

使用 create-twenty-app 脚手架创建 Twenty 应用&#xff1a;从项目生成、OAuth 认证到首次同步的完整指南 【免费下载链接】twenty The open alternative to Salesforce, designed for AI. 项目地址: https://gitcode.com/GitHub_Trending/tw/twenty 导读 Twenty 应用…

tiny11builder 精简 Windows 11 镜像构建:4 步从环境到 tiny11.iso

tiny11builder 精简 Windows 11 镜像构建:4 步从环境到 tiny11.iso

2026/9/8 20:23:26

tiny11builder 精简 Windows 11 镜像构建&#xff1a;4 步从环境到 tiny11.iso 【免费下载链接】tiny11builder Scripts to build a trimmed-down Windows 11 image. 项目地址: https://gitcode.com/GitHub_Trending/ti/tiny11builder 想要一台干净的 Windows 11&#x…

Pathway 自定义 Python Connector 实战:用 `ConnectorSubject` 把 Twitter 等任意流式数据接入实时数据管道

Pathway 自定义 Python Connector 实战:用 `ConnectorSubject` 把 Twitter 等任意流式数据接入实时数据管道

2026/9/8 20:23:26

Pathway 自定义 Python Connector 实战&#xff1a;用 ConnectorSubject 把 Twitter 等任意流式数据接入实时数据管道 【免费下载链接】pathway Python ETL framework for stream processing, real-time analytics, LLM pipelines, and RAG. 项目地址: https://gitcode.com/G…

res-downloader 快速上手指南

res-downloader 快速上手指南

2026/9/8 20:23:26

res-downloader 快速上手指南 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 你有没有遇到过&#xff1a;视频号里一个特别好…

LangChain核心三件事:链式抽象、Agent组件与LangGraph编排

LangChain核心三件事:链式抽象、Agent组件与LangGraph编排

2026/9/8 20:13:26

这两年做 AI 应用开发&#xff0c;如果你还没碰过 LangChain 生态&#xff0c;那确实有点说不过去了。从最简单的“把 Prompt 接到大模型上”到复杂的多步骤工作流、智能体系统&#xff0c;LangChain 几乎把开发过程中的方方面面都抽象成了可组合的模块。但问题也出在这&#x…

中国人民大学杨琳团队《Nature Communications》 | 全球潮汐湿地土壤有机碳时空格局与环境驱动:一项2009-2020年的全球评估

中国人民大学杨琳团队《Nature Communications》 | 全球潮汐湿地土壤有机碳时空格局与环境驱动:一项2009-2020年的全球评估

2026/9/7 20:21:46

本文首发于“生态学者”&#xff01;从“湿地面积”到“土壤碳密度”&#xff1a;为什么需要重新认识潮汐湿地蓝碳变化&#xff1f;潮汐湿地位于陆地与海洋的交汇地带&#xff0c;包括红树林、盐沼和潮滩&#xff0c;是全球重要的蓝碳生态系统。其土壤能够长期储存大量有机碳&a…

adb抓包

adb抓包

2026/9/8 4:55:53

前言 本文介绍如何通过 tcpdump 在 Android 手机上抓取网络数据包&#xff0c;并在电脑端使用 Wireshark 进行分析。适用于需要排查 App 网络请求、分析接口调用或调试网络问题的开发与测试场景。1. 手机要有 root 权限2. 下载 tcpdump3. adb push C:\Users\zhangkuixun\Downlo…

大模型推理镜像极简瘦身:从 25GB 巨无霸到 3GB 精简镜像实战

大模型推理镜像极简瘦身:从 25GB 巨无霸到 3GB 精简镜像实战

2026/9/7 8:03:37

大模型推理镜像极简瘦身&#xff1a;从 25GB 巨无霸到 3GB 精简镜像实战 在云原生基础设施中&#xff0c;容器镜像体积直接决定了服务的部署速度与弹性扩容敏捷度。对于传统的 Go / Java 微服务&#xff0c;镜像体积通常被严格控制在 50MB 到 200MB 以内&#xff0c;拉取镜像只…

芯片良率波动可视化:动画拆解工艺因果,重建客户信任

芯片良率波动可视化:动画拆解工艺因果,重建客户信任

2026/9/8 0:02:30

芯片这个行业有个不太被人摆到台面上、但几乎每天都在发生的场景&#xff1a;客户拿着一条良率曲线截图问你&#xff0c;这批货的良率怎么掉了三个点&#xff0c;是不是工艺出问题了&#xff0c;产生的不良会不会流到他们产线上去。你解释了半天&#xff0c;客户似懂非懂&#…

PyTorch DataLoader参数冲突:sampler与shuffle互斥的根源与正确写法

PyTorch DataLoader参数冲突:sampler与shuffle互斥的根源与正确写法

2026/9/8 0:02:30

ValueError: sampler option is mutually exclusive with shuffle&#xff0c;这个报错我在 PyTorch 的 DataLoader 上至少见过几十次了&#xff0c;而且很有意思的是&#xff0c;它经常不是新手专属——很多写了好几年模型的老手&#xff0c;在从单机改成自定义采样器&#xf…

中国车企再破谣言,GAC吉利零跑获欧盟安全五星

中国车企再破谣言,GAC吉利零跑获欧盟安全五星

2026/9/8 0:02:30

有人可能在网上开着皮卡拍视频&#xff0c;声称中国电动车不仅性能不如美国大排量车型&#xff0c;安全性也堪忧。然而事实恰恰相反&#xff0c;GAC、吉利和零跑最新推出的电动车型在极为严苛的欧盟新车安全评鉴&#xff08;Euro NCAP&#xff09;测试中全部斩获满分。就在特斯…

远程协作的工作台整理

远程协作的工作台整理

2026/9/8 4:23:39

远程协作的工作台整理远程协作的核心不是再加一个工具&#xff0c;而是让交接信息足够完整。异步任务要写明目标、输入位置、完成标准和需要决策的人。 工作台的最小配置 将日程、待办、代码和沟通入口收拢到少数固定位置&#xff1b;通知按紧急程度分层。工作台不需要模仿办公…

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

2026/9/8 3:19:39

持续集成 流水线自动化与 声明式交付 实践&#xff1a;原型怎样变成可用功能分类&#xff1a;[AI/大模型]细分主题&#xff1a;AI 增强型 CI/CD 流水线自动化与 GitOps 实践&#xff1a;Agent 工作流、工具调用与任务拆解&#xff1a;从原型到生产的验收清单很多团队在尝试用大…

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

2026/9/8 4:00:23

容器编排 生产环境运维与排障实战&#xff1a;复盘记录怎样真正派上用场分类&#xff1a;[工程技术]细分主题&#xff1a;Kubernetes 生产环境运维与排障实战&#xff1a;可复制的项目复盘模板与决策记录大部分团队的事故复盘报告&#xff0c;最后都变成了躺在 Confluence 或钉…