19

I have an issue when trying to print a PDF file using Java. Here is my code:

PdfReader readFtp = new PdfReader();    // This class is used for reading a PDF file
PDDocument document = readFtp.readFTPFile(documentID);

printRequestAttributeSet.add(new PageRanges(1, 10));

job.setPageable(document);
job.print(printRequestAttributeSet);    // calling for print

document.close()


I use document.silentPrint(job); and job.print(printRequestAttributeSet); - it works fine. If I use document.silentPrint(job); - I can't set the PrintRequestAttributeSet.

Can anyone tell me how to set the PrintRequestAttributeSet?

informatik01
  • 16,038
  • 10
  • 74
  • 104
user2331844
  • 201
  • 1
  • 2
  • 7

6 Answers6

36

My Printer did not support native PDF printing.

I used the open source library Apache PDFBox https://pdfbox.apache.org to print the PDF. The printing itself is still handeled by the PrinterJob of Java.

import java.awt.print.PrinterJob;
import java.io.File;

import javax.print.PrintService;
import javax.print.PrintServiceLookup;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.printing.PDFPageable;

public class PrintingExample {

    public static void main(String args[]) throws Exception {

        PDDocument document = PDDocument.load(new File("C:/temp/example.pdf"));

        PrintService myPrintService = findPrintService("My Windows printer Name");

        PrinterJob job = PrinterJob.getPrinterJob();
        job.setPageable(new PDFPageable(document));
        job.setPrintService(myPrintService);
        job.print();

    }       

    private static PrintService findPrintService(String printerName) {
        PrintService[] printServices = PrintServiceLookup.lookupPrintServices(null, null);
        for (PrintService printService : printServices) {
            if (printService.getName().trim().equals(printerName)) {
                return printService;
            }
        }
        return null;
    }
}
RenRen
  • 10,550
  • 4
  • 37
  • 39
21

This worked for me to print a PDF with a plain JRE:

public static void main(String[] args) throws PrintException, IOException {
    DocFlavor flavor = DocFlavor.SERVICE_FORMATTED.PAGEABLE;
    PrintRequestAttributeSet patts = new HashPrintRequestAttributeSet();
    patts.add(Sides.DUPLEX);
    PrintService[] ps = PrintServiceLookup.lookupPrintServices(flavor, patts);
    if (ps.length == 0) {
        throw new IllegalStateException("No Printer found");
    }
    System.out.println("Available printers: " + Arrays.asList(ps));

    PrintService myService = null;
    for (PrintService printService : ps) {
        if (printService.getName().equals("Your printer name")) {
            myService = printService;
            break;
        }
    }

    if (myService == null) {
        throw new IllegalStateException("Printer not found");
    }

    FileInputStream fis = new FileInputStream("C:/Users/John Doe/Desktop/SamplePDF.pdf");
    Doc pdfDoc = new SimpleDoc(fis, DocFlavor.INPUT_STREAM.AUTOSENSE, null);
    DocPrintJob printJob = myService.createPrintJob();
    printJob.print(pdfDoc, new HashPrintRequestAttributeSet());
    fis.close();        
}
Mirko Seifert
  • 542
  • 4
  • 7
  • 2
    This only works on Linux, right? I believe on Windows there is no PDF renderer in Java, correct? – Daniel Jul 31 '14 at 15:00
  • 2
    @Mirko Seifert This code won't work, my printer prints only unreadable characters instead my PDF doc. – whizzzkey Nov 17 '14 at 01:25
  • 5
    The code only works with printers which are capable of interpreting the PDF on their own. I found some printers which do so (e.g., some HP LaserJet models), but I also experienced that some printers print the raw content of the PDF file (as text). In such a case you'll need to convert the PDF to an image (e.g., using Ghostview). – Mirko Seifert Apr 17 '15 at 19:58
  • 2
    Although posted many years ago, this response still works today and saved me hours of development effort. Thank you, sir. Wherever you may be today, thank you! – eugene Sep 20 '18 at 06:55
3

The following worked for me to print multiple PDF document with a print dialog:

public void printPDF()
{
    PrinterJob printerJob = PrinterJob.getPrinterJob();

    PrintService printService;
    if(printerJob.printDialog())
    {
        printService = printerJob.getPrintService();
    }
    DocFlavor docType = DocFlavor.INPUT_STREAM.AUTOSENSE;

    for (//fetch documents to be printed)
    {
        DocPrintJob printJob = printService.createPrintJob();
        final byte[] byteStream = // fetch content in byte array;
            Doc documentToBePrinted = new SimpleDoc(new ByteArrayInputStream(byteStream), docType, null);
        printJob.print(documentToBePrinted, null);
    }
}
Priya Tuli
  • 51
  • 2
0

Try this code:

FileInputStream fis = new FileInputStream(“C:/mypdf.pdf”);
Doc pdfDoc = new SimpleDoc(fis, null, null);
DocPrintJob printJob = printService.createPrintJob();
printJob.print(pdfDoc, new HashPrintRequestAttributeSet());
fis.close();

You can also follow these steps

Linga
  • 10,379
  • 10
  • 52
  • 104
0
import java.awt.print.PrinterJob;
import java.io.File;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.printing.PDFPageable;

public class Main {

    public static void main(String[] args) throws Exception {

        String filename = "Path for PDF File"; 
        PDDocument document = PDDocument.load(new File (filename));

        //takes standard printer defined by OS
        PrintService myPrintService = PrintServiceLookup.lookupDefaultPrintService();
        myPrintService = findPrintService("Your Printer Name");
        PrinterJob job = PrinterJob.getPrinterJob();
        job.setPageable(new PDFPageable(document));
        job.setPrintService(myPrintService);
        job.print();

    }       

    private static PrintService findPrintService(String printerName) {
        PrintService[] printServices = PrintServiceLookup.lookupPrintServices(null, null);
        for (PrintService printService : printServices) {
            if (printService.getName().trim().equals(printerName)) {
                return printService;
            }
        }
        return null;
    }

Use version 2.0.4 of Apache PDFBox. If using Maven Project, include the following in the XML file.

<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox</artifactId>
    <version>2.0.4</version>
</dependency>
-1

Pageable implementation of PDDocument is deprecated, use PDPageable adapter class instead and try setPrintable instead of setPageable:

job.setPrintable(new PDPageable(document));
roggi
  • 1
  • 1
    hello new user! a better example that shows how to set the PageRanges with your example would be nice as well as a reference to the javadoc apis and version – Martin Serrano Mar 28 '14 at 13:52
  • `PDFPageable` is not a valid parameter for the `PrintJob.setPrintable` method. – JRSofty Apr 19 '18 at 19:59