return {
tableNowSelectionData:[],//el-table多选选中的数据
allPrintData:[],//点击print时深拷贝el-table多选选中的数据
testData:[],//用于保存返回后的pdf流
watch:{
testData(newVal, oldVal) {
if (newVal.length == this.allPrintData.length) {
//利用侦听器,如果testData的数据长度等于allPrintData的长度,说明所有的pdf流文件都拿到了,将他们传入batchPrintPDF函数
this.batchPrintPDF(newVal);
methods:{
print(){
this.testData = [];//清空保存的pdf流
this.allPrintData = JSON.parse(
JSON.stringify(this.tableNowSelectionData)
);//点击print时深拷贝el-table多选选中的数据
for (let item of this.tableNowSelectionData) {//循环选中的数据发送请求
let obj = {
id:item.id,
};//obj为根据需求需要传给后端的数据
axios({//这是使用原生axios是因为使用封装后的axios拿到的pdf会莫名变成空白,但是原生axios就不会有这个问题
url: downloadUrl,//请求地址,如果跨域需要做反向代理配置
method: "post",
data: obj,
responseType: "arraybuffer",
.then(async (res) => {
console.log(res);//返回的数据如下图,res.data才是我们需要的数据
this.testData.push(res.data);//将返回的pdf流push进testData
.catch((err) => {
this.$message.error("打印失败", err);
batchPrintPDF(pdfList) {
let arr = [];
pdfList.map((item, index) => {
const binaryData = [];
binaryData.push(item);
let url = window.URL.createObjectURL(
new Blob(binaryData, {
type: "application/pdf"
arr.push(url); //将pdf流文件转为blob并存入数组
const PDFMerger = require("pdf-merger-js"); //引入合并pdf插件
let merger = new PDFMerger();
let pdfUrl = "";
arr.map(async (item, index) => {
await merger.add(item); //添加需要合并的pdf地址
if (index == arr.length - 1) {
//最后一个pdf地址添加完成后向下执行
const binaryData = [];
let str = await merger.saveAsBuffer(); //拿到合并后的二进制文件
binaryData.push(str.buffer);//转buffer格式
pdfUrl = await window.URL.createObjectURL(
new Blob(binaryData, {
type: "application/pdf"
);//将buffer格式转为blob格式
let printData = await [pdfUrl];
printJS({
printable: printData,
type: "pdf",
}); //调用浏览器打印
(此图为上方print函数发送请求返回的数据例字,data为需要使用的数据)
/* esl
int
-disable */
const
Pr
int
= function (dom, options) {
if (!(this instanceof
Pr
int
)) return new
Pr
int
(dom, options);
this.options = this.extend({
'no
Pr
int
': '.no-
pr
int
'
}, options);
if ((typeof dom) === string) {
this.dom = document.querySelector(dom);
} else
网页
打印
功能在很多的网站系统中都会使用到。比如说报表
打印
功能等。
以下是在Jquery插件库中找到的一款原生
js
打印
插件,代码清洁简单,封装的代码也很好理解。index.html页面代码<!doctype html>
<meta charset="UTF-8">
<title>
Pr
int
.
js
演示</title>
<style>
html,body{
众所周知,
前端
打印
的API只有window.
pr
int
(),而我们要实现自动
打印
和
批量
打印
,甚至连获取本地电脑的
打印
机有哪些都无法获取到。难道,
前端
对此真的无能为力吗?答案是 否定 !
Lodop 由此诞生,有人说她是Web
打印
控件的“终结者”,因为接触“她”后再不想别的“她”。 那我们就来揭开这神秘都面纱!
一,首先我们要改造Lodpo的源代码文件为适合Vue/React/Angular等框架如...
打印
库官方网址
Pr
int
.
js
-
Javascript
library for HTML elements,
PDF
and image files
pr
int
ing. (crabbly.com)
由于
打印
库是英文 可以访问翻译版
Pr
int
.
js
javascript
库 实现页面
打印
- 简书 (jianshu.com)
在vue项目中安装
pr
int
.
js
打印
库
npm install
pr
int
-
js
--save
在main.
js
中引入
import
pr
int
f.