Печать из электронного приложения

Я пытаюсь использовать принтер узла из приложения Electron, но как только я добавляю строки для использования принтера, приложение вылетает.

Консоль выводит это:

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

Это приложение, которое я запускаю:

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

Я что-то упустил?

Я попробовал принтер узла самостоятельно, и я успешно напечатал какой-то бредовый текст.

Ответ 1

node-printer использует собственные привязки и в соответствии с docs:

Нативные Node модули поддерживаются Electron, но поскольку Electron использует другую версию V8 от официального Node, вам нужно вручную укажите расположение заголовков Electron при построении родные модули.

Полагаю, именно поэтому вы получаете seg fault. Попробуйте построить модуль против электронных заголовков, как указано в документах:

npm install --save-dev electron-rebuild

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

Ответ 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.')
        })
    })
})

В противном случае вы также можете использовать следующую строку

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

Ответ 3

Модуль node-printer содержит код C++. Это означает, что вы должны скомпилировать его, используя ту же версию узла, которую использует электрон. На самом деле это выполнимо, но довольно сложно.

С другой стороны, в Electron уже есть API печати:

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

Если этого API недостаточно, и вы все еще хотите использовать модуль node-printer дайте мне знать, и я отредактирую этот ответ с более длинным ответом о том, как раскошелиться и исправить node-printer чтобы он был электронно-совместимым.