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