5

我正在尝试为企业系统编写集成。

有一个 Web 服务器被来自两个不同地方的许多客户使用。此服务器上安装了两台网络打印机。

我想要做的是将 PDF 文档打印到这些打印机上。我希望程序将文档发送到请求的打印机。

我可以确定发出请求的位置。但是我无法在运行时设置默认打印机。

由于它是在后台运行的 Web 服务器,因此我无法填充打印机对话框并让用户选择打印机。我必须能够设置将以编程方式使用的打印机。

目前,我可以通过使用查看系统上注册的打印机, PrinterJob.lookupPrintServices();并且可以使用请求的打印机设置服务,但这不会更改默认打印机,系统会继续在默认打印机上打印。

请给我你的想法如何实现它。

4

1 回答 1

8

通过在网络上进行更多研究,我解决了我的问题。我在这里为可能需要它的其他人提供它;

我从这个网站得出了解决方案:

http://webmoli.com/2008/11/03/java-print-pdf/

注意:您需要将PdfRenderer .jar 库安装到您的项目中以运行网站中给出的代码:此处最初在 PrintPdf.java 中的代码没有给出我的解决方案,但是作者在评论部分添加了一个方法来设置不同的打印机在运行时打印。

方法是:

/**
* Sets the printer service to be used for printing
*
* @param argPrintServiceName
* @throws PrinterException
*/
public void setPrintService(String argPrintServiceName) throws PrinterException {
PrintService[] printServices = PrinterJob.lookupPrintServices();
int i;
for (i = 0; i < printServices.length; i++) {
if (printServices[i].getName().equalsIgnoreCase(argPrintServiceName)) {
printerJob.setPrintService(printServices[i]);
break;
}
}
if (i == printServices.length) {
throw new PrinterException(“Invalid print service name: ” + argPrintServiceName);
}
}

您需要对此方法进行一些更改。由于printerJob 不是全局变量,它不会影响打印。为此,将此方法的返回参数设置为 PrintService:

 public static PrintService setPrintService(String argPrintServiceName) throws PrinterException {
        PrintService psr = null;
    PrintService[] printServices = PrinterJob.lookupPrintServices();
    int i;
    for (i = 0; i < printServices.length; i++) {
    if (printServices[i].getName().equalsIgnoreCase(argPrintServiceName)) {
        psr = printServices[i];          
    break;
    }
    }
    if (i == printServices.length) {
    throw new PrinterException("Invalid print service name: " + argPrintServiceName);
    }
    return psr;
    }

在 main 方法中调用如下方法:

PrintService ps = setPrintService("Printer Name Here");

现在,您需要将此服务发送到其他方法;

改变这个:

PrintPdf printPDFFile = new PrintPdf(fis, "Test Print PDF");

PrintPdf printPDFFile = new PrintPdf(fis, "Test Print PDF", ps);

这些是您需要更改的其他方法:

public PrintPdf(byte[] content, String jobName, PrintService ps) throws  
        IOException, PrinterException 
        {
        initialize(content, jobName, ps);
    } 



 public PrintPdf(InputStream inputStream, String jobName, PrintService ps)
    {
     *
     *
     initialize(pdfContent, jobName, ps);
    }

在分配 pjob 后添加这行代码:pjob.setPrintService(ps);

private void initialize(byte[] pdfContent, String jobName, PrintService ps) throws      
 IOException, PrinterException 
 {
  *
  *
        pjob = PrinterJob.getPrinterJob();
        pjob.setPrintService(ps);
  *
  *
  ...
 }

此代码完美运行,并且能够直接打印 PDF。

于 2013-03-06T14:32:07.040 回答