HTML生成PDF上边留白,下边截取不全

import html2Canvas from 'html2canvas'
import JsPDF from 'jspdf'
const getPdf = async(dom, title) => {
    //将base64转换为文件对象
    function dataURLtoFile(dataurl, filename) {
        var arr = dataurl.split(',');
        var mime = arr[0].match(/:(.*?);/)[1];
        var bstr = atob(arr[1]);
        var n = bstr.length;
        var u8arr = new Uint8Array(n);
        while (n--) {
            u8arr[n] = bstr.charCodeAt(n);
        }
        //转换成file对象
        return new File([u8arr], filename, { type: mime });
        //转换成成blob对象
        //return new Blob([u8arr],{type:mime});
    }

    await new Promise((resolve, reject) => {
        try {
            // 避免模糊,放大倍数,倍数可调整
            const el = document.getElementById(dom) || document.querySelector(dom)
            var c = document.createElement('canvas')
            var opts = {
                scale: 3,
                canvas: c,
                allowTaint: false,
                logging: true,
                useCORS: true,
                width: window.getComputedStyle(el).width.replace('px', '') * 1,
                height: window.getComputedStyle(el).height.replace('px', '') * 1
            }
            c.width = window.getComputedStyle(el).width.replace('px', '') * 3
            c.height = window.getComputedStyle(el).height.replace('px', '') * 3
            c.getContext('2d').scale(1, 1)
            html2Canvas(el, opts).then(async canvas => {
                const contentWidth = canvas.width
                const contentHeight = canvas.height
                const pageHeight = (contentWidth / 592.28) * 1200.89
                let leftHeight = contentHeight
                let position = 0
                const imgWidth = 590.28
                const imgHeight = (550.28 / contentWidth) * contentHeight
                const pageData = await canvas.toDataURL('image/jpeg', 1.0)
                const PDF = await new JsPDF('', 'pt', 'a4')
                if (leftHeight < pageHeight) {
                    await PDF.addImage(pageData, 'JPEG', 0, 0, imgWidth, imgHeight)
                } else {
                    while (leftHeight > 0) {
                        await PDF.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight)
                        leftHeight -= pageHeight
                        position -= 841.89
                        if (leftHeight > 0) {
                            await PDF.addPage()
                        }
                    }
                }

                var buffer = PDF.output('dataurlstring');
                var base64 = buffer.split("base64,")[1];
                
                await PDF.save(title + '.pdf')



                resolve()


                // location.reload()
            })
        } catch (error) {
            reject(error)
        }
    })
}
export default getPdf

代码贴上,效果是点击按钮查找dom元素进行PDF生成并下载,title即是PDF文件名;问题来了,页面内容转PDF是正常无误的,但是有些时候生成出来的PDF会上边留白,下边截取不全,思考一番后觉得是PDF生成的高度导致的,调试了一下imgHeight后测试生成还是会有概率出现这问题。
想了很久没解决办法,直接百度一下,结果就是个很简单的问题,使用html2canvas时,页面必须在保持在最左上角,这样导出来的PDF整个模板才不会变形。
然后我用原生js一试,果然成功了,无论怎么生成都不会出现上边留白下边截取不全的情况。

//回到页面顶部
document.body.scrollTop = 0;
document.documentElement.scrollTop = 0;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值