PDFBox: Как распечатать PDF с указанным принтером?

Я хочу использовать PDFBox для печати PDF файлов, созданных iText. Я пробовал это успешно с классом PDDocument и его методом print(). Вы можете найти документацию здесь: http://pdfbox.apache.org/apidocs/.

(Я использую этот код:)

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

Метод print() отлично работает, но есть одна проблема: когда мне нужно печатать несколько файлов, метод просит меня выбрать принтер для каждого из документов.

Есть ли способ установить принтер только один раз?

Для выбора принтера я могу использовать этот код, например:

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

Заранее спасибо


Решение:

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

Ответ 1

PDDocument также предлагает другие методы печати, чем без параметров print():

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

Методы silentPrint не показывают диалог.

Вы можете получить то, что хотите, сначала выбрав принтер, а затем вызовите silentPrint с экземплярами PrinterJob, инициализированными соответственно.

Ответ 2

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

}

используйте приведенный выше код для печати pdf с помощью apache Pdfbox

EDIT: версия 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

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

Ответ 4

Вы можете использовать метод setPrintService() на объекте PrinterJob.

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