Sidebar

How can I print a text document to a network printer?

0 votes
2.5K views
asked Jan 24, 2017 by lee-m-7328 (120 points)
I am processing ORM messages for Lab Orders. If I cannot determine the correct lab info, I need to print the order to a printer in the lab. I would like to be able to print to the IP address of the printer, so I don't need to install each printer on the Qvera server.

2 Answers

0 votes

I haven't found any proven examples of connecting to a printer in Java over TCP/IP.  This site provides a possible solution, althrough I have not tried it. https://www.experts-exchange.com/questions/27966415/How-to-send-a-print-a-file-on-the-network-print-using-java.html

Below is an example of how I have been able to search for a specific printer on the network and then print the current message on the printer.  This does require that the OS has installed the printer drivers and therefore is aware that the printer exists.

var inputStream = null;
try {
   var i = 0;
   var pservices = javax.print.PrintServiceLookup.lookupPrintServices(null, null);
   var pservice = null;
   qie.warn("pservices.length = " + pservices.length);
   for (i = 0; i < pservices.length; i++) {
      qie.warn("pservices[" + i + "] = " + pservices[i]);
      if (StringUtils.contains(pservices[i].getName(), "HP LaserJet 400")) {
         pservice = pservices[i];
         break;
      }
   }
   
   var docFlavors = pservice.getSupportedDocFlavors();
   qie.warn("docFlavors.length = " + docFlavors.length);
   for (i = 0; i < docFlavors.length; i++) {
      qie.warn("docFlavors[" + i + "] = " + docFlavors[i]);
   }
   var docFlavor = javax.print.DocFlavor.INPUT_STREAM.AUTOSENSE;
   qie.warn("docFlavor = " + docFlavor);
   
   qie.warn("pservice = " + pservice);
   var docPrintJob = pservice.createPrintJob();
   qie.warn("docPrintJob = " + docPrintJob);
   docPrintJob.addPrintJobListener(new javax.print.event.PrintJobAdapter() {
      printDataTransferCompleted : function(event) {qie.info("dataTransferCompleted: " + event)},
      printJobCompleted : function(event) {qie.info("jobCompleted: " + event)},
      printJobFailed : function (event) {qie.info("jobFailed: " + event)},
      printJobCanceled : function (event) {qie.info("jobCanceled: " + event)},
      printJobNoMoreEvents : function(event) {qie.info("jobNoMoreEvents: " + event)},
      printJobRequiresAttention : function(event) {qie.info("jobRequiresAttention: " + event)}
   });
   inputStream = org.apache.commons.io.IOUtils.toInputStream(message.getNode('/'), "UTF-8");
   var doc = new javax.print.SimpleDoc(inputStream, docFlavor, null);
   qie.warn("doc = " + doc);
   //var docFlavor = doc.getDocFlavor();
   //qie.warn("docFlavor = " + docFlavor);

   docPrintJob.print(doc, null);
   
} catch (e) {
   qie.error("Wow.  Caught this error: " + e);
   throw e;
} finally {
   if (inputStream == null) {
      try {
         inputStream.close();
      } catch (err) {
         qie.error("Failed to close inputStream.");
      }
   }
}

 

 

answered Jan 24, 2017 by mike-r-7535 (13,830 points)
0 votes

You can write your text to a file and then print the contents of that file to your default printer.

 

importPackage(java.io);

var out = new BufferedWriter(new FileWriter("c:\\myTestTemp.txt"));
out.write("Hello this is a test\r\nThat has multiple lines\r\nof text");
out.flush();
out.close();

var ff = new File("c:\\myTestTemp.txt");
var desktop = java.awt.Desktop.getDesktop();
desktop.print(ff);

answered Apr 30, 2019 by michael-h-5027 (14,390 points)
...