Print text File to specific printer in java
Solution 1
I'm not sure if this solves your problem but I use the following to print a text file
FileInputStream textStream;
textStream = new FileInputStream(FILE_NAME);
DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
Doc mydoc = new SimpleDoc(textStream, flavor, null);
PrintService[] services = PrintServiceLookup.lookupPrintServices(
flavor, aset);
PrintService defaultService = PrintServiceLookup.lookupDefaultPrintService();
if(services.length == 0) {
if(defaultService == null) {
//no printer found
} else {
//print using default
DocPrintJob job = defaultService.createPrintJob();
job.print(mydoc, aset);
}
} else {
//built in UI for printing you may not use this
PrintService service = ServiceUI.printDialog(null, 200, 200, services, defaultService, flavor, aset);
if (service != null)
{
DocPrintJob job = service.createPrintJob();
job.print(mydoc, aset);
}
}
You may not need the ServiceUI, but I think you could use PrintService[] services to get a list of printers available for printing. And using an input stream and the Doc class you can print a file to a printer.
Solution 2
JTextComponent#print should do the trick:
JTextPane jtp = new JTextPane();
jtp.setBackground(Color.white);
jtp.setText("text to print");
boolean show = true;
try {
jtp.print(null, null, show, null, null, show);
} catch (java.awt.print.PrinterException ex) {
ex.printStackTrace();
}
in this manner you can quickly print out even nice formatted text - just create a StyledDocument and attach it to JTextPane before printing.
![Icegras](https://i.stack.imgur.com/OPgRh.jpg?s=256&g=1)
Icegras
Updated on June 24, 2020Comments
-
Icegras about 4 years
I have a text file, and I need to print it to a specific network printer. I know the name of the printer.
Until now I have made a Printable class to print my file (ticket).
public class TicketPrintPage implements Printable { private File ticket; public TicketPrintPage(File f) { ticket = f; } public int print(Graphics g, PageFormat pf, int pageIndex) throws PrinterException { int interline = 12; Graphics2D g2 = (Graphics2D) g; g2.setFont(new Font("CourierThai", Font.PLAIN, 10)); int x = (int) pf.getImageableX(); int y = (int) pf.getImageableY(); try { FileReader fr = new FileReader(ticket); BufferedReader br = new BufferedReader(fr); String s; while ((s = br.readLine()) != null) { y += interline; g2.drawString(s, x, y); } } catch (IOException e) { throw new PrinterException("File to print does not exist (" + ticket.getAbsolutePath() +") !"); } return Printable.PAGE_EXISTS; } }
I call this TicketPrintPage this way :
public void printTicketFile(File ticket, int orientation) throws PrinterException { if (!ticket.exists()) { throw new PrinterException("Ticket to print does not exist (" + ticket.getAbsolutePath() + ") !"); } PrinterJob pjob = PrinterJob.getPrinterJob(); // get printer using PrintServiceLookup.lookupPrintServices(null, null) and looking at the name pjob.setPrintService(getPrintService()); // job title pjob.setJobName(ticket.getName()); // page fomat PageFormat pf = pjob.defaultPage(); // landscape or portrait pf.setOrientation(orientation); // Paper properties Paper a4Paper = new Paper(); double paperWidth = 8.26; double paperHeight = 11.69; double margin = 16; a4Paper.setSize(paperWidth * 72.0, paperHeight * 72.0); a4Paper.setImageableArea( margin, //0, margin, //0, a4Paper.getWidth()- 2 * margin, //a4Paper.getWidth(), a4Paper.getHeight()- 2 * margin //a4Paper.getHeight() ); // no margin = no scaling pf.setPaper(a4Paper); // Custom class that defines how to layout file text TicketPrintPage pages = new TicketPrintPage(ticket); // adding the page to a book Book book = new Book(); book.append(pages, pf); // Adding the book to a printjob pjob.setPageable(book); PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet(); // No jobsheet (banner page, the page with user name, job name, date and whatnot) pras.add(JobSheets.NONE); // Printing pjob.print(pras); }
It works not so bad but :
- I doesn't work for more than one page of text (found some algorithms for that but well)
- I can't get to know when the printer is done printing, and if I try printing two or more tickets in a row the printer will return a Printer not ready message.So the question again is : Isn't there a simple way to print a text file to a printer ?
-
Icegras almost 15 yearsThis allows me to print the page (I didn't use the printDialog), but the PrintRequestAttributeSet is not taken into account. I ask for landscape and it prints portrait... I think it's because I use PrintServiceLookup.lookupPrintServices(null,null). If I specify a flavor or attributes I get no printer list. Maybe because they are network printers I can't interact with them that way ?
-
Muhuri.JSON almost 15 yearsPossibly, I had some trouble with network printing as well. Since I only needed to print one file (the license agreement) I formatted the text file so I wouldn't need to mess with the print settings. I don't have any experience with trying to change settings on a network printer. Sorry.
-
Jack Moore over 11 yearswhat is aset for ? I tried to run your code but ran into unavailable aset variable error.
-
Muhuri.JSON over 11 yearsI don;t have the original code anymore. But it is supposed to be a docs.oracle.com/javase/1.4.2/docs/api/javax/print/attribute/…
-
Developer Marius Žilėnas over 10 yearsIn addition to the answer an note from Java SE 7 docs (goo.gl/v85d6f) "this method blocks until printing is done."