【问题标题】:PDFBox: How to print pdf with specified printer?PDFBox:如何使用指定的打印机打印 pdf?
【发布时间】:2013-09-09 07:19:40
【问题描述】:

我想使用 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);
}

【问题讨论】:

    标签: java pdf printing pdfbox


    【解决方案1】:

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

    【讨论】:

      【解决方案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;
      }
      

      【讨论】:

        【解决方案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);
            }
          }
        }
        

        【讨论】:

        • 这正是 OP 所写的内容,但效果并不令人满意。
        • 如何在 pdf.print() 之前选择特定的打印机; ?
        【解决方案4】:
        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);
        

        【讨论】:

          【解决方案5】:

          PDDocument 还提供了除无参数print() 之外的其他打印方法:

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

          silentPrint 方法不显示对话框。

          您可以先选择一台打印机,然后调用 silentPrint 并相应地初始化 PrinterJob 实例,从而获得您想要的结果。

          【讨论】:

          • 非常感谢!我是瞎子。
          • 您能否展示一下silentPrint() 的示例。没有人解释silentPrint。
          • @YumYumYum 您使用哪个 PdfBox 版本?一些 1.8.x 版本或当前的 2.0.0 候选版本?整个 API 发生了很大变化……
          • 先生,这是我的 2.0.0 代码:paste.ubuntu.com/15155477,我必须在没有任何弹出窗口的情况下以静音模式打印。可以请教一下吗?
          • 如上所述,API 在 2.0.0 中发生了很大变化。在我能说出任何实质性的东西之前,我必须进行搜索。您应该考虑就这个问题提出一个实际的堆栈溢出问题,参考这个问题并询问如何对 PdfBox 2.0.0 做同样的事情。
          猜你喜欢
          • 1970-01-01
          • 2022-07-08
          • 2021-11-02
          • 2016-10-09
          • 2016-06-02
          • 2011-02-22
          • 1970-01-01
          • 2016-06-15
          • 1970-01-01
          相关资源
          最近更新 更多