数据为后端传入的Base64,然后进行打印
代码如下:
import { print } from 'pdf-to-printer';
import path from 'path';
import fs from 'fs';
import Log from '@/utils/logUtils';
import { getSetMsg } from '@/utils/setElectronStoreUtils';
import { fileUtils } from '@/utils/fileUtils';
import { forEach } from 'lodash';
// 环境判断
const isPrdEnv = process.env.NODE_ENV === 'production';
const staticPath = isPrdEnv ? '/static/print/pdf' : '../../../static/print/pdf';
// 生成一个随机的字符串用着PDF的名字
const randomString = () => Math.random().toString(36).slice(-6);
// base64转buffer
const dataURLToArrayBuffer = (dataUrl) => {
return new Promise((resolve, reject) => {
try {
let binary = atob(dataUrl);
let arrayBuffer = new ArrayBuffer(binary.length);
let uint8 = new Uint8Array(arrayBuffer);
forEach(uint8, function (value, i) {
uint8[i] = binary.charCodeAt(i);
});
let buf = Buffer.alloc(arrayBuffer.byteLength);
let view = new Uint8Array(arrayBuffer);
for (let i = 0; i < buf.length; ++i) {
buf[i] = view[i];
};
resolve(buf);
} catch (err) {
Log.info('【base64PDF解析为buffer出错】' + err);
reject(err);
};
});
};
// 处理await的异常捕获
const awaitWrapper = promise => promise.then(result => [null, result]).catch(error => [error, null]);
// 将buffer流的pdf保存到本地
const savePDF = (buffer) => {
try {
fileUtils.mkdir(staticPath);
} catch (e) {
Log.info('【创建文件夹报错】' + e);
}
return new Promise((resolve, reject) => {
const pdfUrl = path.resolve(__dirname, `${staticPath}/${randomString()}.pdf`);
Log.info('【暂时创建pdf暂存的地址】' + pdfUrl);
fs.writeFile(pdfUrl, buffer, {encoding: 'utf-8'}, err => {
if (err) {
Log.info('【pdf保存到本地失败×】' + err);
console.log('[ err ] >', err);
reject(err);
} else {
Log.info('【pdf保存到本地成功】' + pdfUrl);
console.log(pdfUrl, 'pdfUrl');
resolve(pdfUrl);
}
});
});
};
// 获取打印机默认名称
const getDefaultPrinter = () => {
const deviceName = getSetMsg('local', 'currentReceipt') || getSetMsg('local', 'printer-receipt');
return deviceName;
};
// 执行打印操作
const pdfToPrint = (base64) => {
return new Promise(async (resolve, reject) => {
const [bufferErr, buffer] = await awaitWrapper(dataURLToArrayBuffer(base64));
if (bufferErr) {
return reject(bufferErr);
};
const [pdfPathErr, pdfPath] = await awaitWrapper(savePDF(buffer));
console.log(pdfPathErr, 'pdfPathErr', pdfPath, 'pdfPath');
if (pdfPathErr) {
return reject(pdfPathErr);
};
const [printErr, printResult] = await awaitWrapper(print(pdfPath, {
printer: getDefaultPrinter()
// orientation: 'landscape',
// scale: 'fit',
// paperSize: '60mmx60mm'
}));
if (printErr) {
Log.info('【pdf打印失败×】' + printErr);
reject(printErr);
} else {
Log.info('【pdf打印成功】' + printResult);
resolve(printResult);
}
fs.unlinkSync(pdfPath);
Log.info('【删除本地暂存的pdf】' + pdfPath);
});
};
export default pdfToPrint;
pdf-to-printer更多参数介绍可去github上查看