瀏覽代碼

增加返回打印机状态util

zhoupeng 1 年之前
父節點
當前提交
b4d248c7a8

+ 20 - 22
PrintServer/src/main/java/com/jd/printserver/controller/PrintServerController.java

@@ -23,10 +23,7 @@ import javax.print.PrintServiceLookup;
 import javax.print.attribute.Attribute;
 import javax.print.attribute.PrintServiceAttributeSet;
 import javax.print.attribute.standard.PrinterIsAcceptingJobs;
-import javax.print.attribute.standard.PrinterState;
-import javax.print.attribute.standard.PrinterStateReason;
 import javax.servlet.http.HttpServletRequest;
-import java.awt.print.PrinterJob;
 import java.io.File;
 import java.io.IOException;
 import java.util.*;
@@ -109,25 +106,26 @@ public class PrintServerController extends BaseController {
     @RequestMapping(value = "/getPrintName")
     @CrossOrigin
     public AjaxResult getPrintName(){
-        List<Map<String,String>> list=new ArrayList<>();
-        for (PrintService ps : PrinterJob.lookupPrintServices()) {
-            Map<String,String> map=new HashMap<>();
-            PrintServiceAttributeSet attributes = ps.getAttributes();
-            Attribute stateAttr = attributes.get(PrinterState.class);
-            Attribute reasonAttr = attributes.get(PrinterStateReason.class);
-
-            PrinterState printerState = (PrinterState) stateAttr;
-            PrinterStateReason printerStateReason = (PrinterStateReason) reasonAttr;
-            map.put("name",ps.toString());
-
-            if (printerState == PrinterState.IDLE && printerStateReason == null) {
-                map.put("state","在线");
-            } else {
-                map.put("state","离线");
-            }
-            list.add(map);
-        }
-        return success(list);
+        return success(PrintUtils.getAllPrintState());
+//        List<Map<String,String>> list=new ArrayList<>();
+//        for (PrintService ps : PrinterJob.lookupPrintServices()) {
+//            Map<String,String> map=new HashMap<>();
+//            PrintServiceAttributeSet attributes = ps.getAttributes();
+//            Attribute stateAttr = attributes.get(PrinterState.class);
+//            Attribute reasonAttr = attributes.get(PrinterStateReason.class);
+//
+//            PrinterState printerState = (PrinterState) stateAttr;
+//            PrinterStateReason printerStateReason = (PrinterStateReason) reasonAttr;
+//            map.put("name",ps.getName());
+//
+//            if (printerState == PrinterState.IDLE && printerStateReason == null) {
+//                map.put("state","在线");
+//            } else {
+//                map.put("state","离线");
+//            }
+//            list.add(map);
+//        }
+//        return success(list);
     }
 
     /**

+ 116 - 23
PrintServer/src/main/java/com/jd/printserver/utils/PrintUtils.java

@@ -2,21 +2,22 @@ package com.jd.printserver.utils;
 
 import com.jd.printserver.javafx.entity.PrintParam;
 import org.apache.pdfbox.pdmodel.PDDocument;
-import org.apache.pdfbox.pdmodel.PDPage;
-import org.apache.pdfbox.pdmodel.PDPageContentStream;
-import org.apache.pdfbox.pdmodel.common.PDRectangle;
-import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
 import org.apache.pdfbox.printing.PDFPrintable;
 import org.apache.pdfbox.printing.Scaling;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.print.*;
-import javax.print.attribute.*;
-import javax.print.attribute.standard.*;
+import javax.print.PrintService;
+import javax.print.attribute.HashPrintRequestAttributeSet;
+import javax.print.attribute.standard.PageRanges;
+import javax.print.attribute.standard.Sides;
 import java.awt.print.*;
 import java.io.*;
 import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 public class PrintUtils {
 
@@ -36,11 +37,10 @@ public class PrintUtils {
         PDFprint(outputFilePath, printParam);
 
 
-
     }
 
 
-    public static Boolean PDFprint(String inputImgPath, PrintParam printParam){
+    public static Boolean PDFprint(String inputImgPath, PrintParam printParam) {
 //加载文档模板
         try (PDDocument document = PDDocument.load(new File(inputImgPath))) {
             //单位:像素
@@ -52,7 +52,7 @@ public class PrintUtils {
             int marginBottom = 0;//printParam.mm2px(printParam.getMarginBottom());
             int paperWidth = printParam.mm2px(printParam.getWidth());
             int paperHeight = printParam.mm2px(printParam.getHeight());
-            int printWidth = paperWidth - marginLeft -marginRight;
+            int printWidth = paperWidth - marginLeft - marginRight;
             int printHeight = paperHeight - marginTop - marginBottom;
 //            int pdfPaperWidth = 0;
 //            int pdfPaperHeight = 0;
@@ -158,14 +158,14 @@ public class PrintUtils {
                     try {
                         printJob.setPrintService(printService);
                     } catch (PrinterException e) {
-                        log.error("打印失败,打印机不可用,请检查。打印机名称为 {}",printParam.getPrintName());
+                        log.error("打印失败,打印机不可用,请检查。打印机名称为 {}", printParam.getPrintName());
                         return false;
                     }
                     break;
                 }
             }
-            if(!isChoose){
-                log.error("打印失败,未找到打印机,请检查。打印机名称为 {}",printParam.getPrintName());
+            if (!isChoose) {
+                log.error("打印失败,未找到打印机,请检查。打印机名称为 {}", printParam.getPrintName());
                 return false;
             }
 
@@ -233,13 +233,13 @@ public class PrintUtils {
 
             //页码范围类型 1 全部 2 部分页码
             int pageRange = printParam.getPageRange();
-            if(pageRange == 2){
+            if (pageRange == 2) {
                 //打印页数
                 //打印第1~2页
-                if(printParam.getPageRangeEnd() > printParam.getPageRangeStart()){
+                if (printParam.getPageRangeEnd() > printParam.getPageRangeStart()) {
                     //打印开始到结束页
-                    pars.add(new PageRanges(printParam.getPageRangeStart(),printParam.getPageRangeEnd()));
-                }else{
+                    pars.add(new PageRanges(printParam.getPageRangeStart(), printParam.getPageRangeEnd()));
+                } else {
                     //打印一页
                     pars.add(new PageRanges(printParam.getPageRangeStart()));
                 }
@@ -259,24 +259,117 @@ public class PrintUtils {
         }
     }
 
-    public static float getMinScale(int printWidth, int printHeight, int imageWidth, int imageHeight){
+    public static float getMinScale(int printWidth, int printHeight, int imageWidth, int imageHeight) {
         float scale;
         float wScale = 1f;
-        if(printWidth < imageWidth){
+        if (printWidth < imageWidth) {
 
             wScale = BigDecimal.valueOf(printWidth)
-                    .divide(BigDecimal.valueOf(imageWidth),4, BigDecimal.ROUND_DOWN).floatValue();
+                    .divide(BigDecimal.valueOf(imageWidth), 4, BigDecimal.ROUND_DOWN).floatValue();
         }
         float hScale = 1f;
-        if(printHeight < imageHeight){
+        if (printHeight < imageHeight) {
             hScale = BigDecimal.valueOf(printHeight)
                     .divide(BigDecimal.valueOf(imageHeight), 4, BigDecimal.ROUND_DOWN).floatValue();
         }
-        if(wScale < hScale){
+        if (wScale < hScale) {
             scale = wScale;
-        }else{
+        } else {
             scale = hScale;
         }
         return scale;
     }
+
+    /**
+     * 获取本机打印机和所有的状态
+     *
+     * @return
+     */
+    public static List<Map<String, String>> getAllPrintState() {
+        List<Map<String, String>> list = new ArrayList<>();
+        try {
+            // 调用CMD命令
+            ProcessBuilder processBuilder = new ProcessBuilder("cmd.exe", "/c", "wmic printer get name,ExtendedPrinterStatus, PrinterStatus"); // /c参数表示执行后关闭CMD窗口
+            processBuilder.redirectErrorStream(true); // 将错误输出流与标准输出流合并
+            Process process = processBuilder.start();
+            // 获取命令输出结果
+            InputStream inputStream = process.getInputStream();
+            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "GBK")); // 设置编码为GBK
+            String line;
+
+            while ((line = reader.readLine()) != null) {
+                String trim = line.trim();
+                String s = trim.replaceAll("\\s+", " ");
+                if (!s.isEmpty() && s.charAt(0) != 'E') { // 从第二行开始(第一行始终以'E'开头)
+                    String ePrinterStatus = s.substring(0, 1);
+                    String printerName = s.substring(2, s.length() - 2);
+                    String printerStatus = s.substring(s.length() - 1);
+                    if (printerStatus.equals("1") || printerStatus.equals("2")) {
+                        Map<String, String> map = new HashMap<>();
+                        map.put("name", printerName);
+                        map.put("state", getPrintCode(ePrinterStatus));
+                        list.add(map);
+                    } else if (ePrinterStatus.equals("1") || ePrinterStatus.equals("2")) {
+                        Map<String, String> map = new HashMap<>();
+                        map.put("name", printerName);
+                        map.put("state", getPrintCode(printerStatus));
+                        list.add(map);
+                    }
+                }
+            }
+            // 等待命令执行完成
+            process.waitFor();
+        } catch (IOException | InterruptedException e) {
+            e.printStackTrace();
+        }
+        return list;
+    }
+
+    /**
+     * 通过打印机状态码,转换为打印机中文状态
+     *
+     * @param statusCode
+     * @return
+     */
+    public static String getPrintCode(String statusCode) {
+        switch (statusCode) {
+            case "1":
+                return "其它Other";
+            case "2":
+                return "未知Unknown";
+            case "3":
+                return "就绪Idle";
+            case "4":
+                return "打印中Printing";
+            case "5":
+                return "热身Warming Up";
+            case "6":
+                return "停止打印Stopped Printing";
+            case "7":
+                return "脱机Offline";
+            case "8":
+                return "暂停Paused";
+            case "9":
+                return "错误Error";
+            case "10":
+                return "忙碌Busy";
+            case "11":
+                return "不可用Not Available";
+            case "12":
+                return "等待Waiting";
+            case "13":
+                return "加工Processing";
+            case "14":
+                return "初始化Initialization";
+            case "15":
+                return "节能Power Save";
+            case "16":
+                return "待删除Pending Deletion";
+            case "17":
+                return "I/O激活I/O Active";
+            case "18":
+                return "手动进纸Manual Feed";
+        }
+        throw new RuntimeException("没有此种打印机状态");
+    }
 }