使用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'})
本人实属小菜鸡,如有不当,还请指出,感恩!!!!

浙公网安备 33010602011771号