使用dom-to-image-more生成页面截图

项目场景

关于公司自研的低代码开发平台,产品在某个迭代版本里,要求增加设计成果的规范化导出,其中一环是需要在流程设计编辑器保存时,生成截图并上传,了解了几种实现方式后决定用dom-to-image-more来实现。

关于dom-to-image-more

dom-to-image-more是一个可以将任意DOM节点转换为矢量(SVG)或光栅(PNG或JPEG)图像的js库。

安装

/* 使用npm安装 */
npm install dom-to-image-more
/* 使用yarn安装 */
yarn add dom-to-image-more

引入

// 引入mixin,其中包括工程封装的rpc远程调用方法
import mixin from "@m/core/mixin";
// 引入dom-to-image-more暴露的对象,里面包含toJpeg、toPng、toSvg等方法
import domtoimage from 'dom-to-image-more';
// 引入base64转File格式的工具函数
import { base64toFile } from "@m/utils/file";

/**
 * base64转File
 * @param {*} dataUrl base64编码数据
 * @param {*} filename 文件名
 * @return {*}
 */
export function base64toFile(dataUrl, filename = 'file') {
  const arr = dataUrl.split(',');
  const mime = arr[0].match(/:(.*?);/)[1];
  // suffix是该文件的后缀
  const suffix = mime.split('/')[1];
  // atob 对经过 base-64 编码的字符串进行解码
  const bstr = atob(arr[1]);
  // n 是解码后的长度
  let n = bstr.length;
  // Uint8Array 数组类型表示一个 8 位无符号整型数组 初始值都是 数子0
  const u8arr = new Uint8Array(n);
  // charCodeAt() 方法可返回指定位置的字符的 Unicode 编码。这个返回值是 0 - 65535 之间的整数
  while (n--) {
    u8arr[n] = bstr.charCodeAt(n);
  }
  // new File返回File对象 第一个参数是 ArraryBuffer 或 Bolb 或Arrary 第二个参数是文件名
  // 第三个参数是 要放到文件中的内容的 MIME 类型
  return new File([u8arr], `${filename}.${suffix}`, {
    type: mime,
  });
}

使用

async save() {
  console.log("保存前的校验")
  // 生成流程截图并上传,在输出参数中获取服务器保存的图片地址
  const { uploadedFilePath } = await this.svg2Image()
  console.log("参数组装")
  console.log("调用保存流程图的接口")
},
async svg2Image() {
  const node = document.querySelector(".dom_class");
  return domtoimage.toPng(node).then(async (dataUrl) => {
    const uploadFile = base64toFile(dataUrl, "坤图")
    // 通过formData保存文件
    const formData = new FormData();
    formData.append('uploadFile', uploadFile);
    // 设置其他附带参数
    formData.append('sing', this.sing);
    formData.append('dance', this.dance);
    formData.append('rap', this.rap);
    formData.append('basketball', this.basketball);
    const res = await this.rpc.babybaby.uploadAssetImage(formData);
    return res
  })
  .catch(function (error) {
    console.error('crush on you!', error);
  });
},
  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值