web-dev-qa-db-fra.com

Imprimer à partir d'une application Electron

J'essaie d'utiliser imprimante de nœud à partir d'une application Electron, mais dès que j'ajoute les lignes pour utiliser l'imprimante, l'application se bloque.

La console affiche ceci:

[1]    9860 segmentation fault (core dumped)  node_modules/electron-prebuilt/dist/electron.

Voici l'application que j'utilise:

var app = require('app');
var BrowserWindow = require('browser-window');
var printer = require('printer');

require('crash-reporter').start();

app.on('ready', function() {
  var mainWindow = new BrowserWindow({width: 800, height: 600});
  mainWindow.loadUrl('file://' + __dirname + '/app/index.html');

  mainWindow.openDevTools();

  printer.printDirect({data:"print from Node.JS buffer" // or simple String: "some text"
      , printer:'HP-Deskjet-F4400-series' // printer name, if missing then will print to default printer
      , type: 'TEXT' // type: RAW, TEXT, PDF, JPEG, .. depends on platform
      , success:function(jobID){
          console.log("sent to printer with ID: "+jobID);
      }
      , error:function(err){console.log(err);}
  });      
});

Suis-je en train de manquer quelque chose?

J'ai essayé l'imprimante de noeud seule et j'ai réussi à imprimer du texte de charabia.

15
leamasuero

node-printer utilise des liaisons natives et selon docs :

Les modules natifs Node sont pris en charge par Electron, mais comme Electron utilise une version V8 différente de Node officielle, vous devez spécifier manuellement l'emplacement des en-têtes d'Electron lors de la construction de modules natifs.

Je suppose que c'est pourquoi vous obtenez le seg fault. Essayez de construire le module contre les en-têtes d'électrons comme mentionné dans la documentation:

npm install --save-dev electron-rebuild

# Every time you run npm install, run this too
./node_modules/.bin/electron-rebuild
9
Yan Foto
app.on('ready', () => {

let win = new BrowserWindow({width:800, height:600,resizable:false})
win.loadURL('file://'+__dirname+'/index.html')
win.webContents.on('did-finish-load', () => {
    win.webContents.printToPDF({ marginsType:2, pageSize:"A3", landscape:false }, (error, data) => {
        if (error) throw error
        fs.writeFile('output.pdf', data, (error) => {

        //getTitle of Window
        console.log(win.webContents.getTitle())

        //Silent Print 

        if (error) throw error
        console.log('Write PDF successfully.')
        })
    })
})

Sinon, vous pouvez également utiliser la ligne suivante

win.webContents.print({silent:true, printBackground:true})
5
Rohit Goyal

Le node-printer le module contient du code C++. Ce qui signifie que vous devez le compiler en utilisant la même version du nœud que l'électron utilise. C'est faisable en fait, mais c'est assez compliqué.

D'un autre côté, Electron contient déjà des API d'impression:

https://electronjs.org/docs/api/web-contents#contentsprintoptions-callback

Si cette API n'est pas suffisante et que vous souhaitez toujours utiliser le node-printer module faites le moi savoir et je modifierai cette réponse avec une réponse plus longue sur la façon de bifurquer et de réparer node-printer pour qu'il soit compatible avec les électrons.

4
justin.m.chase