Impresión silenciosa en electron.

Actualmente estoy construyendo una aplicación electrónica. Tengo un PDF en mi sistema de archivos local que necesito para imprimir en silencio (en la impresora predeterminada). Encontré la biblioteca de impresora de nodos, pero no parece funcionar para mí. ¿Hay una solución fácil para lograr esto?

Bueno, en primer lugar, es casi imposible entender lo que quiere decir con la impresión “silenciosa”. Porque una vez que envíe una orden de impresión a su impresora del sistema, estará fuera de su scope guardar silencio. En Windows, por ejemplo, una vez que se dio el pedido, al menos el ícono del sistema indicará que algo está sucediendo. Dicho esto, hay características muy buenas descritas para la impresión con electrón, incluso “silencioso” es una de ellas:

Debe obtener todas las impresoras del sistema si no desea utilizar la impresora predeterminada:

contents.getPrinters() 

Lo que devolverá un objeto PrinterInfo[] .

Aquí hay un ejemplo de cómo se verá el objeto desde los documentos PrtinerInfo de electrón :

 { 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' } } 

Para imprimir tu archivo puedes hacerlo con

 contents.print([options]) 

Las opciones se describen en los documentos para contents.print () :

  • opciones de objeto (opcional):
  • silencioso booleano (opcional): no pregunte al usuario por la configuración de impresión. El valor predeterminado es falso.
  • printBackground Boolean (opcional): también imprime el color de fondo y la imagen de la página web. El valor predeterminado es falso.
  • deviceName String (opcional): establezca el nombre del dispositivo de la impresora para usar El valor predeterminado es ”.

Imprime la página web de la ventana. Cuando silent se establece en verdadero, Electron elegirá la impresora predeterminada del sistema si deviceName está vacío y la configuración predeterminada para imprimir.

Llamar a window.print() en la página web es equivalente a llamar a webContents.print({silent: false, printBackground: false, deviceName: ''}) .

Utilice page-break-before: always; Estilo CSS para forzar para imprimir en una nueva página.

Entonces, todo lo que necesita es cargar el PDF en una ventana oculta y luego disparar el método de impresión implementado en electrón con la bandera configurada en silencio.

 // 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; }); }); 

Sin embargo, permítame darle una pequeña advertencia: una vez que comience a imprimir, puede frustrarse porque habrá controladores que interpretarán los datos de una manera ligeramente diferente. Lo que significa que los márgenes podrían ser ignorados y mucho más. Como ya tienes un PDF, este problema probablemente no sucederá. Pero tenga esto en cuenta si alguna vez desea usar este método, por ejemplo, contents.printToPDF(options, callback) . Dicho esto, hay muchas opciones para evitar frustrarse, como usar una hoja de estilo predefinida como la que se describe en esta pregunta: Imprimir: ¿Cómo pegar un pie de página en cada página al final?

Si desea buscar funciones en electron y no sabe dónde se pueden ocultar, todo lo que tiene que hacer es ir a “todos” los documentos y usar su función de búsqueda: https://electron.atom.io/docs /todos/

Saludos, Megajin

Por lo que sé, actualmente no hay forma de hacerlo directamente utilizando Electron porque al usar contents.print([]) permite la impresión “silenciosa” de archivos HTML, no puede imprimir vistas en PDF. Esta es actualmente una solicitud de función abierta: https://github.com/electron/electron/issues/9029

Edición : Logré evitar esto al convertir el PDF en un PNG y luego usar la funcionalidad de impresión de Electron (que puede imprimir PNG) para imprimir la vista basada en la imagen. Una de las principales desventajas de esto es que todas las bibliotecas de conversión de PDF a PNG / JPEG para NodeJS tienen varias dependencias, lo que significa que tuve que implementarlas en un servidor Express y luego hacer que mi aplicación Electron envíe todos los PDF al servidor para conversión. No es una gran opción, pero funciona.