web-dev-qa-db-fra.com

PDFBox: Comment imprimer un pdf avec une imprimante spécifiée?

Je souhaite utiliser PDFBox pour imprimer PDF fichiers créés par iText. J'ai essayé avec succès avec la classe PDDocument et sa méthode print (). Vous pouvez trouver la documentation ici: http://pdfbox.Apache.org/apidocs/ .

(J'utilise ce code :)

public static void printPDF(String fileName)
        throws IOException, PrinterException {
    PDDocument doc = PDDocument.load(fileName);
    doc.print();
}

La méthode print () fonctionne très bien, mais il y a un problème: lorsque je dois imprimer plusieurs fichiers, la méthode me demande de sélectionner une imprimante pour chacun des documents ..

Existe-t-il un moyen de configurer l’imprimante une seule fois?

Pour sélectionner une imprimante, je peux utiliser ce code par exemple:

public static PrintService choosePrinter() {
    PrinterJob printJob = PrinterJob.getPrinterJob();
    if(printJob.printDialog()) {
        return printJob.getPrintService();          
    }
    else {
        return null;
    }
}

Merci d'avance


Solution:

public static PrintService choosePrinter() {
    PrinterJob printJob = PrinterJob.getPrinterJob();
    if(printJob.printDialog()) {
        return printJob.getPrintService();          
    }
    else {
        return null;
    }
}

public static void printPDF(String fileName, PrintService printer)
        throws IOException, PrinterException {
    PrinterJob job = PrinterJob.getPrinterJob();
    job.setPrintService(printer);
    PDDocument doc = PDDocument.load(fileName);
    doc.silentPrint(job);
}
12
Firzen

PDDocument propose également d'autres méthodes d'impression que la fonction print() sans paramètre:

public void print(PrinterJob printJob) throws PrinterException;
public void silentPrint() throws PrinterException;
public void silentPrint(PrinterJob printJob) throws PrinterException;

Les méthodes silentPrint n'affichent pas la boîte de dialogue.

Vous pouvez obtenir ce que vous voulez en sélectionnant d'abord une imprimante, puis appelez silentPrint avec les instances PrinterJob initialisées en conséquence.

12
mkl
 import Java.awt.print.PrinterException;

 import Java.io.IOException;

 import org.Apache.pdfbox.pdmodel.PDDocument;

 public class Print {

public static void main(String[] args) throws IOException, PrinterException
{
    PDDocument pdf=PDDocument.load("d:\\filename.pdf");
            pdf.print();
}

}

utilisez le code ci-dessus pour imprimer un pdf avec Apache Pdfbox

EDIT: version 2.0.0

import Java.awt.print.PrinterException;
import Java.awt.print.PrinterJob;
import Java.io.File;
import Java.io.IOException;
import org.Apache.pdfbox.pdmodel.PDDocument;
import org.Apache.pdfbox.printing.PDFPageable;

public class JPrint {

  public static void main(String[] args) throws IOException, PrinterException {
    String filename;
    filename = "C:\\pdf.pdf";

    try {
      PDDocument pdf = PDDocument.load(new File(filename));
      PrinterJob job = PrinterJob.getPrinterJob();
      job.setPageable(new PDFPageable(pdf));
      job.print();
    } catch (Exception e) {
      System.out.println(e);
    }
  }
}
3
Bharathiraja
PDDocument doc = PDDocument.load(new FileInputStream(System.getProperty("Java.io.tmpdir") + "\\pdf.pdf"));  //read pdf file.
String printerNameDesired = "VENDOR THERMAL PRINTER";

javax.print.PrintService[] service = PrinterJob.lookupPrintServices(); 
DocPrintJob docPrintJob = null;

int count = service.length;
for (int i = 0; i < count; i++) {
    if (service[i].getName().equalsIgnoreCase(printerNameDesired)) {
        docPrintJob = service[i].createPrintJob();
        i = count;
    }
}

PrinterJob pjob = PrinterJob.getPrinterJob();
pjob.setPrintService(docPrintJob.getPrintService());
pjob.setJobName("job");
doc.silentPrint(pjob);
3
Ankit Rana

Vous pouvez utiliser la méthode setPrintService () sur le PrinterJob Object.

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;
}
1
RenRen

Cela fonctionne bien pour moi. Mais est une ancienne version pdfbox. La nouvelle version ne supporte pas .load et .silentprint

public static void print(String nomImpresora, int cantVia) throws Exception {

    String aux;
    PrintService[] services = PrintServiceLookup.lookupPrintServices(null, null);
    int selectedService = -1;
    if (nomImpresora != null) {
            for (int i = 0; i < services.length; i++) {
                aux = services[i].getName();
                Log.addLog(Log.tipoMensaje.ErrorGenerico, "El valor de aux: " + aux + ".");
                if (services[i].getName().toUpperCase().contains(nomImpresora.toUpperCase())) {
                     /*If the service is named as what we are querying we select it */
                    selectedService = i;
                }
            }
        }

    if (selectedService == -1) {
        new Exception("Impresora no encontrada " + nomImpresora);
    }

    File fileToPrint = new File(rutaNombreArchivo);
    PDDocument load = PDDocument.load(fileToPrint.toString());       

    try {
        PrinterJob printJob = PrinterJob.getPrinterJob();
        Log.addLog(Log.tipoMensaje.ErrorSQL, "selected service" + selectedService);
        printJob.setPrintService(services[selectedService]);
        printJob.setJobName(fileToPrint.getName());

        final HashPrintRequestAttributeSet printRequestAttributes = new HashPrintRequestAttributeSet();

        printJob.print(printRequestAttributes);
        for (int i = 1; i <= cantVia; i++) {
             load.silentPrint(printJob);
        } 
    } catch (final PrinterException e) {
       e.printStackTrace();
    } finally {
       if (load != null) {
           load.close();
    }
}


}
0
Juan