vue 下載PDF格式文檔

超級(jí)簡(jiǎn)單的pdf格式下載文檔艾疟,純前端實(shí)現(xiàn)

  1. npm 下載
npm install html2canvas --save
npm install jspdf --save
  1. 首先直接粘貼代碼,到 utils.js 里的 htmlToPDF.js 文件
// 導(dǎo)出頁(yè)面為PDF格式
import html2Canvas from 'html2canvas';
import JsPDF from 'jspdf';
export default {
  install(Vue, options) {
    /**
     * @function pdf格式導(dǎo)出犬性,不帶分頁(yè)泥耀,長(zhǎng)圖導(dǎo)出
     * @params ele 要下載的dom
     * @params info 報(bào)告用戶(hù)信息
     * ***/
    Vue.prototype.getPdf = function (ele, info) {
      setTimeout(() => {
        var loadingInstance = this.$loading({
          lock: true,
          text: 'Loading',
          spinner: 'el-icon-loading',
          background: 'rgba(0, 0, 0, 0.7)'
        });
        var width = ele.offsetWidth; //獲取dom 寬度
        var height = ele.offsetHeight; //獲取dom 高度

        ele.style.height = height + 200 + "px";
        ele.style.paddingTop = 60 + "px";

        ele.style.backgroundColor = '#060400';
        ele.style.zIndex = '-1';
        // ele.style.position = 'absolute';
        // ele.style.top = '0';

        var canvas = document.createElement("canvas"); //創(chuàng)建一個(gè)canvas節(jié)點(diǎn)
        var scale = 4; //定義任意放大倍數(shù) 支持小數(shù)
        canvas.width = width * scale; //定義canvas 寬度 * 縮放神郊,在此我是把canvas放大了2倍
        canvas.height = height * scale; //定義canvas高度 *縮放
        canvas.getContext("2d") //獲取context,設(shè)置scale

        document.body.scrollTop = 0; // IE的
        document.documentElement.scrollTop = 0; // 其他
        ele.scrollTop = 0;
        html2Canvas(ele, {
          useCORS: true,
          allowTaint: true

        }).then(function (canvas) {
          var context = canvas.getContext("2d");
          // 【重要】關(guān)閉抗鋸齒
          context.mozImageSmoothingEnabled = false;
          context.webkitImageSmoothingEnabled = false;
          context.msImageSmoothingEnabled = false;
          context.imageSmoothingEnabled = false;

          var imgData = canvas.toDataURL("image/jpeg", 1.0); //轉(zhuǎn)化成base64格式,可上網(wǎng)了解此格式
          var img = new Image();
          img.src = imgData;
          img.onload = function () {
            img.width = img.width / scale; //因?yàn)樵谏厦娣糯罅?倍迅办,生成image之后要/2
            img.height = img.height / scale;
            img.style.transform = "scale(0.5)";
            if (this.width > this.height) {
              //此可以根據(jù)打印的大小進(jìn)行自動(dòng)調(diào)節(jié)
              var doc = new JsPDF("l", "mm", [
                this.width * 0.5,
                this.height * 0.5
              ]);
            } else {
              var doc = new JsPDF("p", "mm", [
                this.width * 0.55,
                this.height * 0.55
              ]);
            }
            doc.addImage(
              imgData,
              "jpeg",
              0,
              0,
              this.width * 0.55,
              this.height * 0.55
            );
            doc.save(`${info.name}-${info.code}-${info.title}.pdf`);
          };
        });
        ele.style.height = height + "px";
        ele.style.paddingTop = 0 + "px";
        loadingInstance.close()
      }, 500);
    };
    /**
  * @function pdf格式導(dǎo)出宅静,帶分頁(yè),a4紙標(biāo)準(zhǔn)
  * @params ele 要下載的dom
  * @params pdfName 報(bào)告用戶(hù)信息
  * ***/
    Vue.prototype.getPdfPage = function (ele, info) {
      setTimeout(() => {
        let eleW = ele.offsetWidth;// 獲得該容器的寬
        let eleH = ele.offsetHeight;// 獲得該容器的高
        let eleOffsetTop = ele.offsetTop;  // 獲得該容器到文檔頂部的距離
        let eleOffsetLeft = ele.offsetLeft; // 獲得該容器到文檔最左的距離

        var canvas = document.createElement("canvas");
        var abs = 0;

        let win_in = document.documentElement.clientWidth || document.body.clientWidth; // 獲得當(dāng)前可視窗口的寬度(不包含滾動(dòng)條)
        let win_out = window.innerWidth; // 獲得當(dāng)前窗口的寬度(包含滾動(dòng)條)

        if (win_out > win_in) {
          // abs = (win_o - win_i)/2;    // 獲得滾動(dòng)條長(zhǎng)度的一半
          abs = (win_out - win_in) / 2;    // 獲得滾動(dòng)條寬度的一半
          // console.log(a, '新abs');
        }
        canvas.width = eleW * 2;    // 將畫(huà)布寬&&高放大兩倍
        canvas.height = eleH * 2;

        var context = canvas.getContext("2d");
        context.scale(2, 2);
        context.translate(-eleOffsetLeft - abs, -eleOffsetTop);
        // 這里默認(rèn)橫向沒(méi)有滾動(dòng)條的情況站欺,因?yàn)閛ffset.left(),有無(wú)滾動(dòng)條的時(shí)候存在差值姨夹,因此
        // translate的時(shí)候,要把這個(gè)差值去掉
        html2Canvas(ele, {
          dpi: 300,
          // allowTaint: true,  //允許 canvas 污染矾策, allowTaint參數(shù)要去掉磷账,否則是無(wú)法通過(guò)toDataURL導(dǎo)出canvas數(shù)據(jù)的
          useCORS: true  //允許canvas畫(huà)布內(nèi) 可以跨域請(qǐng)求外部鏈接圖片, 允許跨域請(qǐng)求。
        }).then((canvas) => {
          var contentWidth = canvas.width;
          var contentHeight = canvas.height;
          //一頁(yè)pdf顯示html頁(yè)面生成的canvas高度;
          var pageHeight = contentWidth / 592.28 * 841.89;
          //未生成pdf的html頁(yè)面高度
          var leftHeight = contentHeight;
          //頁(yè)面偏移
          var position = 0;
          //a4紙的尺寸[595.28,841.89]贾虽,html頁(yè)面生成的canvas在pdf中圖片的寬高
          var imgWidth = 595.28;
          var imgHeight = 592.28 / contentWidth * contentHeight;
          var pageData = canvas.toDataURL('image/jpeg', 1.0);
          var pdf = new JsPDF('', 'pt', 'a4');
          //有兩個(gè)高度需要區(qū)分逃糟,一個(gè)是html頁(yè)面的實(shí)際高度,和生成pdf的頁(yè)面高度(841.89)
          //當(dāng)內(nèi)容未超過(guò)pdf一頁(yè)顯示的范圍,無(wú)需分頁(yè)
          if (leftHeight < pageHeight) {
            //在pdf.addImage(pageData, 'JPEG', 左绰咽,上蛉抓,寬度,高度)設(shè)置在pdf中顯示剃诅;
            pdf.addImage(pageData, 'JPEG', 0, 0, imgWidth, imgHeight);
            // pdf.addImage(pageData, 'JPEG', 20, 40, imgWidth, imgHeight);
          } else {    // 分頁(yè)
            while (leftHeight > 0) {
              pdf.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight);
              leftHeight -= pageHeight;
              position -= 841.89;
              //避免添加空白頁(yè)
              if (leftHeight > 0) {
                pdf.addPage();
              }
            }
          }
          //可動(dòng)態(tài)生成
          pdf.save(`${info.name}-${info.code}-${info.title}.pdf`);
        })
      }, 50);
    }
  }
}
  1. 在main.js 文件里引用文件并使用
import htmlToPdf from '@/utils/download-pdf.js'
Vue.use(htmlToPdf)
  1. 頁(yè)面使用

html文件

<div id="pdfDom">
  XXX
</div>
<button @click="importPdf">導(dǎo)出報(bào)告 </button>

js 文件

  // 導(dǎo)出pdf
importPdf() {
      let params = {
        title: '報(bào)告',
        name: "zhudying",
        code: "001"
      }
      let html = document.getElementById('pdfDom')
      this.getPdf(html, params)
    },

打印功能請(qǐng)參考文章 http://www.reibang.com/p/cf606ebcf095
下載word文檔格式(可帶圖片)參考文章 http://www.reibang.com/p/3f2ec1e1fa92
下載表格功能,參考文章http://www.reibang.com/p/f95beb80b3cf

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末驶忌,一起剝皮案震驚了整個(gè)濱河市矛辕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌付魔,老刑警劉巖聊品,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異几苍,居然都是意外死亡翻屈,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)妻坝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)伸眶,“玉大人,你說(shuō)我怎么就攤上這事刽宪±逶簦” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵圣拄,是天一觀的道長(zhǎng)嘴秸。 經(jīng)常有香客問(wèn)我,道長(zhǎng)庇谆,這世上最難降的妖魔是什么岳掐? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮饭耳,結(jié)果婚禮上串述,老公的妹妹穿的比我還像新娘。我一直安慰自己哥攘,他們只是感情好剖煌,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著逝淹,像睡著了一般耕姊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上栅葡,一...
    開(kāi)封第一講書(shū)人閱讀 51,718評(píng)論 1 305
  • 那天茉兰,我揣著相機(jī)與錄音,去河邊找鬼欣簇。 笑死规脸,一個(gè)胖子當(dāng)著我的面吹牛坯约,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播莫鸭,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼闹丐,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了被因?” 一聲冷哼從身側(cè)響起卿拴,我...
    開(kāi)封第一講書(shū)人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎梨与,沒(méi)想到半個(gè)月后堕花,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡粥鞋,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年缘挽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片呻粹。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡壕曼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出尚猿,到底是詐尸還是另有隱情窝稿,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布凿掂,位于F島的核電站伴榔,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏庄萎。R本人自食惡果不足惜踪少,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望糠涛。 院中可真熱鬧援奢,春花似錦、人聲如沸忍捡。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)砸脊。三九已至具篇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間凌埂,已是汗流浹背驱显。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人埃疫。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓伏恐,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親栓霜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子翠桦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 概要 64學(xué)時(shí) 3.5學(xué)分 章節(jié)安排 電子商務(wù)網(wǎng)站概況 HTML5+CSS3 JavaScript Node 電子...
    阿啊阿吖丁閱讀 9,209評(píng)論 0 3
  • 前端必讀:瀏覽器內(nèi)部工作原理[https://kb.cnblogs.com/page/129756/] 作者: T...
    我是強(qiáng)強(qiáng)閱讀 1,149評(píng)論 0 2
  • vue-cli3項(xiàng)目搭建配置以及性能優(yōu)化 在之前的開(kāi)發(fā)中主要用的是vue-cli2,最近空閑時(shí)間比較多胳蛮,接下來(lái)有新...
    bayi_lzp閱讀 19,483評(píng)論 16 68
  • 今天是2017年4月10日秤掌,一個(gè)普通的春日,但同時(shí)它似又不平凡鹰霍。因?yàn)橐粋€(gè)短課程,一個(gè)微信群茵乱,讓我摒棄雜事浮...
    彥希媽閱讀 110評(píng)論 0 1
  • 清晨茂洒,一醒來(lái)印入眼簾的便是這一行字。頓時(shí)爽爆了我的人生瓶竭,顏楷的魅力督勺。 學(xué)書(shū)已多年,不出作品實(shí)為枉屈斤贰。每每寫(xiě)出又增加...
    林野輕風(fēng)閱讀 138評(píng)論 1 3