Imprimir um ficheiro PDF usando o 'PrinterJob' em Java

Eu tenho um problema ao tentar imprimir um arquivo PDF usando Java. Aqui está o meu código:

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()


Eu uso document.silentPrint(job); e job.print(printRequestAttributeSet); - funciona bem. Se eu usar document.silentPrint(job); - não consigo definir o ... PrintRequestAttributeSet.

Alguém pode dizer-me como definir o número de assinaturas?

Author: informatik01, 2013-04-30

5 answers

A minha impressora não suportava a impressão em PDF nativa.

Usei a biblioteca de código aberto Apache PDFBox https://pdfbox.apache.org para imprimir o PDF. A impressão em si ainda é entregue pelo PrinterJob de 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;
    }
}
 18
Author: RenRen, 2016-07-08 18:38:59

Isto funcionou para mim para imprimir um PDF com um JRE simples:

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();        
}
 15
Author: Mirko Seifert, 2013-09-23 14:45:17

O seguinte funcionou para mim para imprimir vários documentos PDF com uma janela de impressão:

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);
    }
}
 1
Author: Priya Tuli, 2016-05-24 09:09:56

Tenta este código:

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();

Você também pode seguir estes passos

 0
Author: Lingasamy Sakthivel, 2013-04-30 06:50:41

A implementação Pageável do PDDocument está desactualizada, utilize a classe adaptadora Pdpageável e tente setPrintable em vez de setPageable:

job.setPrintable(new PDPageable(document));
 -1
Author: roggi, 2014-03-28 13:31:15