|
@@ -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("没有此种打印机状态");
|
|
|
+ }
|
|
|
}
|