我想使用 PDFBox 打印 iText 创建的 PDF 文件。我已经使用 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);
}
PDDocument
还提供了除无参数之外的其他打印方法print()
:
public void print(PrinterJob printJob) throws PrinterException;
public void silentPrint() throws PrinterException;
public void silentPrint(PrinterJob printJob) throws PrinterException;
silentPrint
方法不显示对话框。
您可以先选择一台打印机,然后调用
silentPrint
并相应初始化 PrinterJob
实例来获得您想要的结果。
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();
}
}
使用上面的代码使用apache Pdfbox打印pdf
编辑:版本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);
}
}
}
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);
您可以在 PrinterJob 对象上使用 setPrintService() 方法。
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;
}
这对我来说效果很好。不过是旧版本的pdfbox。新版本不支持.load和.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();
}
}
}
在新版本(3.0.0+)中,我们可以使用
PDDocument document = Loader.loadPDF(new File("path/file"));