html2canvas+jspdf转pdf中遇到的坑

html2canvas+jspdf转pdf中遇到的坑

项目背景 :{“vue”: “3.0.11”,,“jspdf”: “^2.4.0”, “html2canvas”: “^1.3.2”},,新增了html转pdf 需求。
像往常一样 百度->copy->完成,但是今天这个有点问题,就是pdf生成出来的时候总是少了一半。如图
然后就各种百度查看相似的问题,基本千篇一律,感觉都是一个人发的,然后其他人疯狂的copy转载。。。
后来实在没招了,就硬着头皮看了下源码,最后不知道怎么机缘巧合之下就试出来了,

const downloadPDF = () => {
      const dataStatistics = document.getElementById('dataStatistics') as HTMLElement;
      // 源码里面多减的宽高
      const height = dataStatistics.scrollHeight + 180;
      const width = dataStatistics.scrollWidth + 85;
      const params = {
        windowWidth: width,//问题跟这里的宽高有关
        windowHeight: height,//问题跟这里的宽高有关
      };
      nextTick(() => {
        html2canvas(dataStatistics, params).then((canvas) => {
          const imgWidth = 1280;//问题跟这里的宽高有关
          const imgHeight = canvas.height;//问题跟这里的宽高有关
          const pageData = canvas.t
在 Vue 中使用 `html2canvas` 和 `jspdf` 生成 PDF 时,可能会遇到内容分页截断的问题。这是因为 `html2canvas` 是将 HTML 元素渲染为 Canvas 图像,而 `jspdf` 则是将图像插入到 PDF 文档中。如果页面内容较长,PDF 会将图像截断并延续到下一页,而不是自动处理 HTML 内容的分页逻辑[^1]。 解决该问题的一种常见方法是手动控制分页,具体思路是: - 将 HTML 内容拆分为多个部分(例如按高度分割),每个部分分别渲染为独立的 Canvas 图像。 - 使用 `jspdf.jsPDF()` 创建新的 PDF 页面,并逐页添加对应的图像。 - 调整 `html2canvas` 的 `scrollY` 或 `windowHeight` 参数,以确保滚动内容可以正确截图。 以下是一个基于 Vue 的解决方案示例代码: ```javascript import html2canvas from 'html2canvas'; import jsPDF from 'jspdf'; export default { methods: { generatePDF() { const element = document.getElementById('content-to-export'); const pageHeight = 842; // A4 纸张高度(单位:px) const padding = 20; const scale = 2; html2canvas(element, { scale, useCORS: true, scrollY: -window.scrollY, windowHeight: document.body.scrollHeight, }).then(canvas => { const imgData = canvas.toDataURL('image/png'); const imgWidth = 595; // A4 宽度(单位:px) const imgHeight = (canvas.height * imgWidth) / canvas.width; let heightLeft = imgHeight; const doc = new jsPDF('p', 'px', 'a4'); let position = 0; while (heightLeft > 0) { doc.addImage(imgData, 'PNG', 0, position, imgWidth, imgHeight); heightLeft -= pageHeight; position -= pageHeight; if (heightLeft > 0) { doc.addPage(); } } doc.save('document.pdf'); }); }, }, }; ``` 此外,也可以考虑使用专门针对长文档导出优化的库,例如 `html2pdf.js`,它内部已经整合了 `html2canvas` 和 `jsPDF`,并且支持更高级的配置,如自动分页、PDF 格式设置等[^2]。 如果仍然希望使用 `vue-html2pdf` 这样的封装组件来简化开发流程,则可以直接利用其内置的 `paginate-elements-by-height` 配置项实现一定程度上的自动分页功能。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值