Printing pdf files using java
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.
JustOnce
Updated on June 23, 2022Comments
-
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 over 8 yearsYep. PDF not supported by printer: Canon iP2700 series. :( Do you have any ideas on how to print pdf files or other file format?
-
pietv8x over 8 yearsTIFF 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 over 8 yearsAnother possibility is that your drivers are out of date. Download the most recent from here
-
JustOnce over 8 yearsWhat printer are you using? Btw, thanks for the help :)
-
pietv8x over 8 yearsAdded more info in the answer. If it helped, please mark it as such :)
-
JustOnce over 8 yearsIt helped me a lot :D Thank you sir. The printer is my only problem so far hahahaha :D
-
JustOnce over 8 yearsSir, 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 over 8 yearsIt 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.