国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Vue——printjs打印el-table,echarts等打印不全,異常解決

這篇具有很好參考價(jià)值的文章主要介紹了Vue——printjs打印el-table,echarts等打印不全,異常解決。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

PrintJs簡(jiǎn)單使用

PrintJs官網(wǎng)地址:https://printjs.crabbly.com/

1、可以從GitHub版本下載最新版本的Print.js:https://github.com/crabbly/Print.js/releases
2、npm 安裝

npm install print-js --save

更多參考:https://blog.csdn.net/sunxiaoju/article/details/126284860

echarts無(wú)法打印解決

修改print.js的getHtml,增加對(duì)canvas的處理,將echarts轉(zhuǎn)為圖片:

 getHtml: function () {
        var inputs = document.querySelectorAll('input');
        var textareas = document.querySelectorAll('textarea');
        var selects = document.querySelectorAll('select');
        var canvass = document.querySelectorAll('canvas');

        for (var k = 0; k < inputs.length; k++) {
            if (inputs[k].type == "checkbox" || inputs[k].type == "radio") {
                if (inputs[k].checked == true) {
                    inputs[k].setAttribute('checked', "checked")
                } else {
                    inputs[k].removeAttribute('checked')
                }
            } else if (inputs[k].type == "text") {
                inputs[k].setAttribute('value', inputs[k].value)
            } else {
                inputs[k].setAttribute('value', inputs[k].value)
            }
        }

        for (var k2 = 0; k2 < textareas.length; k2++) {
            if (textareas[k2].type == 'textarea') {
                textareas[k2].innerHTML = textareas[k2].value
            }
        }

        for (var k3 = 0; k3 < selects.length; k3++) {
            if (selects[k3].type == 'select-one') {
                var child = selects[k3].children;
                for (var i in child) {
                    if (child[i].tagName == 'OPTION') {
                        if (child[i].selected == true) {
                            child[i].setAttribute('selected', "selected")
                        } else {
                            child[i].removeAttribute('selected')
                        }
                    }
                }
            }
        }

 		//canvass echars圖表轉(zhuǎn)為圖片
        for (var k4 = 0; k4 < canvass.length; k4++) {
            var imageURL = canvass[k4].toDataURL("image/png");
            var img = document.createElement("img");
            img.src = imageURL;
            img.setAttribute('style', 'max-width: 100%;');
            img.className = 'isNeedRemove'
            canvass[k4].parentNode.insertBefore(img,canvass[k4].nextElementSibling);
        }
    },

el-table打印不全

方法一:修改print.js的getHtml方法,增加對(duì)表格的寬度處理
getHtml: function () {
        var inputs = document.querySelectorAll('input');
        var textareas = document.querySelectorAll('textarea');
        var selects = document.querySelectorAll('select');
        let cells = document.querySelectorAll('.cell');

        for (var k = 0; k < inputs.length; k++) {
            if (inputs[k].type == "checkbox" || inputs[k].type == "radio") {
                if (inputs[k].checked == true) {
                    inputs[k].setAttribute('checked', "checked")
                } else {
                    inputs[k].removeAttribute('checked')
                }
            } else if (inputs[k].type == "text") {
                inputs[k].setAttribute('value', inputs[k].value)
            } else {
                inputs[k].setAttribute('value', inputs[k].value)
            }
        }

        for (var k2 = 0; k2 < textareas.length; k2++) {
            if (textareas[k2].type == 'textarea') {
                textareas[k2].innerHTML = textareas[k2].value
            }
        }

        for (var k3 = 0; k3 < selects.length; k3++) {
            if (selects[k3].type == 'select-one') {
                var child = selects[k3].children;
                for (var i in child) {
                    if (child[i].tagName == 'OPTION') {
                        if (child[i].selected == true) {
                            child[i].setAttribute('selected', "selected")
                        } else {
                            child[i].removeAttribute('selected')
                        }
                    }
                }
            }
        }

        const tableNode = document.querySelectorAll('.el-table__header,.el-table__body');
        //el-table 打印不全的問(wèn)題
        for(let k6 = 0 ; k6 < tableNode.length ; k6++){
            const tableItem = tableNode[k6] ;
            tableItem.style.width = '100%';
            const  child = tableItem.childNodes;
            for (let i = 0; i < child.length; i++) {
                const  element = child[i];
                if(element.localName === 'colgroup'){
                    element.innerHTML = '';
                }
            }
        }
        //el-table 格子里面打印超過(guò)格子的問(wèn)題
        for(let k7 = 0 ; k7 < cells.length ; k7 ++){
            const cell = cells[k7] ;
            cell.style.width = '100%';
            cell.removeAttribute('style')
        }

        return this.dom.outerHTML;
    },
方法二:將el-table改為table

具體實(shí)現(xiàn)參考:https://blog.csdn.net/admin11196/article/details/116168923

方法三:結(jié)合html2Canvas將打印的頁(yè)面轉(zhuǎn)為圖片

這條同樣可以解決echarts不能打印問(wèn)題,算是萬(wàn)能之法了吧,相對(duì)前面幾種方式趕緊這個(gè)方法最簡(jiǎn)單,打印效果也比較理想。

1、首先需要安裝html2canvas 和print-js 插件并引入,配置請(qǐng)參考文檔:https://github.com/niklasvh/html2canvas
2、寫(xiě)一個(gè)打印公共方法:

//html轉(zhuǎn)圖片打?。ń鉀Qelement table打印不全的問(wèn)題)
import html2canvas from "html2canvas";
import printJS from "print-js";

/**
 * html轉(zhuǎn)圖片
 * @param printContent
 * @param callback
 */
export const html2Canvas = (printContent, callback) => {
  // 獲取dom 寬度 高度
  const width = printContent.clientWidth;
  const height = printContent.clientHeight;
  // 創(chuàng)建一個(gè)canvas節(jié)點(diǎn)
  const canvas = document.createElement("canvas");

  const scale = 4; // 定義任意放大倍數(shù),支持小數(shù);越大,圖片清晰度越高,生成圖片越慢。
  canvas.width = width * scale; // 定義canvas 寬度 * 縮放
  canvas.height = height * scale; // 定義canvas高度 *縮放
  canvas.style.width = width * scale + "px";
  canvas.style.height = height * scale + "px";
  canvas.getContext("2d").scale(scale, scale); // 獲取context,設(shè)置scale

  const scrollTop =
    document.documentElement.scrollTop || document.body.scrollTop; // 獲取滾動(dòng)軸滾動(dòng)的長(zhǎng)度
  const scrollLeft =
    document.documentElement.scrollLeft || document.body.scrollLeft; // 獲取水平滾動(dòng)軸的長(zhǎng)度

  html2canvas(printContent, {
    canvas,
    backgroundColor: null,
    useCORS: true,
    windowHeight: document.body.scrollHeight,
    scrollX: -scrollLeft, // 解決水平偏移問(wèn)題,防止打印的內(nèi)容不全
    scrollY: -scrollTop
    //background: "#ffffff", // 一定要添加背景顏色,否則出來(lái)的圖片,背景全部都是透明的
  })
    .then(canvas => {
      const url = canvas.toDataURL("image/png");
      //console.log("canvas url :" + url);
      callback({ url: url });
    })
    .catch(err => {
      console.error(err);
    });
};

/**
 * 用printJs打印圖片
 * @param url
 * @param callback
 */
export const printImg = (url, callback) => {
  printJS({
    printable: url,
    type: "image",
    documentTitle: "", // 標(biāo)題
    style: "@page{size:auto;margin: 1cm ;}", // 去除頁(yè)眉頁(yè)腳
    onStart: () => {
      console.log("打印開(kāi)始");
    },
    onEnd: () => {
      console.log("打印完成");
    }
  });
};

/**
 * html轉(zhuǎn)圖片打印
 * @param dom
 * @param callback
 */
export const html2CanvasPrint = (dom, callback) => {
  //1、html轉(zhuǎn)圖片
  html2Canvas(dom, canvasRes => {
    //2、打印圖片
    printImg(canvasRes.url, callback);
  });
};

3、調(diào)用方法:

html2Canvas(this.$refs.printDom, res => {
	this.printDomUrl = res.url;
	printImg(res.url, printRes => {});
});

更多內(nèi)容參考:https://blog.csdn.net/weixin_40466351/article/details/115908035

注意:遇到大坑啊,html轉(zhuǎn)圖片的方式在windows上面打印預(yù)覽沒(méi)有任何問(wèn)題,但是在Mac上面所有的字體間距均被放大,頁(yè)面簡(jiǎn)直錯(cuò)的離譜啊,無(wú)奈又換回方法二,通過(guò)調(diào)整dom打印縮放解決了。

具體方法如下:

  1. 修改print.js的getHtml方法,參考方法一的內(nèi)容;

  2. 在開(kāi)始打印前縮小dom的尺寸;打印結(jié)束后恢復(fù)dom的原尺寸;

    print.js監(jiān)聽(tīng)打印預(yù)覽的關(guān)鍵代碼:

const Print = function (dom, options) {
    if (!(this instanceof Print)) return new Print(dom, options);

    this.options = this.extend({
        'noPrint': '.no-print',
        onStart: function () {},//打印開(kāi)始監(jiān)聽(tīng)回調(diào)
        onEnd: function () {}//打印結(jié)束監(jiān)聽(tīng)回調(diào)(打印預(yù)覽中點(diǎn)擊“打印”或“取消”都可以回調(diào))
    }, options);

    if ((typeof dom) === "string") {
        this.dom = document.querySelector(dom);
    } else {
        this.isDOM(dom)
        this.dom = this.isDOM(dom) ? dom : dom.$el;
    }

    this.init();
};

toPrint: function (frameWindow) {
	let _this = this;
	try {
	    setTimeout(function () {
	        frameWindow.focus();
	        typeof _this.options.onStart === 'function' && _this.options.onStart();
	        try {
	            if (!frameWindow.document.execCommand('print', false, null)) {
	                frameWindow.print();
	            }
	        } catch (e) {
	            frameWindow.print();
	        }
	        typeof _this.options.onEnd === 'function' && _this.options.onEnd();
	        frameWindow.close();
	    }, 10);
	} catch (err) {
	    console.log('err', err);
	}
    },

核對(duì)你的print.js文件是否包含了上述監(jiān)聽(tīng)回調(diào)的內(nèi)容,沒(méi)有的話(huà)自行加上。
打印過(guò)程修改dom尺寸方法:

//由于打印內(nèi)容寬度過(guò)大,所以打印前先將dom縮小,打印完成之后恢復(fù)原尺寸
this.$refs.printDom.style.zoom = 0.6;

this.$print(this.$refs.printDom, {
  type: "html",
  documentTitle: "", // 標(biāo)題
  style: "@page{size:auto;margin: 1cm ; size: }", // 去除頁(yè)眉頁(yè)腳
  onStart: () => {
    console.log("打印開(kāi)始");
  },
  onEnd: () => {
    console.log("打印完成");
    this.$refs.printDom.style.zoom = 1;
  }
});

最后還需注意一個(gè)點(diǎn),你的打印內(nèi)容遇到分頁(yè)時(shí)如果出現(xiàn)被截?cái)?/code>的情況下,需要處理下,在任何你不想截?cái)嗟哪K中加上如下css代碼即可;

//避免打印截?cái)?page-break-inside: avoid;
page-break-after: avoid;
page-break-before: avoid;

擴(kuò)展:修改打印表格樣式

參考:https://blog.csdn.net/huyande123/article/details/103423362
簡(jiǎn)單總結(jié)的說(shuō)下:頁(yè)面打印樣式缺失可能是打印時(shí)新建的一個(gè)dom對(duì)象沒(méi)有將原來(lái)的頁(yè)面樣式傳遞過(guò)來(lái),可以通過(guò)將一些相關(guān)的CSS傳遞到document.write()方法中的新窗口來(lái)解決這個(gè)問(wèn)題。
關(guān)鍵代碼:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-455029.html

var divToPrint = document.getElementById('box');
var htmlToPrint = '' +
    '<style type="text/css">' +
        'table {'+
        'border-right:1px solid #000;' +
        'border-bottom:1px solid #000;'+
        '}' +
        'table td{'+
            'border-left:1px solid #000;'+
            'border-top:1px solid #000'+
        '}'+
    '</style>';
htmlToPrint += divToPrint.outerHTML;
newWin = window.open("");
newWin.document.write(htmlToPrint);
newWin.print();
newWin.close();

到了這里,關(guān)于Vue——printjs打印el-table,echarts等打印不全,異常解決的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【詳解|徹底搞懂el-table和列表過(guò)濾】vue列表過(guò)濾和el-table的實(shí)現(xiàn)

    【詳解|徹底搞懂el-table和列表過(guò)濾】vue列表過(guò)濾和el-table的實(shí)現(xiàn)

    vue列表過(guò)濾 el-table的理解 先來(lái)看一段代碼: chatGPT 的理解真的很6: 這段代碼使用了 Element UI 的組件,創(chuàng)建了一個(gè)表格列組件 el-table-column,并為它設(shè)置了一些屬性和插槽。 各種屬性: 名稱(chēng) 作用 prop 指定了該列綁定的數(shù)據(jù)對(duì)象的屬性名為 warehouseName label 指定了該列的列名為 “

    2024年02月11日
    瀏覽(20)
  • vue封裝el-table表格組件

    vue封裝el-table表格組件

    先上效果圖: 本文包含了具名插槽、作用域插槽、jsx語(yǔ)法三種: Render.vue( 很重要,必須有 ): Table.vue 使用Table組件

    2024年02月20日
    瀏覽(29)
  • vue el-table實(shí)現(xiàn)動(dòng)態(tài)表頭

    vue el-table實(shí)現(xiàn)動(dòng)態(tài)表頭

    眾所周知,element-ui中有一個(gè)表格組件el-table,用于展示多條結(jié)構(gòu)類(lèi)似的數(shù)據(jù)。之前遇到過(guò)一個(gè)需求,要手動(dòng)控制el-table的表頭顯示。就是假如table表格一共有10列數(shù)據(jù),可以通過(guò)設(shè)置勾選,決定顯示多少列。 為了代碼的復(fù)用性,將配置頁(yè)面單獨(dú)抽成了組件,所以代碼中會(huì)有組件

    2024年02月12日
    瀏覽(25)
  • Vue3 el-table 單選

    解決方式:給每個(gè)表格加上唯一key值

    2024年02月11日
    瀏覽(24)
  • vue+el-table實(shí)現(xiàn)展開(kāi)與折疊

    本文會(huì)提到兩種實(shí)現(xiàn)方法,之前我使用的是第一種,后來(lái)加了固定列,發(fā)現(xiàn)展開(kāi)與折疊失效,故而出現(xiàn)了第二種方法。 一、通過(guò)class名稱(chēng)獲取節(jié)點(diǎn),并對(duì)節(jié)點(diǎn)進(jìn)行操作(該方法表格添加固定列會(huì)失效) 1.全部展開(kāi) 2.全部折疊 二、通過(guò)el-table中的 toggleRowSelection方法來(lái)實(shí)現(xiàn)展開(kāi)與

    2024年02月14日
    瀏覽(26)
  • vue模擬el-table演示插槽用法

    vue模擬el-table演示插槽用法

    很多人知道插槽分為三種,但是實(shí)際到elementui當(dāng)中為什么這么用,就一臉懵逼,接下來(lái)就跟大家聊一聊插槽在elementui中的應(yīng)用,并且自己寫(xiě)一個(gè)類(lèi)似el-table的組件 vue的slot分為三種::匿名插槽,具名插槽, 作用域插槽,主要作用:讓父組件可以向子組件指定位置插入 html 結(jié)構(gòu)

    2024年02月06日
    瀏覽(19)
  • vue el-table 多選框回填

    vue el-table 多選框回填

    主要代碼: 效果: html js

    2024年01月18日
    瀏覽(26)
  • vue+elementUI el-table實(shí)現(xiàn)單選
  • vue + el-table點(diǎn)擊表頭改變其當(dāng)前樣式

    vue + el-table點(diǎn)擊表頭改變其當(dāng)前樣式

    廢話(huà)不多說(shuō),先看效果: 網(wǎng)上找了一大圈沒(méi)有符合的,只能自己看著搞: 直接貼代碼: 這種寫(xiě)法經(jīng)使用過(guò)程中發(fā)現(xiàn)問(wèn)題,故修改為以下:

    2024年02月13日
    瀏覽(21)
  • 【vue】el-table實(shí)現(xiàn)動(dòng)態(tài)添加行和列

    實(shí)現(xiàn)思路: 最近遇到一個(gè)動(dòng)態(tài)增加行和列的需求,本來(lái)拿到需求的時(shí)候想用el-table中自帶的方法去實(shí)現(xiàn)的,但是經(jīng)過(guò)嘗試發(fā)現(xiàn)不能滿(mǎn)足想要實(shí)現(xiàn)的需求。沒(méi)辦法只能在el-table的基礎(chǔ)上自己寫(xiě)原生。 大概思路如下: 1.首先把table中需要?jiǎng)討B(tài)增加的行和列分開(kāi),分別定義一個(gè)數(shù)組

    2024年02月11日
    瀏覽(19)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包