2015-08-28 14 views
12

Sto tentando di utilizzare node printer da un'applicazione di elettroni, ma non appena aggiungo le linee per utilizzare la stampante, l'app si arresta in modo anomalo.Stampa da applicazione elettronica

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

Questa è l'applicazione sto correndo. Ho solo aggiunto le righe di stampa al semplice esempio di app fornito sulla documentazione elettronica:

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

Mi manca qualcosa? Ho provato la stampante del nodo da sola e ho stampato con successo un testo senza senso.

risposta

6

node-printer usa attacchi nativi e secondo la docs:

I moduli Nodo native sono supportate da Electron, ma dal momento che Electron sta usando una versione V8 diversa dal nodo ufficiale, è necessario specificare manualmente la posizione delle intestazioni di Electron durante la creazione di moduli nativi .

Suppongo che sia per questo che stai ricevendo il seg fault. Prova a creare il modulo contro le intestazioni di elettroni, come indicato nella documentazione:

npm install --save-dev electron-rebuild 

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

lo ha fatto senza successo. Questo è ciò che succede ora: 'npm ERR! Failed at [email protected] installa script 'node-gyp rebuild'. npm ERR! Questo è probabilmente un problema con il pacchetto della stampante, ERR npm! non con npm stesso. npm ERR! Dì all'autore che questo non funziona sul tuo sistema: npm ERR! node-gyp rebuild npm ERR! È possibile ottenere le loro informazioni tramite: npm ERR! npm owner ls printer npm ERR! Probabilmente c'è un ulteriore output di registrazione sopra. – leamasuero

+0

@leamasuero Vedi i documenti, c'è anche un altro modo di usare il nodo-gyp. forse questo aiuta –

3

Il modulo node-printer ha codice C++ in esso. Il che significa che devi compilarlo usando la stessa versione di nodo che sta usando l'elettrone. In realtà è fattibile, ma è piuttosto complicato.

D'altra parte, elettrone ha già stampa API in esso: http://electron.atom.io/docs/v0.34.0/api/browser-window/#win-print-options

Se questa API non è sufficiente e si vuole ancora di sfruttare il modulo node-printer fatemelo sapere e io modificare questa risposta con un risposta più lunga su come forare e correggere node-printer in modo che sia compatibile con gli elettroni.

+0

avere 'node-printer' compatibile con electron richiede di portarlo su' NAN 2', è corretto? – apairet

+0

Quello che voglio dire è che Electron ora usa 'node v4' e V8 api è cambiato parecchio. – apairet

+0

Sì, penso di si. Ho avuto una situazione simile con un pacchetto diverso e ho dovuto biforcarlo per implementare i cambiamenti necessari per farlo costruire con l'elettrone. La maggior parte dei cambiamenti erano superficiali ... molti di loro. –

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

altrimenti si può anche utilizzare la seguente riga

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