我正在尝试为企业系统编写集成。
有一个Web服务器正在被来自两个不同地方的许多客户使用。 此服务器上安装了两台网络打印机。
我想要做的是将PDF文档打印到这些打印机。我希望程序将文档发送到请求它的打印机。
我可以确定发出请求的位置。但是,我无法在运行时设置默认打印机。
由于它是在后台运行的Web服务器,因此我无法填充打印机对话框并让用户选择打印机。我必须能够设置将以编程方式使用的打印机。
目前,我能够使用PrinterJob.lookupPrintServices();
在系统上看到已注册的打印机,我可以使用请求的打印机设置服务但不会更改默认打印机,系统会在默认打印机上保持打印
请告诉我你如何实现它的想法。
答案 0 :(得分: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打印。