核心:iframe页面加载完成后触发生成图片逻辑

<iframe
  ref="posterDown"
  :src="iframeUrl"
  style="width: 375px; height: 100%"
></iframe>
//当页面渲染完成时间
window.parent.postMessage({ msg: '渲染完成' }, '*')
//如果实在获取不到页面渲染完成时间可使用定时器
//
window.addEventListener(
    'message',
    () => {
      // 生成图片
      drawImg() 
    },
    false
  )
function drawImg() {
  const iframeHtml = posterDown.value.contentWindow
  const iframeScrollY = iframeHtml.document.documentElement.scrollTop
  const iframeScrollX = iframeHtml.document.documentElement.scrollLeft
  console.log(iframeHtml.scrollHeight, iframeScrollX, 'iframeHtml')
  html2canvas(posterDown.value.contentWindow.document.getElementsByTagName('body')[0], {
    allowTaint: true,
    scale: 2, // 生成图片的清晰度(越大越清晰,图片就越大)  1  2  3  4  5  6  7  8  9  10
    backgroundColor: '#f5f5f5', //海报的背景颜色
    useCORS: true, // 允许跨域
    width: 375, //生成海报的
    height: iframeHtml.scrollHeight, // height: 200 //生成海报的h    默认是px
    windowHeight: iframeHtml.scrollHeight,
    x: iframeScrollX,
    y: iframeScrollY
  }).then((canvas) => {
    let baseImg = canvas.toDataURL('image/png')
    let save = document.createElement('a')
    save.href = baseImg
    // 下载的名字
    save.download = '文件命名'
    save.click()
    ElMessage.success('生成成功')
  })
}

注:不想展示iframe但却需要下载图片时,可以将iframe页面层级调低,间接实现隐藏功能。

Last Updated:
Contributors: shenxin