2015-08-28 6 views
12

Ich versuche, node printer von einer Elektron-Anwendung zu verwenden, aber sobald ich die Zeilen hinzufüge, um den Drucker zu verwenden, stürzt die Anwendung ab.Drucken von der Elektronenapplikation

Die Konsole gibt diese: [1] 9860 segmentation fault (core dumped) node_modules/electron-prebuilt/dist/electron.

Dies ist die App Ich renne. Ich habe nur die Druckleitungen an die einfache Anwendung, beispielsweise auf Elektronen Dokumentation:

var app = require('app'); // Module to control application life. 
var BrowserWindow = require('browser-window'); // Module to create native browser window. 
var printer = require('printer'); 

// Report crashes to our server. 
require('crash-reporter').start(); 

// Keep a global reference of the window object, if you don't, the window will 
// be closed automatically when the JavaScript object is GCed. 
var mainWindow = null; 

// Quit when all windows are closed. 
app.on('window-all-closed', function() { 
    // On OS X it is common for applications and their menu bar 
    // to stay active until the user quits explicitly with Cmd + Q 
    if (process.platform != 'darwin') { 
    app.quit(); 
    } 
}); 

// This method will be called when Electron has finished 
// initialization and is ready to create browser windows. 
app.on('ready', function() { 
    // Create the browser window. 
    mainWindow = new BrowserWindow({width: 800, height: 600}); 

    // and load the index.html of the app. 
    mainWindow.loadUrl('file://' + __dirname + '/app/index.html'); 

    // Open the devtools. 
    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);} 
    }); 


    // Emitted when the window is closed. 
    mainWindow.on('closed', function() { 
    // Dereference the window object, usually you would store windows 
    // in an array if your app supports multi windows, this is the time 
    // when you should delete the corresponding element. 
    mainWindow = null; 
    }); 
}); 

bin ich etwas fehlt? Ich habe den Node-Drucker selbst ausprobiert und ich habe erfolgreich ein paar Kauderwelsch-Texte gedruckt.

Antwort

6

node-printer verwendet native Bindungen und nach dem docs:

Die nativen Knoten Module werden von Electron unterstützt, aber da Electron ist eine andere V8-Version von der offiziellen Knoten verwenden, müssen Sie manuell die angeben Position der Header von Electron beim Erstellen von nativen Modulen .

Ich nehme an, deshalb erhalten Sie die seg fault. Versuchen Sie das Modul gegen die Elektronen Header zu bauen, wie in der Dokumentation erwähnt:

npm install --save-dev electron-rebuild 

# Every time you run npm install, run this too 
./node_modules/.bin/electron-rebuild 
+0

ohne Erfolg haben es geschafft. So passiert es jetzt: 'npm ERR! Fehler beim Installationsskript [email protected] 'node-gyp rebuild'. npm ERR! Dies ist höchstwahrscheinlich ein Problem mit dem Druckerpaket, npm ERR! nicht mit npm selbst. npm ERR! Sagen Sie dem Autor, dass dies auf Ihrem System fehlschlägt: npm ERR! node-gyp rebuild npm ERR! Sie können ihre Informationen erhalten über: npm ERR! npm Besitzer ls Drucker npm ERR! Es gibt wahrscheinlich zusätzliche Logging-Ausgabe oben. – leamasuero

+0

@leamasuero Siehe die Dokumente, gibt es auch einen anderen Weg mit dem Knoten-Gyp. vielleicht hilft das. –

3

Das node-printer Modul verfügt über C++ Code darin. Das bedeutet, dass Sie es mit der gleichen Version des Knotens kompilieren müssen, die das Elektron verwendet. Das ist tatsächlich machbar, aber es ist ziemlich kompliziert.

Auf der anderen Seite, Elektron hat bereits Druck-API in ihm: http://electron.atom.io/docs/v0.34.0/api/browser-window/#win-print-options

Wenn diese api nicht ausreichend ist, und Sie wollen immer noch das node-printer Modul lassen Sie mich wissen nutzen, und ich werde diese Antwort mit einem bearbeiten längere Antwort darüber, wie man node-printer so abzweigt und repariert, dass es elektronenkompatibel ist.

+0

mit 'node-printer' kompatibel zu Elektron muss es auf' NAN 2' portieren, ist das richtig? – apairet

+0

Was ich meine ist, dass Electron jetzt 'node v4' verwendet und V8 api ziemlich viel geändert hat. – apairet

+0

Ja, ich denke schon. Ich hatte eine ähnliche Situation mit einem anderen Paket und musste es anpassen, um die Änderungen umzusetzen, die ich brauchte, um es mit einem Elektron zu bauen. Die meisten Änderungen waren oberflächlich ... die meisten von ihnen. –

2
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.') 
     }) 
    }) 
}) 

Ansonsten können Sie verwenden auch die folgende Zeile

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