当前位置: 首页 > news >正文

前端将DOM元素导出为图片

前端工作中经常会用到把一些元素导出,比如表格,正好项目有遇到导出为excel和导出为图片,就都封装实现了一下,以供其他需求的开发者使用:在这里插入图片描述

1.导出为文档

这个说白了就是下载的功能,传过去检索参数,按照结果下载下来,没啥说的,先上伪代码

  ....then(blob => {// 创建一个临时的URL,用于下载文件console.log("blob", blob)const url = window.URL.createObjectURL(new Blob([blob]));const link = document.createElement('a');link.href = url;link.setAttribute('download', `${xxx}.xls`);  //设置文件名字document.body.appendChild(link);link.click();document.body.removeChild(link);success()   //callbackdialog.close()  //close modal}).catch((err) => {})

记得请求添加 responseType: ‘blob’,或者headers设置Accept:‘application/vnd.ms-excel’

2.导出为图片

先说一下最终的方案,最后使用了html2canvas的方案,后面我会说一下我的实现思路

  // let element = 'ant-table'const table = document.querySelector('.xxx-table'); console.log("table :", table )html2canvas(table , { scale: 1 }).then(canvas => {  //scale是图片大小const dataUrl = canvas.toDataURL('image/png');const link = document.createElement('a');link.href = dataUrl;link.download = 'table.png';link.click();});

如果一个页面导出多个相同的元素,比如一个页面有2个table,将上方传入html2canvas的参数的table换成secondTable即可,如下

var tables = document.getElementsByClassName('ant-table');
var secondTable = tables[1]

多个元素是不能使用querySelector了, 因为querySelector只能选择单个元素,这里需要用其他的元素选择器,最好是class或者tagname等.

再先说一下我一开始实现的思路

  1. 一开始我用的是原生的canvas,创建canvas画布,设置大小等,
  2. 选择目标元素并cloneNode(true)深度拷贝目标节点下的全部后代元素
  3. 渲染元素到画布: 使用drawImage方法将克隆元素渲染到画布上。
  4. 元素被渲染到画布上后就可以使用toDataURL方法将画布内容导出为图片。
const imageUrl = canvas.toDataURL('image/png');

最后创建链接节点,自动点击,移除节点:

const downloadLink = document.createElement('a');
downloadLink.href = imageUrl;
downloadLink.download = 'element-image.png';
document.body.appendChild(downloadLink);
downloadLink.click();
document.body.removeChild(downloadLink);

这种方案肯定是正常的一个思路,但是一直报cloneNode()函数有问题,undefined还是找不到,不记得了,我以为不支持这个es比较新的函数,其实想解决还是可以,用原生非方法递归子节点和节点元数据。 另外还报canvas的问题。
项目太赶了,我直接pass了,使用了html2canvas的方案,有兴趣的可以去试试。

http://www.lryc.cn/news/361752.html

相关文章:

  • 变现 5w+,一个被严重低估的 AI 蓝海赛道,居然用这个免费的AI绘画工具就能做!
  • Ubuntu server 24 (Linux) 安装部署smartdns 搭建智能DNS服务器
  • 正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-24.5,6 SPI驱动实验-ICM20608 ADC采样值
  • 安装vllm的时候卡主:Collecting vllm-nccl-cu12<2.19,>=2.18 (from vllm)
  • O2O : Finetuning Offline World Models in the Real World
  • 嵌入式学习(Day:31 网络编程2:TCP)
  • 正则表达式 0.1v
  • 免费的仓库出入库管理软件有哪些?
  • python 办公自动化-生成ppt文本和图
  • 「动态规划」买卖股票的最佳时机
  • Java 并发编程面试二
  • 成功解决“ModuleNotFoundError: No Module Named ‘utils’”错误的全面指南
  • Nvidia Jetson/Orin +FPGA+AI大算力边缘计算盒子:公路智能巡检解决方案
  • 【Maxcompute】geohash转经纬度,经纬度转geohash,计算geohash九宫格
  • 【R语言基础】如何更新R版本
  • Python知识点10---函数
  • 有哪些挣钱软件一天能赚几十元?盘点十个能长期做下去的挣钱软件
  • CentOS7安装MySQL教程
  • 师彼长技以助己(3)逻辑思维
  • LeetCode:反转链表I
  • oracle linux7安装oracle11g0204
  • STM32--ADC
  • 【TB作品】msp430f149单片机,读取ds18b20温度,显示到数码管,串口发送温度到电脑
  • vue组合式和选项式
  • 使用OpenCV创建全景图像
  • Nios II 实现流水灯实验
  • Spring boot 随笔 1 DatasourceInitializer
  • vue3_组件间通信方式
  • mysql的锁(全局锁)
  • Spring Boot 整合开源 Tess4J库 实现OCR图片文字识别