You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

jsPDF结合html2canvas导出PDF页码乱序及修改原页样式问题求助

问题1:PDF页面顺序错乱

成因

你调用的html2canvas返回的是异步Promise对象,14个生成canvas的请求是并行触发的,渲染耗时短的请求会先完成,回调里往PDF插入页面的顺序也就跟着随机,和你代码写的先后顺序无关。

解决方案

用async/await控制执行顺序,同时可以用循环简化重复代码,参考修改后的代码:

$('#create_pdf').on('click', async function () {  
    $('body').scrollTop(0);                 
    await createPDF();  
});  

// create pdf
async function createPDF() {  
    const doc = new jsPDF({  
        unit: 'px',  
        format: 'a4'  
    });
    const pdfWidth = doc.internal.pageSize.width - 20;
    const pageCount = 14;

    // 按顺序处理1-14的div
    for(let i = 1; i <= pageCount; i++) {
        const currentDiv = $(`#thediv${i}`);
        const originalWidth = currentDiv.width();
        const originalMaxWidth = currentDiv.css('max-width');

        // 生成canvas
        const canvas = await getCanvas(document.querySelector(`#thediv${i}`), currentDiv);
        const img = canvas.toDataURL("image/png");
        const hratio = canvas.height / canvas.width;
        const pdfHeight = pdfWidth * hratio;

        doc.addImage(img, 'PNG', 10, 10, pdfWidth, pdfHeight);
        // 最后一页不用加空白页
        if(i !== pageCount) {
            doc.addPage(595, 842);
        }

        // 还原原div样式
        currentDiv.width(originalWidth).css('max-width', originalMaxWidth);
    }

    doc.autoPrint();
    window.open(doc.output('bloburl'));
}  


// create canvas object  
function getCanvas(link, currentDiv) {                  
    currentDiv.width((a4[0] * 1.33333) - 80).css('max-width', 'none');             
    return html2canvas(link, {  
        imageTimeout: 2000,  
        removeContainer: true  
    });  
}

问题2:原页面样式被修改

成因

你在getCanvas函数中直接修改了页面上原有div的width和max-width属性,生成canvas之后没有把属性还原,就会导致原页面显示变形。

解决方案

上面的修改代码里已经包含了对应修复:

  • 处理每个div之前先缓存它原本的宽度、最大宽度样式
  • 对应div的canvas生成完成之后,立刻把缓存的原样式赋值回去,还原页面显示

如果想完全不触碰原页面元素,可以采用离屏克隆的方案:把目标div克隆到一个position: fixed; left: -9999px; top: 0的隐藏容器里,修改克隆元素的样式生成canvas,用完直接删除克隆元素,原页面不会有任何样式变化。


内容的提问来源于stack exchange,提问作者Pamela Whittaker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 01:24:07