Perform cup printing operation with Node.js

I would like to print documents via http requests on Node.js. Is there a way to send print jobs and request a CUPS server using Node.js. I found this project while studying, is this the only / right way to do this?

+7
source share
2 answers

You can use the shell for this. Some time ago, I built a project where I needed to read a specific hashtag from instagram and print photos uploaded to IG using this hashtag using a raspberry pi and photo printer.

var fs = require('fs'), exec = require('child_process').exec; exec("lp /path/to/somepic.jpg"); // get printer jobs exec("lpq",function (error, stdout, stderr) { console.log('stdout: ' + stdout); console.log('stderr: ' + stderr); if (error !== null) { console.log('exec error: ' + error); } }); 

The lp /path/to/somepic.jpg sends /path/to/somepic.jpg to the default printer. The lpq command displays the printer queue. For best use, read the CUPS documentation.

+4
source

The following snippet seems useful. I haven’t tried, since I’m no longer working on this problem! This may be helpful to others. Source: https://gist.github.com/vodolaz095/5325917

 var ipp = require('ipp'); //get it from there - https://npmjs.org/package/ipp - $npm install ipp var request = require('request'); //get it from there - https://npmjs.org/package/request - $npm install request var fs = require('fs'); function getPrinterUrls(callback) { var CUPSurl = 'http://localhost:631/printers';//todo - change of you have CUPS running on other host request(CUPSurl, function (error, response, body) { if (!error && response.statusCode == 200) { var printersMatches = body.match(/<TR><TD><A HREF="\/printers\/([a-zA-Z0-9-^"]+)">/gm);//i know, this is terrible, sorry( var printersUrls = []; var i; if (printersMatches) { for (i = 0; i < printersMatches.length; i++) { var a = (/"\/printers\/([a-zA-Z0-9-^"]+)"/).exec(printersMatches[i]); if (a) { printersUrls.push(CUPSurl + '/' + a[1]); } } } } callback(error, printersUrls); }); }; function doPrintOnSelectedPrinter(printer, bufferToBePrinted, callback) { printer.execute("Get-Printer-Attributes", null, function(err, printerStatus){ if(printerStatus['printer-attributes-tag']['printer-state']=='idle'){ //printer ready to work //*/ printer.execute("Print-Job", { "operation-attributes-tag":{ "requesting-user-name":"nap", "job-name":"testing" }, "job-attributes-tag":{}, data:bufferToBePrinted }, function (err, res) { if (res.statusCode == 'successful-ok') { var jobUri = res['job-attributes-tag']['job-uri']; var tries = 0; var t = setInterval(function () { printer.execute("Get-Job-Attributes", {"operation-attributes-tag":{'job-uri':jobUri}}, function (err2, job) { // console.log(job); if (err2) throw err2; tries++; if (job && job["job-attributes-tag"]["job-state"] == 'completed') { clearInterval(t); // console.log('Testins if job is ready. Try N '+tries); callback(null, job);//job is succesefully printed! } if (tries > 50) {//todo - change it to what you need! clearInterval(t); printer.execute("Cancel-Job", { "operation-attributes-tag":{ //"job-uri":jobUri, //uncomment this //*/ "printer-uri":printer.uri, //or uncomment this two lines - one of variants should work!!! "job-id":job["job-attributes-tag"]["job-id"] //*/ } }, function (err, res) { if (err) throw err; console.log('Job with id '+job["job-attributes-tag"]["job-id"]+'is being canceled'); }); callback(new Error('Job is canceled - too many tries and job is not printed!'), null); } }); }, 2000); } else { callback(new Error('Error sending job to printer!'), null); } }); //*/ } else { callback(new Error('Printer '+printerStatus['printer-attributes-tag']['printer-name']+' is not ready!'),null); } }); } function doPrintOnAllPrinters(data, callback) { var b = new Buffer(data, 'binary'); getPrinterUrls(function (err, printers) { if (err) throw err; if (printers) { for (var i = 0; i < printers.length; i++) { var printer = ipp.Printer(printers[i]); doPrintOnSelectedPrinter(printer, b, callback); } } else { throw new Error('Unable to find printer. Do you have printer installed and accessible via CUPS?'); } }); } /* Example of usage */ fs.readFile('package.json', function (err, data) { doPrintOnAllPrinters(data, function (err, job) { if (err) { console.error('Error printing'); console.error(err); } else { console.log('Printed. Job parameters are: '); console.log(job); } } ); }); 
0
source

Source: https://habr.com/ru/post/989605/


All Articles