html2canvas 返回的toDataURL()數據為 data:,的解決方法


1.使用的場景是把html轉換成PDF保存下來,代碼:

/* eslint-disable */
import html2canvas from 'html2canvas';
import JsPDF from 'jspdf';

/**
 * @param  ele          要生成 pdf 的DOM元素(容器)
 * @param  padfName     PDF文件生成后的文件名字
 * */

function downloadPDF(ele, pdfName){

    let eleW = ele.offsetWidth;// 獲得該容器的寬
    let eleH = ele.offsetHeight;// 獲得該容器的高
    let eleOffsetTop = ele.offsetTop;  // 獲得該容器到文檔頂部的距離
    let eleOffsetLeft = ele.offsetLeft; // 獲得該容器到文檔最左的距離
    console.log(eleW,eleH,eleOffsetTop,eleOffsetLeft);
    var canvas = document.createElement("canvas");
    var abs = 0;
    let win_in = document.documentElement.clientWidth || document.body.clientWidth; // 獲得當前可視窗口的寬度(不包含滾動條)
    let win_out = window.innerWidth; // 獲得當前窗口的寬度(包含滾動條)
    console.log(win_out,win_in);
    if(win_out>win_in){
        abs = (win_out - win_in)/2;    // 獲得滾動條寬度的一半
    }
    canvas.width = eleW * 2;    // 將畫布寬&&高放大兩倍
    canvas.height = eleH * 2;

    var context = canvas.getContext("2d");
    context.scale(2, 2);
    context.translate(-eleOffsetLeft -abs, -eleOffsetTop);
    // 這里默認橫向沒有滾動條的情況,因為offset.left(),有無滾動條的時候存在差值,因此
    // translate的時候,要把這個差值去掉

    // html2canvas(element).then( (canvas)=>{ //報錯
    // html2canvas(element[0]).then( (canvas)=>{
    html2canvas( ele, {
        dpi: 300,
        // allowTaint: true,  //允許 canvas 污染, allowTaint參數要去掉,否則是無法通過toDataURL導出canvas數據的
        useCORS:true  //允許canvas畫布內 可以跨域請求外部鏈接圖片, 允許跨域請求。
    } ).then( (canvas)=>{
        var contentWidth = canvas.width;
        var contentHeight = canvas.height;
        //一頁pdf顯示html頁面生成的canvas高度;
        var pageHeight = contentWidth / 592.28 * 841.89;
        //未生成pdf的html頁面高度
        var leftHeight = contentHeight;
        //頁面偏移
        var position = 0;
        //a4紙的尺寸[595.28,841.89],html頁面生成的canvas在pdf中圖片的寬高
        var imgWidth = 595.28;
        var imgHeight = 595.28/contentWidth * contentHeight;
        var pageData = canvas.toDataURL('image/jpeg', 1.0);
        console.log(pageData);
        var pdf = new JsPDF('', 'pt', 'a4');
        //有兩個高度需要區分,一個是html頁面的實際高度,和生成pdf的頁面高度(841.89)
        //當內容未超過pdf一頁顯示的范圍,無需分頁
        if (leftHeight < pageHeight) {
            //在pdf.addImage(pageData, 'JPEG', 左,上,寬度,高度)設置在pdf中顯示;
            pdf.addImage(pageData, 'JPEG', 0, 0, imgWidth, imgHeight);
            // pdf.addImage(pageData, 'JPEG', 20, 40, imgWidth, imgHeight);
        } else {    // 分頁
            while(leftHeight > 0) {
                pdf.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight);
                leftHeight -= pageHeight;
                position -= 841.89;
                //避免添加空白頁
                if(leftHeight > 0) {
                    pdf.addPage();
                }
            }
        }
        //可動態生成
        pdf.save(pdfName);
    })
}
export default {
    downloadPDF
}

其中pageData打印出來 為 data:,

 var pageData = canvas.toDataURL('image/jpeg', 1.0);

主要原因 這個 要截圖的原dom元素this.$refs.imageWrapper沒有設置寬高,

getPdf() {
                let el = this.$refs.imageWrapper
                that.$lizhao.htmlToPdf.downloadPDF(this.$refs.imageWrapper,'aaa.pdf')
            }

設置下就解決


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM