2

我正面临 java.awt.print.PrinterException: Printer is not accepting job.. 发送文档以动态打印时我的 jsp 页面中出现异常......

          String pdfFile = "D://Records.pdf";
          boolean silentPrint = false;
          String printerindx = "1";
          String password = "";

          PrintService defaultService = PrintServiceLookup.lookupDefaultPrintService();

            if (pdfFile == null) {
                System.out.println("No PDF file available");
            }

            PDDocument document = null;

            try {
                document = PDDocument.load(pdfFile);
                if (document.isEncrypted()) {
                    document.decrypt(password);
                }
                PrinterJob printJob = PrinterJob.getPrinterJob();

                if (printerindx != null) {
                    PrintService[] printServices = PrinterJob.lookupPrintServices();
                    for (PrintService printService : printServices) {
                        if (printService.getName().equals("HP LaserJet P1007") {
                            System.out.println("Printer found ....");
                            printJob.setPrintService(printService);
                            System.out.println(printService);
                        }
                    }
                }

                    document.print(printJob);

            } finally {
                if (document != null) {
                    document.close();
                }
            }

            System.out.println("Printing Completed...");

怎么了?

4

2 回答 2

2

据此:openjdk bug这是打印库中的错误,您有一些选择:

  1. 在错误已修复的地方使用不同的 JRE。
  2. 重复打印直到它不会抛出,有类似问题的人说它经常在第一次重复时起作用。
  3. 从这里使用 hack:hack,参见 ForcedAcceptPrintService 类
于 2015-07-24T07:45:40.600 回答
0

什么失败了

我之前尝试过 Piro 的第三个建议中的解决方案,但我收到了与后续海报(帖子 #10)相同的错误。

什么有效

我执行了字节码破解,它覆盖了 Win32PrintService getPrinterIsAcceptingJobs() 方法以始终返回“ACCEPTING_JOBS”状态。这完美地满足了我的需求:打印机始终被视为可用,即使它实际上处于脱机状态,只要它重新联机,打印作业就会排队等待。我唯一需要做的就是从 GitHub 获取旧版本的Javassist (3.18),因为我正在使用 Java 7 进行编译。尝试使用最新版本 (3.20) 进行编译——它是用 Java 8 构建的——给出了我出现以下错误:

java.lang.UnsupportedClassVersionError:sun/print/Win32PrintService:不支持的major.minor版本52.0

对于不熟悉创建 PrintServiceFixer.jar 所需编译的任何其他人,以下是我采取的步骤:

  1. 将 javassist.jar 复制到 <JAVA_HOME>\jre\lib\ext
  2. 编译的 Win32PrintServiceFixer.java(来自 <JAVA_HOME>\jre\lib)

    javac -classpath .\rt.jar -bootclasspath ext\javassist.jar Win32PrintServiceFixer.java
    
  3. 创建 PrintServiceFixer.jar 文件:

    java -cp .;.\ext\javassist.jar Win32PrintServiceFixer
    
  4. 将 PrintServiceFixer.jar 从 <JAVA_HOME>\jre\lib\target 复制到我存储程序库/JAR 文件的目录。

  5. 运行我的程序

    java -jar -Xbootclasspath/p:path\to\my\program's\libs\PrintServiceFixer.jar MyPrintingProgram.jar
    
于 2016-05-26T23:30:25.287 回答