使用vue插件生成的pdf,如何获取pdf文件,而不是直接下载

事情是这样的:之前呢都是点击直接下载pdf或者点击去生成pdf(对我这种小菜鸡来说,直接用插件啦);but,这次后端居然让我把文件传过去,一下懵逼的我,满世界求帮助;下面是我的求助历程;

1.首先呢我用的是vue框架,生成pdf的话就很简单了

先下载这两个依赖

npm install --save html2canvas  //将页面html转换成图片
npm install jspdf --save //将图片生成pdf
然后定义全局函数,创建一个htmlToPdf.js文件,放在('src/components/utils/htmlToPdf.js')

// 导出页面为PDF格式
import html2Canvas from 'html2canvas'
import jsPDF from 'jspdf'
export default{
  install (Vue, options) {
    Vue.prototype.getPdf = function () {
      var ST = document.documentElement.scrollTop;
      var SL = document.documentElement.scrollLeft;
      document.documentElement.scrollLeft = 0;
      document.documentElement.scrollTop = 0;
      var title = this.htmlTitle
      // console.log(document.querySelector("#pdfDom").parentElement);
      html2Canvas(document.querySelector('#pdfDom'), {
        allowTaint: true,
      }).then(function (canvas) {
        document.documentElement.scrollTop = ST;
        document.documentElement.scrollLeft = SL;
        var pdf = new jsPDF('p', 'mm', 'a4');    //A4纸,纵向
        var ctx = canvas.getContext('2d')
        // console.log('')
        var a4w = 190, a4h = 277    //A4大小,210mm x 297mm,四边各保留10mm的边距,显示区域190x277
        var imgHeight = Math.floor(a4h * canvas.width / a4w)   //按A4显示比例换算一页图像的像素高度
        var renderedHeight = 0;
          while(renderedHeight < canvas.height) {
              var ctx = canvas.getContext("2d");
              ctx.font = "100px 微软雅黑";
              ctx.fillStyle = "rgba(81, 90, 110, 0.3)";
              // ctx.fillText('这是你的水印', 430, 600);
              // ctx.fillText('这是你的水印', 430, 1400);
              var page = document.createElement("canvas");
              page.width = canvas.width;
              page.height = Math.min(imgHeight, canvas.height - renderedHeight);//可能内容不足一页
              //用getImageData剪裁指定区域,并画到前面创建的canvas对象中
              page.getContext('2d').putImageData(ctx.getImageData(0, renderedHeight, canvas.width, Math.min(imgHeight, canvas.height - renderedHeight)), 0, 0);
              // console.log(page.toDataURL('image/jpeg', 1.0))
              pdf.addImage(page.toDataURL('image/jpeg', 1.0), 'JPEG', 10, 10, a4w, Math.min(a4h, a4w * page.height / page.width));    //添加图像到页面,保留10mm边距
              renderedHeight += imgHeight;
              if(renderedHeight < canvas.height) {
                pdf.addPage();//如果后面还有内容,添加一个空页
              }
          }
          // 直接下载保存
          pdf.save(title + '.pdf');
          // console.log(pdf)
        }
      )
    }
  }
}
再然后在main.js中使用我们定义的函数文件。

import htmlToPdf from '@/components/utils/htmlToPdf'
Vue.use(htmlToPdf)

最后呢,只要在要生成pdf的页面,直接使用定义好的方法,直接  this.getPdf() 来使用就好了

注意:要打印的id需要和js的要获取的id一致;tiltle要在data定义,否则为空

 

 

到这呢,你就会发现;点击的时候直接下载保存了这个pdf了,和我想要的不一样,我要获取的是这个pdf的文件;

然后我就在js里打印了pdf,发现了其中的有很多方法

 

          // 注释掉直接下载保存
          // pdf.save(title + '.pdf');

 

          // 使用pdf的output方法,得到二进制
          var output = pdf.output();
          // 再将二进制转为u8array
          var u8array = pdf.binaryStringToUint8Array(output);
          // 最后将u8array再转为Blob,这就是我要的文件啦,传给后端就好啦
          var file = new Blob([u8array],{type:'application/pdf'})

本人实属小菜鸡,如有不当,还请指出,感恩!!!!

 

posted @ 2020-08-13 08:58  全村最靓的程序猿  阅读(1461)  评论(0编辑  收藏  举报