const EventEmitter = require('events');
const Printer = require('pdf-to-printer');
const fs = require('fs');
class Printing extends EventEmitter {
/**
* Class offers printing related functionality to ALARMiator core
* @constructor
*/
constructor() {
super();
this.availablePrinters = []; // holds all available printers
this.defaultPrinter = ''; // holds the defailt printer
this.printerToUse = ''; // if not default printer -> add the printer to print on in this property
// is set to default printer during initialization and needs to be overwritten
// if another printer has to be used.
try {
this.getAvailablePrinters((success) => {
if (success) {
console.log(`CORE | PRINTING | Read available printers`);
this.getDefaultPrinter((successDefault) => {
if (successDefault) {
console.log('CORE | PRINTING | Identified default Printer: ' + this.defaultPrinter);
} else {
console.log('CORE | PRINTING | Could not identify default printer. Check if default is set at operating system lebel.')
}
})
} else {
console.log('CORE | PRINTING | Could not read available printers. Check if a printer is installed at operating system level.')
}
}); // initialized list of available printers
} catch (err) {
console.log('CORE | PRINTING | Error initializing printing: ' + err.message);
}
}
/**
* Returns list of availbale printers
* @param {function} callback success (true/false)
*/
getAvailablePrinters(callback) {
Printer
.getPrinters()
.then((printers) => {
if (printers !== null) {
this.availablePrinters = printers;
callback(true);
} else {
this.availablePrinters = [];
callback(false);
}
})
.catch((err) => {
console.log('CORE | PRINTING | ERROR: ' + err.message);
callback(false);
});
}
/**
* gets the default printer from os and sets the printer to be used
* @param {function} callback success (true/false)
*/
getDefaultPrinter(callback) {
Printer
.getDefaultPrinter()
.then((printer) => {
this.defaultPrinter = printer;
this.printerToUse = printer;
callback(true);
})
.catch((err) => {
console.log('CORE | PRINTING | getting Default Printer | ERROR: ' + err.message);
callback(false);
})
}
/**
* Sends a PDF Document to default printer
* @param {string} pdfPath path to pdf file to be printed
* @param {function} callback success (true/false)
*/
printPDFToDefaultPrinter(pdfPath, callback) {
try {
if (fs.existsSync(pdfPath)) {
// Set page to be printed scaled to fit a page of the printer
const options = {
printer: this.printerToUse,
unix: ["-o fit-to-page"],
win32: ['-print-settings "fit"']
};
Printer
.print(pdfPath, options)
.then((result) => {
console.log('CORE | PRINTING | Printjob dispatched: ' + result);
return callback(true);
})
.catch((err) => {
console.log('CORE | PRINTING | ERROR | Error printing document: ' + err.message);
return callback(false);
});
} else {
console.log('CORE | PRINTING | ERROR | PDF File to be printed can not be found: ' + pdfPath);
return callback(false);
}
} catch (err) {
console.log('CORE PRINTING | ERROR | Error while printing a pdf document: ' + err.message);
return callback(false);
}
}
}
module.exports = Printing;