我在尝试直接(没有任何对话框)在 Java Web 应用程序(在 Websphere Application Server 6.1 上)和 Java 程序(两者共享一些包含此打印代码的代码)上与打印机打印 PDF 时遇到问题。打印机位于 Windows 主机上,Web 应用程序和非 Web 应用程序在 Linux 上运行。
我已经读到这可能是一个权限问题,因为我会尝试在 Linux 中使用打印系统 (Windows) 上不存在或没有权限的用户进行打印。
服务器和 Java 应用程序使用 root 用户运行,所以我被困在这里(如果是权限问题),因为客户端告诉我,在打印服务器上具有权限的用户是另一个用户。我知道允许在该服务器上打印的用户名。
我认为如果可以通过 Samba 将 Linux 的 root 用户与 Windows 上的用户(有权打印)相关联,它就可以做到。但我一直没能做到(我对 Samba 知识非常陌生)。即使我能做到这一点,我也不确定它是否允许代码在 Windows 机器中查找打印机。我也没有找到任何方法来验证或连接到服务器。
有关更多信息,我使用该类javax.print.PrintServiceLookup
来查找打印机,这似乎没有允许我在服务器或类似设备上进行身份验证的方法。这是代码:
PrinterJob job = PrinterJob.getPrinterJob();
/* Create an array of PrintServices */
AttributeSet aset = new HashAttributeSet();
aset.add(new PrinterName(pObjImpresora, null));
aset.add(new RequestingUserName("user", null));
PrintService[] services = PrintServiceLookup.lookupPrintServices(null, aset);
if (services.length > 0) {
aObjLog.info("IMPRESORA SELECCIONADA: " + pObjImpresora);
job.setPrintService(services[0]);
PrintRequestAttributeSet printRequestAttributeSet = new HashPrintRequestAttributeSet();
printRequestAttributeSet.add(MediaSizeName.ISO_A4);
printRequestAttributeSet.add(new Copies(1));
JRPrintServiceExporter exporter = new JRPrintServiceExporter();
exporter.setParameter(JRPrintServiceExporterParameter.JASPER_PRINT, pObjJasperPrint);
/* We set the selected service and pass it as a paramenter */
exporter.setParameter(JRPrintServiceExporterParameter.PRINT_SERVICE, services[0]);
exporter.setParameter(JRPrintServiceExporterParameter.PRINT_SERVICE_ATTRIBUTE_SET, services[0].getAttributes());
exporter.setParameter(JRPrintServiceExporterParameter.PRINT_REQUEST_ATTRIBUTE_SET, printRequestAttributeSet);
exporter.setParameter(JRPrintServiceExporterParameter.DISPLAY_PAGE_DIALOG, Boolean.FALSE);
exporter.setParameter(JRPrintServiceExporterParameter.DISPLAY_PRINT_DIALOG, Boolean.FALSE);
exporter.exportReport();
}
pObjImpresora
是String
具有打印机名称的。我应该有办法到达服务器,然后是上面的打印机。我试过这个名字"\\\\printserver\\MYPRINTER"
,printserver
Windows 主机名在哪里,MYPRINTER
是我的打印机;)