Electron通过调用SumatraPDF-3.4.6-32.exe 打印PDF

464 阅读1分钟

数据为后端传入的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;

image.png pdf-to-printer更多参数介绍可去github上查看