电子产品无声印刷

时间:2017-09-02 09:13:29

标签: node.js electron

我目前正在构建一个电子应用程序。我在我的本地文件系统上有一个PDF,我需要静默打印出来(在默认打印机上)。我遇到了节点打印机库,但它似乎对我不起作用。有没有一个简单的解决方案来实现这一目标?

3 个答案:

答案 0 :(得分:6)

首先,几乎不可能理解你的意思"沉默"打印。因为一旦您向系统打印机发送打印指令,根本不会保持沉默。在Windows上,例如,一旦给出订单,至少系统托盘图标将指示正在发生的事情。也就是说,有很好描述的用电子打印的功能,即使是静音"就是其中之一:

如果您不想使用默认打印机,则需要获取all system printers

contents.getPrinters()

将返回PrinterInfo[]对象。

以下是electron PrtinerInfo Docs

中对象的外观示例
{
  name: 'Zebra_LP2844',
  description: 'Zebra LP2844',
  status: 3,
  isDefault: false,
  options: {
    copies: '1',
    'device-uri': 'usb://Zebra/LP2844?location=14200000',
    finishings: '3',
    'job-cancel-after': '10800',
    'job-hold-until': 'no-hold',
    'job-priority': '50',
    'job-sheets': 'none,none',
    'marker-change-time': '0',
    'number-up': '1',
    'printer-commands': 'none',
    'printer-info': 'Zebra LP2844',
    'printer-is-accepting-jobs': 'true',
    'printer-is-shared': 'true',
    'printer-location': '',
    'printer-make-and-model': 'Zebra EPL2 Label Printer',
    'printer-state': '3',
    'printer-state-change-time': '1484872644',
    'printer-state-reasons': 'offline-report',
    'printer-type': '36932',
    'printer-uri-supported': 'ipp://localhost/printers/Zebra_LP2844',
    system_driverinfo: 'Z'
  }
}

要打印文件,您可以使用

进行操作
contents.print([options])

选项在docs for contents.print()

中有所描述
  • options对象(可选):
  • silent Boolean(可选) - 不要求用户进行打印设置。默认为false。
  • printBackground Boolean(可选) - 还打印网页的背景颜色和图像。默认为false。
  • deviceName String(可选) - 设置要使用的打印机设备名称。默认为''。

打印窗口的网页。当silent设置为true时,如果deviceName为空并且默认设置为打印,Electron将选择系统的默认打印机。

在网页中调用window.print()等同于调用webContents.print({silent: false, printBackground: false, deviceName: ''})

使用page-break-before: always; CSS样式强制打印到新页面。

所以你需要的是将PDF加载到一个隐藏的窗口中,然后在标志设置为静音的情况下触发在电子中实现的print方法。

// In the main process.
const {app, BrowserWindow} = require('electron');
let win = null;

app.on('ready', () => {
  // Create window
  win = new BrowserWindow({width: 800, height: 600, show: false });
  // Could be redundant, try if you need this.
  win.once('ready-to-show', () => win.hide())
  // load PDF.
  win.loadURL(`file://directory/to/pdf/document.pdf`);
 // if pdf is loaded start printing.
  win.webContents.on('did-finish-load', () => {
    win.webContents.print({silent: true});
    // close window after print order.
    win = null;
  });
});

但是,请允许我给你一点警告: 一旦你开始打印它就会变得令人沮丧,因为那里有驱动程序会以稍微不同的方式解释数据。这意味着可以忽略边际等等。由于您已经拥有PDF,因此很可能不会发生此问题。但是,如果您想使用this method for example contents.printToPDF(options, callback),请记住这一点。该项目表示,有很多选项可以避免像使用此问题中描述的预定义样式表一样受挫:Print: How to stick footer on every page to the bottom?

如果你想搜索电子中的特征并且你不知道它们可以隐藏在哪里,你所要做的就是去"所有" docs并使用您的搜索功能:https://electron.atom.io/docs/all/

的问候, Megajin

答案 1 :(得分:6)

我最近发布了NPM软件包,用于从Node.js和Electron打印PDF文件。您可以将PDF文件发送到默认打印机或特定打印机。在Windows和类似Unix的操作系统上运行良好:https://github.com/artiebits/pdf-to-printer

安装简便,只需(如果使用纱线):

yarn add pdf-to-printer

或(如果使用 npm ):

npm install --save pdf-to-printer

然后,以静默方式将文件打印到默认打印机上:

import printer from "pdf-to-printer";

printer
  .print("assets/pdf-sample.pdf")
  .then(console.log)
  .catch(console.error);

答案 2 :(得分:2)

据我所知,目前没有办法直接使用Electron这样做,因为使用contents.print([])确实允许“静默”#39;打印HTML文件,它无法打印PDF视图。这是一个开放的功能请求:https://github.com/electron/electron/issues/9029

编辑:我设法通过将PDF转换为PNG然后使用Electron的打印功能(能够打印PNG)来打印基于图像的视图来解决此问题。其中一个主要缺点是NodeJS的所有PDF到PNG / JPEG转换库都有许多依赖关系,这意味着我必须在Express服务器中实现它们然后让我的Electron应用程序将所有PDF发送到服务器转换。它不是一个很好的选择,但确实有效。