Printing pdf files using java

14,211

I just checked your code here at my place. I cannot print as I don't have a printer around, however, I can add something to the printer queue without actually printing (it just starts searching for the printer infinitely).

Especially since you said you got the exception sun.print.PrintJobFlavorException, it seems logical your printer indeed does not support PDF printing. To verify this is the case, try the following:

    PrintService service = PrintServiceLookup.lookupDefaultPrintService();
    int count = 0;
    for (DocFlavor docFlavor : service.getSupportedDocFlavors()) {
        if (docFlavor.toString().contains("pdf")) {
            count++;
        }
    }
    if (count == 0) {
        System.err.println("PDF not supported by printer: " + service.getName());
        System.exit(1);
    } else {
        System.out.println("PDF is supported by printer: " + service.getName());
    }

EDIT:

I used the Brother DCP-J552DW. The following code worked perfectly for me, except for some page margin (which is of course can be adjusted):

public static void main(String[] args) throws IOException {
    FileInputStream in = new FileInputStream("test.pdf");
    Doc doc = new SimpleDoc(in, DocFlavor.INPUT_STREAM.AUTOSENSE, null);
    PrintService service = PrintServiceLookup.lookupDefaultPrintService();

    try {
        service.createPrintJob().print(doc, null);
    } catch (PrintException e) {
        e.printStackTrace();
    }
}

The printer did not respond immediately, setting up the connection took about 20 seconds.

Share:
14,211
JustOnce
Author by

JustOnce

Updated on June 23, 2022

Comments

  • JustOnce
    JustOnce about 2 years

    I want to print a document using java however, the program is successful but my printer is not printing anything. Why is it like that? Do you any solutions for this? If my printer is not pdf supported, is there any way to print the pdf file or even docx files?

    package useprintingserviceinjava;
    import java.io.BufferedInputStream;
    import java.io.FileInputStream;
    import java.io.InputStream;
    
    import javax.print.Doc;
    import javax.print.DocFlavor;
    import javax.print.DocPrintJob;
    import javax.print.PrintService;
    import javax.print.PrintServiceLookup;
    import javax.print.SimpleDoc;
    import javax.print.event.PrintJobAdapter;
    import javax.print.event.PrintJobEvent;
    public class UsePrintingServiceInJava {
    
        private static boolean jobRunning = true;
    
        public static void main(String[] args) throws Exception {
    
    
      InputStream is;
       is = new BufferedInputStream(new FileInputStream("PAPER_SENSOR.pdf"));
    
      DocFlavor flavor = DocFlavor.INPUT_STREAM.PDF;
    
      PrintService service = PrintServiceLookup.lookupDefaultPrintService();
    
      DocPrintJob printJob = service.createPrintJob();
    
      printJob.addPrintJobListener(new JobCompleteMonitor());
    
      Doc doc = new SimpleDoc(is, DocFlavor.INPUT_STREAM.AUTOSENSE, null);
    
      printJob.print(doc, null);
    
      while (jobRunning) {
            Thread.sleep(1000);
      }
    
      System.out.println("Exiting app");
    
      is.close();
    
        }
    
        private static class JobCompleteMonitor extends PrintJobAdapter {
            @Override
            public void printJobCompleted(PrintJobEvent jobEvent) {
                System.out.println("Job completed");
                jobRunning = false;
            }
        }
    
    }
    

    This is the code I researched but still it does not print. Below is another code based on my research:

    package javaapplication24;
    
    import java.io.BufferedInputStream;
    import java.io.FileInputStream;
    import java.io.InputStream;
    
    import javax.print.Doc;
    import javax.print.DocFlavor;
    import javax.print.DocPrintJob;
    import javax.print.PrintService;
    import javax.print.PrintServiceLookup;
    import javax.print.SimpleDoc;
    import javax.print.event.PrintJobEvent;
    import javax.print.event.PrintJobListener;
    public class HandlePrintJobEvents {
    
    public static void main(String[] args) throws Exception {
    
            // create a PDF doc flavor
            try ( // Open the image file
                    InputStream is = new BufferedInputStream(new FileInputStream("C:\\Users\\JUSTINE\\Documents\\thesis document\\PAPER_SENSOR.pdf"))) {
                // create a PDF doc flavor
    
                DocFlavor flavor = DocFlavor.INPUT_STREAM.PDF;
    
                // Locate the default print service for this environment.
    
                PrintService service = PrintServiceLookup.lookupDefaultPrintService();
    
                // Create and return a PrintJob capable of handling data from
    
                // any of the supported document flavors.
    
                DocPrintJob printJob = service.createPrintJob();
    
                // register a listener to get notified when the job is complete
    
                printJob.addPrintJobListener(new PrintJobMonitor());
    
                // Construct a SimpleDoc with the specified
    
                // print data, doc flavor and doc attribute set.
    
                Doc doc = new SimpleDoc(is, DocFlavor.INPUT_STREAM.AUTOSENSE, null);
    
                // Print a document with the specified job attributes.
    
                printJob.print(doc, null);
            }
    
    }
    
    private static class PrintJobMonitor implements PrintJobListener {
    
        @Override
        public void printDataTransferCompleted(PrintJobEvent pje) {
            // Called to notify the client that data has been successfully
            // transferred to the print service, and the client may free
            // local resources allocated for that data.
        }
    
        @Override
        public void printJobCanceled(PrintJobEvent pje) {
            // Called to notify the client that the job was canceled
            // by a user or a program.
        }
    
        @Override
        public void printJobCompleted(PrintJobEvent pje) {
            // Called to notify the client that the job completed successfully.
        }
    
        @Override
        public void printJobFailed(PrintJobEvent pje) {
            // Called to notify the client that the job failed to complete
            // successfully and will have to be resubmitted.
        }
    
        @Override
        public void printJobNoMoreEvents(PrintJobEvent pje) {
            // Called to notify the client that no more events will be delivered.
        }
    
        @Override
        public void printJobRequiresAttention(PrintJobEvent pje) {
            // Called to notify the client that an error has occurred that the
            // user might be able to fix.
        }
    
    }
    

    }

    Thank you :) *I already tried 2 printers but still can't print.

  • JustOnce
    JustOnce over 8 years
    Yep. PDF not supported by printer: Canon iP2700 series. :( Do you have any ideas on how to print pdf files or other file format?
  • pietv8x
    pietv8x over 8 years
    TIFF probably is supported (check it the same way as I checked PDF). PDF is easily convertible to TIFF so that is not an issue. The code as you have it right now, edited according to my comments below your question, will work. Be sure to empty the print queue first.
  • pietv8x
    pietv8x over 8 years
    Another possibility is that your drivers are out of date. Download the most recent from here
  • JustOnce
    JustOnce over 8 years
    What printer are you using? Btw, thanks for the help :)
  • pietv8x
    pietv8x over 8 years
    Added more info in the answer. If it helped, please mark it as such :)
  • JustOnce
    JustOnce over 8 years
    It helped me a lot :D Thank you sir. The printer is my only problem so far hahahaha :D
  • JustOnce
    JustOnce over 8 years
    Sir, when you printed the document using your code, is the document name in the printing queue is "Java Document" and the status is "Spooling"?
  • pietv8x
    pietv8x over 8 years
    It is indeed "java document", "spooling" depends on the actual status of the print job. When your printer needs to be found, it would be something like "searching for printer" and when you are connecting to the printer, it would be "connecting" or so.