PDFBox:如何使用指定的打印机打印PDF?

16

我想使用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);
}
5个回答

13

PDDocument提供的打印方法不仅仅是无参的print():

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

silentPrint 方法不会显示对话框。

您可以先选择打印机,然后使用相应初始化的 PrinterJob 实例调用 silentPrint 方法,以达到您想要的效果。


非常感谢!我真的太糊涂了。 - Firzen
请问您能否展示一下silentPrint()的例子?没有人解释过silentPrint。 - user285594
@YumYumYum,你使用的是哪个PdfBox版本?是1.8.x版本还是当前的2.0.0发布候选版?整个API已经发生了很大的变化... - mkl
先生,这是我的2.0.0代码:http://paste.ubuntu.com/15155477/,我需要以静默模式打印它,不要有任何弹出窗口。您能给予指导吗? - user285594
1
如上所述,API在2.0.0中发生了相当大的变化。在我能够说出实质性内容之前,我需要进行搜索。您应该考虑在此问题上询问一个实际的堆栈溢出问题,参考这个问题,并询问如何使用PdfBox 2.0.0完成相同的操作。 - mkl

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

1
这正是原帖作者所写的,但并没有以令人满意的方式工作。 - mkl
在执行pdf.print()之前,我如何选择特定的打印机? - user285594

2

您可以使用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;
}

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

0

这对我来说很好用。但是这是一个旧版本的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();
    }
}


}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接