html2canvas转pdf失败了?看我怎么做

html2canvas + jspdf 导出pdf失败?看我就对了


前言

作为一名优秀的咸鱼,我本着能不做就不做的原则下"集沙成石",昨天出现了一个不得不解决的bug。

我负责的其中一款项目是面向C端的。通过各种图、文、视频来展示宣传C端的优势,但是有的时候需要通过纸质的内容向C端的领导进行汇报,所以这里就用需要把页面元素转为PDF了。

之前通过`html2canvas`和`jspdf`已经实现了的,但是昨天突然有的人导出就不行了。。。,而且C端还急需向领导汇报。🙀🙀🙀🙀🙀🙀

问题

那能行吗? 作为一名优秀的咸鱼,怎么可以让客户着急呢。 打开客户端调试器一看,错误不就已经出现了吗,那肯定是jsPdf的问题了,更新插件总该行了吧,聪明如我😃😃😃

js 复制代码
Uncaught (in promise) Error: Supplied data is not a JPEG
    at getJpegSizeFromBytes (jsPdf.debug.js:4753:43)
    at jsPDFAPI.processJPEG (jsPdf.debug.js:4801:24)
    at jsPDFAPI.addImage (jsPdf.debug.js:4697:66)

呐~ 你肯定猜到了,更新之后没解决。。。

搞半天才发现这眼睛不好使啊,都明明白白的告诉我Supplied data is not a JPEG数据不是JPEG格式的

继续往上排查结果发现canvas画布在渲染dom页面的时候竟然都是空白的,我emo了...

js 复制代码
  html2canvas(this.dom, {

      backgroundColor: '#fff',

      canvas: c,

      useCORS: true,

    }).then((canvas) => {
         // canvas 竟然没有画面。。。。
         document.body.appendChild(canvas)

    })

方案

  • 排查之后发现之所以导致canvas画布空白,竟然是因为页面过长导致的。
  • 掘金stackoverflow都查看了一下都没有查到我需要的答案
  • 解决方案

最后,我只想到了一个办法,那就是使用canvas.scale方法根据可渲染的最大高度来对canvas进行缩放,降低画面的清晰度

这里需要注意一下在设置canvas的width和height的时候需要考虑当前像素比,不然会出现画面拉伸的问题。

js 复制代码
   /**
   * 创建并配置canvas的参数
   */
  configCanvas = function (h) {
    // 画板dom
    const canvasDom = document.createElement('canvas')
    canvasDom.style.backgroundColor = '#fff'
    canvasDom.style.width = this.fileW + 'px'
    canvasDom.style.height = h + 'px'

    const defaultSize = { // html2canvas的width和height默认需要设置为style.width .height的window.devicePixelRatio倍
      w: this.fileW * window.devicePixelRatio,
      h: h * window.devicePixelRatio
    }

    canvasDom.width = defaultSize.w
    canvasDom.height = defaultSize.h
    if (this.maxHeight < h) {
      // 根据实际高度和最大渲染高度来计算缩放
      domScale.h = Math.min(this.maxHeight / h, 1)
      canvasDom.height = domScale.h * defaultSize.h
    }


    // 画板
    const ctx = canvasDom.getContext('2d')
    ctx.scale(1, domScale.h)
    this.domRenderToCanvas(canvasDom)
  }

传送门:dom2pdf

相关推荐
benbenAItalk6 小时前
数字人口播视频的批量生产实践:素材规范、任务编排与质量验收
java·前端·音视频
2601_962885727 小时前
如何用 Python 扫描 A 股跳空缺口并统计缺口回补概率?
java·前端·python
西瓜太郎12347 小时前
Claude Code、Codex CLI、Gemini CLI 能否共用一枚 Key?先看协议选择矩阵
前端·api 网关·claude code·gemini cli·codex cli
陈随易9 小时前
在Finch用了62亿词元,我认为这是新一代Agent工具之神
前端·人工智能·后端
水域安全老周9 小时前
水趣钓鱼救生衣专利拆解:两级锁紧如何解决落水人衣分离
java·前端·网络
计算机魔术师10 小时前
Anthropic CEO突然喊踩刹车,OpenAI罕见力挺:AI这辆车不能只踩油门了
前端
wing9810 小时前
从codex转战workbuddy使用一周的感受
前端·人工智能·后端
EatFan10 小时前
Java接入支付宝 JSAPI 支付保姆教程(二):流程讲解与前后端代码讲解
前端·spring boot·后端·微信小程序·小程序·uni-app
梦想平凡11 小时前
百游棋牌源代码开发搭建教程(五):房间创建、座位分配与请求幂等实现
前端·javascript·数据库·源代码管理
IT_陈寒11 小时前
Redis的Set操作居然能把我的服务整挂了?
前端·人工智能·后端