it-swarm.com.de

PDFBox: Wie drucke ich PDFs mit einem bestimmten Drucker?

Ich möchte PDFBox zum Drucken von PDF Dateien verwenden Erstellt von iText. Ich habe dies erfolgreich mit der PDDocument-Klasse und ihrer Methode print () versucht. Dokumentation finden Sie hier: http://pdfbox.Apache.org/apidocs/ .

(Ich benutze diesen Code :)

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

Die Methode print () funktioniert hervorragend, aber es gibt ein Problem: Wenn ich mehrere Dateien drucken muss, fordert mich die Methode auf, den Drucker für jedes Dokument auszuwählen.

Gibt es eine Möglichkeit, den Drucker nur einmal einzustellen?

Für die Druckerauswahl kann ich diesen Code zum Beispiel verwenden:

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

Danke im Voraus


Lösung:

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 bietet auch andere Druckmethoden als die parameterlose print():

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

Die silentPrint-Methoden zeigen den Dialog nicht an.

Sie erhalten das, was Sie möchten, indem Sie zunächst einen Drucker auswählen und dann silentPrint mit entsprechend initialisierten PrinterJob-Instanzen aufrufen.

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

}

verwenden Sie den obigen Code zum Drucken von PDF-Dateien mit 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

Sie können die Methode setPrintService () am PrinterJob Object verwenden.

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

Das funktioniert gut für mich. Ist aber eine alte Version von pdfbox. Die neue Version unterstützt .load und .silentprint nicht

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