Print text File to specific printer in java

66,795

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.

Share:
66,795
Icegras
Author by

Icegras

Updated on June 24, 2020

Comments

  • Icegras
    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
    Icegras almost 15 years
    This 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
    Muhuri.JSON almost 15 years
    Possibly, 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
    Jack Moore over 11 years
    what is aset for ? I tried to run your code but ran into unavailable aset variable error.
  • Muhuri.JSON
    Muhuri.JSON over 11 years
    I 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
    Developer Marius Žilėnas over 10 years
    In addition to the answer an note from Java SE 7 docs (goo.gl/v85d6f) "this method blocks until printing is done."