我目前正在构建一个电子应用程序。我在我的本地文件系统上有一个PDF,我需要静默打印出来(在默认打印机上)。我遇到了节点打印机库,但它似乎对我不起作用。有没有一个简单的解决方案来实现这一目标?
答案 0 :(得分:6)
首先,几乎不可能理解你的意思"沉默"打印。因为一旦您向系统打印机发送打印指令,根本不会保持沉默。在Windows上,例如,一旦给出订单,至少系统托盘图标将指示正在发生的事情。也就是说,有很好描述的用电子打印的功能,即使是静音"就是其中之一:
如果您不想使用默认打印机,则需要获取all system printers:
contents.getPrinters()
将返回PrinterInfo[]
对象。
{
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])
中有所描述
打印窗口的网页。当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发送到服务器转换。它不是一个很好的选择,但确实有效。