Commit a6680a34 authored by 周亚武's avatar 周亚武

项目初始化调整

parent 70226210
...@@ -28,9 +28,8 @@ ...@@ -28,9 +28,8 @@
<profiles.log.path>/logs</profiles.log.path> <profiles.log.path>/logs</profiles.log.path>
<profiles.data.path>/data</profiles.data.path> <profiles.data.path>/data</profiles.data.path>
<profiles.server.port>9000</profiles.server.port> <profiles.server.port>9000</profiles.server.port>
<profiles.siteconfig.filepath>F:\\mid.prop</profiles.siteconfig.filepath>
<profiles.siteconfig.configpath>F:\\config.prop</profiles.siteconfig.configpath> <profiles.siteconfig.configpath>F:\\config.prop</profiles.siteconfig.configpath>
<profiles.siteconfig.url>http://192.168.0.98:8090</profiles.siteconfig.url> <profiles.siteconfig.url>http://192.168.0.98:11091</profiles.siteconfig.url>
<profiles.javacpp.platform>windows-x86_64</profiles.javacpp.platform> <profiles.javacpp.platform>windows-x86_64</profiles.javacpp.platform>
</properties> </properties>
</profile> </profile>
...@@ -42,9 +41,8 @@ ...@@ -42,9 +41,8 @@
<profiles.log.level>INFO</profiles.log.level> <profiles.log.level>INFO</profiles.log.level>
<profiles.log.path>/root/logs</profiles.log.path> <profiles.log.path>/root/logs</profiles.log.path>
<profiles.server.port>9000</profiles.server.port> <profiles.server.port>9000</profiles.server.port>
<profiles.siteconfig.filepath>/root/mid.prop</profiles.siteconfig.filepath>
<profiles.siteconfig.configpath>/root/config.prop</profiles.siteconfig.configpath> <profiles.siteconfig.configpath>/root/config.prop</profiles.siteconfig.configpath>
<profiles.siteconfig.url>http://192.168.0.98:8090</profiles.siteconfig.url> <profiles.siteconfig.url>http://192.168.0.98:11091</profiles.siteconfig.url>
<profiles.javacpp.platform>linux-x86_64</profiles.javacpp.platform> <profiles.javacpp.platform>linux-x86_64</profiles.javacpp.platform>
<!-- <profiles.javacpp.platform>linux-arm64</profiles.javacpp.platform>--> <!-- <profiles.javacpp.platform>linux-arm64</profiles.javacpp.platform>-->
</properties> </properties>
...@@ -52,14 +50,13 @@ ...@@ -52,14 +50,13 @@
<profile> <profile>
<id>reg</id> <id>reg</id>
<properties> <properties>
<profiles.active>reg</profiles.active> <profiles.active>dy</profiles.active>
<profiles.filepath>/tmp</profiles.filepath> <profiles.filepath>/tmp</profiles.filepath>
<profiles.log.level>INFO</profiles.log.level> <profiles.log.level>INFO</profiles.log.level>
<profiles.log.path>/mortals/app/logs</profiles.log.path> <profiles.log.path>/mortals/app/logs</profiles.log.path>
<profiles.server.port>9000</profiles.server.port> <profiles.server.port>9000</profiles.server.port>
<profiles.siteconfig.filepath>/root/mid.prop</profiles.siteconfig.filepath>
<profiles.siteconfig.configpath>/root/config.prop</profiles.siteconfig.configpath> <profiles.siteconfig.configpath>/root/config.prop</profiles.siteconfig.configpath>
<profiles.siteconfig.url>http://10.207.153.67:8090</profiles.siteconfig.url> <profiles.siteconfig.url>http://10.207.153.67:11091</profiles.siteconfig.url>
<profiles.javacpp.platform>linux-arm64</profiles.javacpp.platform> <profiles.javacpp.platform>linux-arm64</profiles.javacpp.platform>
</properties> </properties>
</profile> </profile>
......
package com.mortals.xhx.busiz.handler;
import com.mortals.framework.exception.AppException;
import com.mortals.xhx.busiz.req.ApiReqPdu;
import com.mortals.xhx.busiz.rsp.ApiResp;
import com.mortals.xhx.busiz.rsp.ApiRespPdu;
import com.mortals.xhx.common.code.ApiRespCodeEnum;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.ObjectUtils;
/**
* 骨架类
* @author:
* @date: 2023/1/6 15:38
*/
@Slf4j
public abstract class BaseReqHandler<T, K> implements ReqHandler {
/**
* 处理请求
*
* @param request
* @return
*/
public ApiResp<K> process(T request) {
try {
validData(request);
return handle(request);
} catch (Throwable t) {
log.error("异常:", t);
return null;
}
}
/**
* 业务处理
*
* @param request
* @return
* @throws AppException
*/
protected abstract ApiResp<K> handle(T request) throws AppException;
private ApiRespPdu<K> getApiResponsePdu(ApiRespCodeEnum result, K data, Throwable t) {
ApiRespPdu<K> response = new ApiRespPdu<>();
response.setCode(result.getValue());
response.setMsg(ObjectUtils.isEmpty(t) ? result.getLabel() : t.getMessage());
response.setData(data);
return response;
}
/**
* 校验数据
*
* @param request
* @return
* @throws Exception
*/
protected abstract void validData(T request) throws IllegalArgumentException;
}
package com.mortals.xhx.busiz.handler;
public interface ReqHandler {
}
package com.mortals.xhx.busiz.handler.impl;
import com.mortals.framework.exception.AppException;
import com.mortals.xhx.busiz.handler.BaseReqHandler;
import com.mortals.xhx.busiz.rsp.ApiResp;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* p
*/
@Service
@Slf4j
public class BusizAssessmentReqHandler extends BaseReqHandler<String, Object> {
@Override
protected ApiResp<Object> handle(String request) throws AppException {
//todo
return null;
}
@Override
protected void validData(String request) throws IllegalArgumentException {
}
}
package com.mortals.xhx.busiz.handler.impl;
import com.alibaba.fastjson.JSON;
import com.mortals.framework.common.Rest;
import com.mortals.framework.exception.AppException;
import com.mortals.xhx.busiz.handler.BaseReqHandler;
import com.mortals.xhx.busiz.rsp.ApiResp;
import com.mortals.xhx.busiz.rsp.CaptureResp;
import com.mortals.xhx.busiz.rsp.PrintListResp;
import com.mortals.xhx.common.code.YesNoEnum;
import com.mortals.xhx.module.capture.model.File;
import com.mortals.xhx.module.capture.service.CaptureService;
import com.mortals.xhx.module.print.model.Printer;
import com.mortals.xhx.module.print.service.PrintService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 高拍仪
*
* @author: zxfei
* @date: 2024/1/2 9:51
*/
@Service
@Slf4j
public class BusizCaptureReqHandler extends BaseReqHandler<String, Void> {
@Autowired
private CaptureService captureService;
@Override
protected ApiResp<Void> handle(String waitTime) throws AppException {
Rest<List<File>> rest = captureService.getCapture(waitTime);
CaptureResp captureResp = new CaptureResp();
if (rest.getCode() == YesNoEnum.YES.getValue()) {
captureResp.setStatus(CaptureResp.SUCCESS);
captureResp.setCode(YesNoEnum.YES.getValue());
captureResp.setMessage(rest.getMsg());
captureResp.setData(rest.getData());
//captureResp.setFilelist(rest.getData());
} else {
captureResp.setCode(YesNoEnum.NO.getValue());
captureResp.setStatus(CaptureResp.FAIL);
captureResp.setMessage("高拍仪获取照片失败!");
}
log.info("【高拍仪】【执行响应】-->{}", JSON.toJSONString(captureResp));
return captureResp;
}
@Override
protected void validData(String request) throws IllegalArgumentException {
}
}
package com.mortals.xhx.busiz.handler.impl;
import com.alibaba.fastjson.JSON;
import com.mortals.framework.common.Rest;
import com.mortals.framework.exception.AppException;
import com.mortals.xhx.busiz.handler.BaseReqHandler;
import com.mortals.xhx.busiz.rsp.ApiResp;
import com.mortals.xhx.busiz.rsp.IdCardResp;
import com.mortals.xhx.busiz.rsp.PrintListResp;
import com.mortals.xhx.module.idCard.model.IdCardCons;
import com.mortals.xhx.module.idCard.service.IdCardService;
import com.mortals.xhx.module.print.model.Printer;
import com.mortals.xhx.module.print.service.PrintService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 身份证识别
*
* @author:
* @date: 2023/1/5 22:25
*/
@Service
@Slf4j
public class BusizIdcardRecognitionReqHandler extends BaseReqHandler<String, Void> {
@Autowired
private IdCardService idCardService;
@Override
protected ApiResp<Void> handle(String printReq) throws AppException {
IdCardCons idCardCons = new IdCardCons();
IdCardResp idCardResp = idCardService.readIdCardMessage(idCardCons);
log.info("【身份识别】【执行响应】-->{}", JSON.toJSONString(idCardResp));
return idCardResp;
}
@Override
protected void validData(String request) throws IllegalArgumentException {
}
}
package com.mortals.xhx.busiz.handler.impl;
import com.alibaba.fastjson.JSON;
import com.mortals.framework.common.Rest;
import com.mortals.framework.exception.AppException;
import com.mortals.xhx.busiz.handler.BaseReqHandler;
import com.mortals.xhx.busiz.req.PrintReq;
import com.mortals.xhx.busiz.rsp.ApiResp;
import com.mortals.xhx.busiz.rsp.PrintListResp;
import com.mortals.xhx.busiz.rsp.PrintQueueResp;
import com.mortals.xhx.module.print.model.Printer;
import com.mortals.xhx.module.print.model.PrinterQueue;
import com.mortals.xhx.module.print.service.PrintService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 打印机列表
*
* @author:
* @date: 2023/1/5 22:25
*/
@Service
@Slf4j
public class BusizPrintListReqHandler extends BaseReqHandler<String, Void> {
@Autowired
private PrintService printService;
@Override
protected ApiResp<Void> handle(String printerName) throws AppException {
log.info("【打印机队列查询】【请求体】-->{}", printerName);
Rest<List<PrinterQueue>> rest = printService.getPrintQueue(printerName);
PrintQueueResp printQueueResp = new PrintQueueResp();
printQueueResp.setStatus(PrintListResp.SUCCESS);
printQueueResp.setMessage("success");
printQueueResp.setQueueList(rest.getData());
printQueueResp.setQueueNum(rest.getData().size() + "");
log.info("【打印列表】【执行响应】-->{}", JSON.toJSONString(printQueueResp));
return printQueueResp;
}
@Override
protected void validData(String request) throws IllegalArgumentException {
}
}
package com.mortals.xhx.busiz.handler.impl;
import com.alibaba.fastjson.JSON;
import com.mortals.framework.common.Rest;
import com.mortals.framework.exception.AppException;
import com.mortals.xhx.busiz.handler.BaseReqHandler;
import com.mortals.xhx.busiz.rsp.ApiResp;
import com.mortals.xhx.busiz.rsp.PrintListResp;
import com.mortals.xhx.module.print.model.Printer;
import com.mortals.xhx.module.print.service.PrintService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 打印机打印队列
*
* @author:
* @date: 2023/1/5 22:25
*/
@Service
@Slf4j
public class BusizPrintQueueReqHandler extends BaseReqHandler<String, Void> {
@Autowired
private PrintService printService;
@Override
protected ApiResp<Void> handle(String printReq) throws AppException {
Rest<List<Printer>> rest = printService.getPrintList();
PrintListResp printListResp = new PrintListResp();
printListResp.setStatus(PrintListResp.SUCCESS);
printListResp.setMessage("success");
printListResp.setPrinterList(rest.getData());
log.info("【打印列表】【执行响应】-->{}", JSON.toJSONString(printListResp));
return printListResp;
}
@Override
protected void validData(String request) throws IllegalArgumentException {
}
}
package com.mortals.xhx.busiz.handler.impl;
import com.alibaba.fastjson.JSON;
import com.mortals.framework.common.Rest;
import com.mortals.framework.exception.AppException;
import com.mortals.xhx.busiz.handler.BaseReqHandler;
import com.mortals.xhx.busiz.req.ApiReqPdu;
import com.mortals.xhx.busiz.req.PrintReq;
import com.mortals.xhx.busiz.rsp.ApiResp;
import com.mortals.xhx.busiz.rsp.PrintQueueResp;
import com.mortals.xhx.module.print.service.PrintService;
import lombok.extern.apachecommons.CommonsLog;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* 打印handler
*
* @author:
* @date: 2023/1/5 22:25
*/
@Service
@Slf4j
public class BusizPrintReqHandler extends BaseReqHandler<PrintReq, Void> {
@Autowired
private PrintService printService;
@Override
protected ApiResp<Void> handle(PrintReq printReq) throws AppException {
log.info("【打印】【请求体】-->{}", JSON.toJSONString(printReq));
Rest<Void> rest = printService.executePrint(printReq);
log.info("【打印】【执行响应】-->{}", JSON.toJSONString(rest));
if (rest.getCode() == Rest.SUCCESS) {
return ApiResp.ok(rest.getMsg());
} else {
return ApiResp.fail(rest.getMsg());
}
}
@Override
protected void validData(PrintReq request) throws IllegalArgumentException {
}
}
package com.mortals.xhx.busiz.handler.impl;
import com.alibaba.fastjson.JSON;
import com.mortals.framework.common.Rest;
import com.mortals.framework.exception.AppException;
import com.mortals.xhx.busiz.handler.BaseReqHandler;
import com.mortals.xhx.busiz.rsp.ApiResp;
import com.mortals.xhx.busiz.rsp.CaptureResp;
import com.mortals.xhx.busiz.rsp.SignResp;
import com.mortals.xhx.common.code.YesNoEnum;
import com.mortals.xhx.module.capture.service.CaptureService;
import com.mortals.xhx.module.sign.modle.File;
import com.mortals.xhx.module.sign.service.SignService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 签名板
*
* @author: zhou
* @date: 2024/7/8 9:51
*/
@Service
@Slf4j
public class BusizSignReqHandler extends BaseReqHandler<String, Void> {
@Autowired
private SignService signService;
@Override
protected ApiResp<Void> handle(String waitTime) throws AppException {
SignResp signResp = signService.getSign(waitTime);
log.info("【签名板】【执行响应】-->{}", JSON.toJSONString(signResp));
return signResp;
}
@Override
protected void validData(String request) throws IllegalArgumentException {
}
}
package com.mortals.xhx.busiz.handler.impl;
import com.alibaba.fastjson.JSON;
import com.mortals.framework.exception.AppException;
import com.mortals.xhx.busiz.handler.BaseReqHandler;
import com.mortals.xhx.busiz.rsp.ApiResp;
import com.mortals.xhx.busiz.rsp.SignResp;
import com.mortals.xhx.busiz.rsp.SocialResp;
import com.mortals.xhx.module.sign.service.SignService;
import com.mortals.xhx.module.social.service.SocialService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* 社保卡 T10三合一
*
* @author: zhou
* @date: 2024/7/15 9:51
*/
@Service
@Slf4j
public class BusizSocialReqHandler extends BaseReqHandler<String, Void> {
@Autowired
private SocialService socialService;
@Override
protected ApiResp<Void> handle(String socialType) throws AppException {
SocialResp socialResp = socialService.getSocial(socialType);
log.info("【社保卡T10三合一】【执行响应】-->{}", JSON.toJSONString(socialResp));
return socialResp;
}
@Override
protected void validData(String request) throws IllegalArgumentException {
}
}
package com.mortals.xhx.busiz.req;
import lombok.Data;
@Data
public class ApiReqPdu<T> {
/**
* 透传数据
*/
private T transmission;
}
package com.mortals.xhx.busiz.req;
import com.mortals.xhx.module.print.model.PrintContent;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* 打印请求
* @author:
* @date: 2022/12/26 10:24
*/
@Data
public class PrintReq implements Serializable {
/**
* PrinterJson中增加papertype参数,为空则按以前逻辑处理
* ,为ticket、A3、A4则分别设置PrinterJson中打印机名称和宽度(按照中间件的配置来)
* papertype为空则忽略,为ticket则将printername设为小票打印机名称,
* 为a3则将printername设为A3打印机名称,
* 为a4则将printername设为A4打印机名称
*/
private String papertype;
/**
* 打印机名称,为空则为默认打印机
*/
private String printername;
/**
* 打印机纸张宽度
*/
private String printerpaperwidth;
/**
* 打印类型,url/base64/normal,
* url为网络文件打印,base64为串文件打印,normal为普通行打印
*/
private String printertype;
/**
* 打印文件网络地址,当printertype为url时有效,其它参数时可省略,网络文件地址,
* 支持doc、docx、xls、xlsx、pdf、图片文件等,但依靠windows默认对文件的打印支持
*/
private String url;
/**
* 打印base64字符串,当printertype为base64时有效,其它参数时可省略,base64串打印支持,
* 必须依靠【data:application/msword;base64,】前缀指明,支持doc、docx、xls、xlsx、pdf、txt几种格式,
* 对应前缀:【application/msword】、【application/vnd.openxmlformats-officedocument.wordprocessingml.document】、
* 【application/vnd.ms-excel】、【application/vnd.openxmlformats-officedocument.spreadsheetml.sheet】、【application/pdf】
* 、【text/plain】 增加对图片格式的支持 2021-03-09【image/gif】、【image/png】、【image/jpeg】、【image/jpg】、【image/bmp】
*/
private String base64;
/**
* 打印行集合,当printertype为normal时有效,其它参数时可省略
*/
private List<PrintContent> contents;
}
package com.mortals.xhx.busiz.req;
import com.mortals.xhx.module.print.model.PrintContent;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* 签名板请求
* @author:
* @date: 2022/12/26 10:24
*/
@Data
public class SignReq implements Serializable {
/**
* HWInitialize 开始签名
* HWFinalize 结束签名
* HWClearSign 清除签名
* HWGetSign 获取签名图片
*/
private String HWPenSign;
/**
* 签名版固定设置参数
*/
private String key = "F7B040A43D80063BEBC1A8C8DC9351D5";
private String title = "请签名";
private int nOrgX = 400;
private int nOrgY = 350;
private int nWidth = 500;
private int nHeight = 300;
private int nImageWidth =250;
private int nImageHeight = 150;
private int nImageType = 3;
private int nFingerCap = 0;
private int nConfirmTimeout = 60;
}
package com.mortals.xhx.busiz.req;
import lombok.Data;
import java.io.Serializable;
/**
* 社保卡请求
* @author:
* @date: 2022/12/26 10:24
*/
@Data
public class SocialReq implements Serializable {
String function;
String pchPhotoAddr;
String iType;
}
package com.mortals.xhx.busiz.rsp;
import lombok.Data;
@Data
public class ApiResp<T> {
/**
* 成功
*/
public static final String SUCCESS = "1";
/**
* 失败
*/
public static final String FAIL = "-1";
/**
* 结果编码
*/
private String status;
/**
* 结果描述
*/
private String message;
private Integer code;
/**
* 响应数据
*/
private T data;
public static <T> ApiResp<T> ok() {
return ApiRespResult(null, SUCCESS, "操作成功");
}
public static <T> ApiResp<T> ok(T data) {
return ApiRespResult(data, SUCCESS, "操作成功");
}
public static <T> ApiResp<T> ok(String msg) {
return ApiRespResult(null, SUCCESS, msg);
}
public static <T> ApiResp<T> ok(String msg, T data) {
return ApiRespResult(data, SUCCESS, msg);
}
public static <T> ApiResp<T> fail() {
return ApiRespResult(null, FAIL, "操作失败");
}
public static <T> ApiResp<T> fail(String msg) {
return ApiRespResult(null, FAIL, msg);
}
public static <T> ApiResp<T> fail(T data) {
return ApiRespResult(data, FAIL, "操作失败");
}
public static <T> ApiResp<T> fail(String msg, T data) {
return ApiRespResult(data, FAIL, msg);
}
public static <T> ApiResp<T> fail(String code, String msg) {
return ApiRespResult(null, code, msg);
}
private static <T> ApiResp<T> ApiRespResult(T data, String code, String msg) {
ApiResp<T> ApiResp = new ApiResp<>();
ApiResp.setStatus(code);
ApiResp.setData(data);
ApiResp.setMessage(msg);
return ApiResp;
}
}
package com.mortals.xhx.busiz.rsp;
import lombok.Data;
/**
* @author karlhoo
*/
@Data
public class ApiRespPdu<T> {
/**
* 结果编码
*/
private int code;
/**
* 结果描述
*/
private String msg;
/**
* 响应数据
*/
private T data;
}
package com.mortals.xhx.busiz.rsp;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.mortals.xhx.module.capture.model.File;
import com.mortals.xhx.module.print.model.Printer;
import lombok.Data;
import java.util.List;
/**
* 高拍仪响应
* @author: zxfei
* @date: 2024/1/2 9:57
*/
@Data
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY, getterVisibility = JsonAutoDetect.Visibility.NONE)
public class CaptureResp extends ApiResp {
/**
* 附件列表
*/
private List<File> filelist;
}
package com.mortals.xhx.busiz.rsp;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.mortals.xhx.module.print.model.Printer;
import lombok.Data;
import java.util.List;
@Data
@JsonAutoDetect(fieldVisibility=JsonAutoDetect.Visibility.ANY, getterVisibility=JsonAutoDetect.Visibility.NONE)
public class IdCardResp extends ApiResp {
private String username;
private String idcardno;
private String sex;
private String address;
private String Born;
private String GrantDept;
private String Nation;
private String UserLifeBegin;
private String UserLifeEnd;
private String PhotoFileName;
private String PhotoBase64String;
}
package com.mortals.xhx.busiz.rsp;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.mortals.xhx.module.print.model.Printer;
import lombok.Data;
import java.util.List;
@Data
@JsonAutoDetect(fieldVisibility=JsonAutoDetect.Visibility.ANY, getterVisibility=JsonAutoDetect.Visibility.NONE)
public class PrintListResp extends ApiResp {
private List<Printer> PrinterList;
}
package com.mortals.xhx.busiz.rsp;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.mortals.xhx.module.print.model.PrinterQueue;
import lombok.Data;
import java.util.List;
@Data
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY, getterVisibility = JsonAutoDetect.Visibility.NONE)
public class PrintQueueResp extends ApiResp {
private List<PrinterQueue> QueueList;
private String QueueNum;
}
package com.mortals.xhx.busiz.rsp;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.mortals.xhx.module.sign.modle.File;
import lombok.Data;
import java.util.List;
/**
* 签名板响应
* @author: zhou
* @date: 2024/7/10 9:57
*/
@Data
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY, getterVisibility = JsonAutoDetect.Visibility.NONE)
public class SignResp extends ApiResp {
/**
* 操作类型
*/
private String HWPenSign;
/**
* 错误代码
*/
private int msgID;
/**
* 错误信息
*/
private String message;
}
package com.mortals.xhx.busiz.rsp;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import lombok.Data;
/**
* 社保卡响应
* @author: zhou
* @date: 2024/7/10 9:57
*/
@Data
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY, getterVisibility = JsonAutoDetect.Visibility.NONE)
public class SocialResp extends ApiResp {
/**
* 错误信息
*/
private String message;
}
package com.mortals.xhx.busiz.web;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.mortals.framework.common.Rest;
import com.mortals.xhx.busiz.req.ApiReqPdu;
import com.mortals.xhx.busiz.req.PrintReq;
import com.mortals.xhx.busiz.rsp.ApiResp;
import com.mortals.xhx.busiz.rsp.IdCardResp;
import com.mortals.xhx.busiz.rsp.PrintListResp;
import com.mortals.xhx.busiz.rsp.PrintQueueResp;
import com.mortals.xhx.common.code.BusizTypeEnum;
import com.mortals.xhx.module.idCard.model.IdCardCons;
import com.mortals.xhx.module.idCard.service.IdCardService;
import com.mortals.xhx.module.print.model.Printer;
import com.mortals.xhx.module.print.model.PrinterQueue;
import com.mortals.xhx.module.print.service.PrintService;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;
/**
* api controller
*
* @author: zxfei
* @date: 2022/12/26 10:21
*/
@RestController
@Slf4j
public class ApiController extends BaseAbstractApiController {
@Autowired
private PrintService printService;
@Autowired
private IdCardService idCardService;
@RequestMapping(value = "GetHardWareInfo", method = {RequestMethod.POST, RequestMethod.GET})
public Object GetHardWareInfo(@RequestParam Map<String, Object> reqMap) {
String getType = (String) reqMap.getOrDefault("GetType", "");
String reqJson = (String) reqMap.getOrDefault("PrinterJson", "");
String printerName = (String) reqMap.getOrDefault("printerName", "");
String waitTime = (String) reqMap.getOrDefault("waitTime", "120");
String signType = (String) reqMap.getOrDefault("signType", "");
String socialType = (String) reqMap.getOrDefault("socialType", "");
log.info("getType:" + getType);
try {
switch (BusizTypeEnum.getByValue(getType)) {
case BUSIZ_CAPTURE: //高拍仪
ApiResp<Object> captureResp = handle(waitTime, "busizCaptureReqHandler");
return captureResp;
case BUSIZ_ASSESSMENT: //评价
ApiResp<Object> assessResp = handle(JSON.parseObject(reqJson, new TypeReference<PrintReq>() {
}), "busizAssessmentReqHandler");
return assessResp;
case BUSIZ_PRINT: //打印
ApiResp<Object> rest = handle(JSON.parseObject(reqJson, new TypeReference<PrintReq>() {
}), "busizPrintReqHandler");
return rest;
case BUSIZ_PRINTLIST: //打印机列表
//获取打印机列表
ApiResp<Object> printListResp = handle("", "busizPrintListReqHandler");
return printListResp;
case BUSIZ_PRINT_QUEUE: //查看指定打印机打印队列
ApiResp<Object> printQueueResp = handle(printerName, "busizPrintQueueReqHandler");
return printQueueResp;
case BUSIZ_IDCARD_RECOGNITION: //身份证读取
ApiResp<Object> idCardResp = handle("", "busizIdcardRecognitionReqHandler");
return idCardResp;
case BUSIZ_CAMERA: //双目摄像头
log.info("双目摄像头");
return null;
case BUSIZ_SIGN: //签名板
ApiResp<Object> signResp = handle(signType, "busizSignReqHandler");
return signResp;
case BUSIZ_SOCIAL: //社保卡 德卡T10三合一
ApiResp<Object> socialResp = handle(socialType, "busizSocialReqHandler");
return socialResp;
case BUSIZ_FINGER: //指纹
log.info("指纹");
return null;
}
} catch (Exception e) {
log.error("接收数据失败", e);
return ApiResp.fail(e.getMessage());
}
return ApiResp.ok();
}
}
package com.mortals.xhx.busiz.web;
import com.mortals.xhx.busiz.handler.BaseReqHandler;
import com.mortals.xhx.busiz.rsp.ApiResp;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.util.ObjectUtils;
import javax.annotation.PostConstruct;
import java.util.Map;
@Slf4j
public class BaseAbstractApiController {
private Map<String, BaseReqHandler> handlers;
@Autowired
private ApplicationContext context;
@SuppressWarnings("unchecked")
protected <T, K> ApiResp<K> handle(T apiReq, String handleName) {
BaseReqHandler reqHandler = handlers.get(handleName);
if (!ObjectUtils.isEmpty(reqHandler)) {
return reqHandler.process(apiReq);
} else {
log.warn(String.format("没有找到业务处理类 handleName:%s", handleName));
return null;
}
}
@PostConstruct
private void init() {
handlers = context.getBeansOfType(BaseReqHandler.class);
}
}
package com.mortals.xhx.daemon.applicationservice; package com.mortals.xhx.daemon.applicationservice;
import com.mortals.framework.springcloud.service.IApplicationStartedService; import com.mortals.framework.springcloud.service.IApplicationStartedService;
import com.mortals.xhx.opencv.UI.SetWindow;
import com.mortals.xhx.swing.MyTray; import com.mortals.xhx.swing.MyTray;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
...@@ -12,10 +11,10 @@ import org.springframework.stereotype.Component; ...@@ -12,10 +11,10 @@ import org.springframework.stereotype.Component;
@Slf4j @Slf4j
public class DemoStartedService implements IApplicationStartedService { public class DemoStartedService implements IApplicationStartedService {
@Value("${siteconfig.filepath:/root/mid.prop}") @Value("${siteconfig.configpath:F:\\\\config.prop}")
String filePath; String filePath;
@Value("${siteconfig.url:http://192.168.0.98:8090}") @Value("${siteconfig.url:http://192.168.0.98:11091}")
String siteUrl; String siteUrl;
@Override @Override
...@@ -37,126 +36,10 @@ public class DemoStartedService implements IApplicationStartedService { ...@@ -37,126 +36,10 @@ public class DemoStartedService implements IApplicationStartedService {
//MyTray.getInstance().SystemTrayInitial(filePath,siteUrl); //MyTray.getInstance().SystemTrayInitial(filePath,siteUrl);
log.info("filePath:{}",filePath); log.info("filePath:{}",filePath);
log.info("siteUrl:{}",siteUrl); log.info("siteUrl:{}",siteUrl);
SetWindow.getInstance().initWindow(filePath,siteUrl); // SetWindow.getInstance().initWindow(filePath,siteUrl);
log.info("初始化托盘完成!"); log.info("初始化托盘完成!");
// Rest<ArrayList<PhotoBean>> rest = CameraOprationByOpenCV.initWindow(300);
//
// log.info("高拍仪照片:"+rest.getData().toString());
// SetWindow.initWindow(300);
/*
boolean headless = GraphicsEnvironment.isHeadless();
log.info("headless:{}",headless);*/
/* Demo demo = new Demo();
demo.test();*/
// new MySystemTray();
//加载so
//String strPath = System.getProperty("user.dir") + "\\lib\\tmz\\libSDTReader.so";
/* boolean sdkInstance = TMZMain.createSDKInstance();
log.info("skdInstance:" + sdkInstance);
int closeDev = TMZMain.tmzSDK._SDT_CloseDev();
log.info("close:0x{}", Integer.toHexString(closeDev));
int openret = TMZMain.tmzSDK._SDT_OpenUsbByFD(0);
log.info("打卡usb:{}", Integer.toHexString(openret));
if (Integer.toHexString(openret).equals("90")) {
log.info("打卡设备成功!");
//寻卡
byte[] pucManaInfo = new byte[4];
int ret = TMZMain.tmzSDK._SDT_StartFindIDCard(pucManaInfo);
log.info("寻卡:0x{},pucManaInfo:{}", Integer.toHexString(ret), pucManaInfo);
*//* if (!Integer.toHexString(ret).equals("9f")) {
log.info("寻卡失败");
return;
}*//*
//选卡
byte[] pucManaInfo1 = new byte[4];
int selectret = TMZMain.tmzSDK._SDT_SelectIDCard(pucManaInfo);
log.info("选卡:0x{}", Integer.toHexString(selectret));
//读卡
byte[] pucCHMsg = new byte[512];
byte[] pucPHMsg = new byte[2048];
byte[] pucFPMsg = new byte[2048];
// int puiCHMsgLen = 0, puiPHMsgLen = 0, puiFHMsgLen = 0;
IntByReference puiCHMsgLen = new IntByReference();
IntByReference puiPHMsgLen = new IntByReference();
IntByReference puiFHMsgLen = new IntByReference();
log.info("读卡开始");
// int[] ints = new int[8];
//int readret = TMZMain._SDT_ReadBaseMsg(pucCHMsg, ints, pucPHMsg, ints);
// int readret = JniTest._SDT_ReadBaseFPMsg(pucCHMsg, 0, pucPHMsg, 0,pucFPMsg,0);
int readret = TMZMain.tmzSDK._SDT_ReadBaseFPMsg(pucCHMsg, puiCHMsgLen, pucPHMsg, puiPHMsgLen,pucFPMsg,puiFHMsgLen);
//int readret = TMZMain.tmzParseSDK._SDT_ReadBaseMsg(pucCHMsg, puiCHMsgLen, pucPHMsg, puiPHMsgLen);
log.info("读卡:0x{},pucCHMsg:{}", Integer.toHexString(readret),pucCHMsg);
IntByReference iType = new IntByReference();
byte[] pSFZInfo = new byte[260];
int parseret = TMZMain.tmzSDK._SDT_ParseIDCardTextInfo(pucCHMsg, puiCHMsgLen.getValue(), iType, pSFZInfo);
String sfzStr = new String(pSFZInfo, StandardCharsets.UTF_8);
String[] split = sfzStr.split("|");
log.info("parseret:{},pSFZInfo:{}", parseret, sfzStr);
// byte[] pBmpFile = new byte[255];
byte[] pBmpFile ="/tmp/sfz.jpg".getBytes(StandardCharsets.UTF_8);
int photoRet = TMZMain.tmzSDK._SDT_ParsePhotoInfo(pucPHMsg, puiPHMsgLen.getValue(), 4, pBmpFile);
log.info("photoRet:0x{},pucCHMsg lens:{}", Integer.toHexString(photoRet),pucCHMsg.length);
}
*/
/*
String[] base64Text = CameraOpration.getInstance().initWindow();
log.info("base64Text:{}", base64Text);*/
/* Runnable runnable = new Runnable() {
@Override
public void run() {
while (true) {
try {
String resp = HttpUtil.get("http://localhost:8092/app/account/imageCode");
if(!ObjectUtils.isEmpty(resp)){
log.info("http web is ok");
}
HttpClient http = null;
CookieStore httpCookieStore = new BasicCookieStore();
http = HttpClientBuilder.create().setDefaultCookieStore(httpCookieStore).build();
*//* do stuff *//*
HttpGet httpRequest = new HttpGet("http://localhost:8092/app/account/imageCode");
HttpResponse httpResponse = null;
try {
httpResponse = http.execute(httpRequest);
//String content = EntityUtils.toString(entity, charset);
//httpResponse.getEntity()
//httpResponse.toString()
} catch (Exception e) {
log.error("异常",e);
}
*//* check cookies *//*
String cookieStr = Arrays.asList(httpCookieStore.getCookies()).stream().map(item -> JSON.toJSONString(item)).collect(Collectors.joining("|"));
log.info("cookies:{}", cookieStr);
TimeUnit.MINUTES.sleep(2);
} catch (Exception e) {
log.error("异常", e);
}
}
}
};
Thread thread = new Thread(runnable);
thread.start();*/
} }
@Override @Override
......
package com.mortals.xhx.module.capture;
import com.mortals.xhx.common.osSelect;
import com.mortals.xhx.module.idCard.service.TMZParseSDK;
import com.mortals.xhx.module.idCard.service.TMZSDK;
import com.sun.jna.Native;
import lombok.extern.slf4j.Slf4j;
/**
* 高拍仪初始化
*
* @author: ZYW
* @date: 2024/01/24 09:59
*/
@Slf4j
public class CaptureMain {
}
package com.mortals.xhx.module.capture.model;
import lombok.Data;
/**
* 照片信息
* @author: zxfei
* @date: 2024/1/2 9:54
*/
@Data
public class File {
/**
* 文件名
* 1.jpg
*/
private String filename;
/**
* 文件类型 base64
* data:image/jpg;base64,/8j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQ//2Q==
*/
private String Base64String;
}
package com.mortals.xhx.module.capture.service;
import com.sun.jna.Library;
/**
* 高拍仪so dell库
*
* @author: ZYW
* @date: 2024/01/24 09:59
*/
public interface CaptureSDK extends Library {
static int SXT_OK = 0; //成功
static int SXT_NOT_INIT_ERROR = -1; //SDK未初始化
static int SXT_NOT_DEVICE_ERROR = -2; //设备不存在
static int SXT_OPEN_DEVICE_ERROR = -3; //设备打开失败
static int SXT_PHOTOGRAPH_ERROR = -4; //拍照失败,摄像头未打开
static int SXT_RESOLUTION_ERROR = -5; //分辨率切换失败
static int SXT_MEMORY_ERROR = -6; //传入空间不够
static int SXT_FILE_ERROR = -7; //文件打开失败
static int SXT_FILE_DELETE_ERROR = -8; //文件删除失败
static int SXT_BARCODE_ERROR = -9; //条码识别失败
static int SXT_THREAD_ERROR = -10; //高拍仪线程初始化失败
static int SXT_ERROR_1 = -11; //参数错误
static int SXT_ERROR_2 = -12; //文件不存在
static int SXT_ERROR_3 = -13; //不支持的指令
static int SXT_ERROR_4 = -14; //摄像头数据读取出错
static int SXT_ERROR_5 = -15; //图片转PDF失败
static int SXT_ERROR_6 = -16; //身份证信息获取失败
static int SXT_ERROR_7 = -17; //没有这个功能
/*********************************
* 功能:
* 初始化高拍仪(必须先调用)
* 参数:
* 无
* 返回值:
* 参见: 错误代码
**********************************/
int SXT_Init();
/*********************************
* 功能:
* 释放高拍仪(关闭高拍仪时必须调用)
* 参数:
* 无
* 返回值:
* 参见: 错误代码
**********************************/
int SXT_Release();
/*********************************
* 功能:
* 视频流回调
* 参数:
* imgData - 图片二进制数据
* len - 图片长度
* 返回值:
* 参见: 错误代码
**********************************/
void DoSXT_VideoStreaming_Callback(String imgData, int len);
/*********************************
* 功能:
* 获取摄像头名称列表
* 参数:
* 无
* 返回值:
* 参见: 返回json字符串[{"index":1,"name":"video1"},
* {"index":2,"name":"video2"}]
* 如果没有找到返回空
**********************************/
String SXT_GetVideoInfos();
/*********************************
* 功能:
* 打开主头(副头打开时自动关闭副头)
* 参数:
* width - 分辨率宽度
* height - 分辨率高度
* 返回值:
* 参见: 错误代码
**********************************/
// int SXT_OpenHostDevice(int width, int height, DoSXT_VideoStreaming_Callback callback);
/*********************************
* 功能:
* 打开副头(主头打开时自动关闭主头)
* 参数:
* width - 分辨率宽度
* height - 分辨率高度
* 返回值:
* 参见: 错误代码
**********************************/
// int SXT_OpenDeputyDevice(int width,int height, DoSXT_VideoStreaming_Callback callback);
/*********************************
* 功能:
* 关闭摄像头
* 返回值:
* 参见: 错误代码
**********************************/
int SXT_CloseDevice();
/*********************************
* 功能:
* 获取指定摄像头分辨率json列表
* 参数:
* index - 1 主头 2 副头(不是这个两个直接报错)
* 返回值:
* 参见: 返回json字符串 [{"index":1,"name":"640x480"},
* {"index":2,"name":"800x600"}]
* 如果没有找到返回空
**********************************/
String SXT_GetResolution(int index);
/*********************************
* 功能:
* 是否裁边拍照(只支持主头, 副头没有功能, 默认开启)
* 参数:
* type - 0 不裁边 1 裁边
* 返回值:
* 参见: 错误代码
**********************************/
int SXT_SetCutType(int type);
/*********************************
* 功能:
* 设置视频画面模式
* 参数:
* type - 设置颜色 1 彩色 2 灰度 3 黑白
* 返回值:
* 参见: 错误代码
**********************************/
int SXT_SetColorType(int type);
/*********************************
* 功能:
* 视频画面旋转
* 参数:
* direction - 旋转方向(左边 0 右边 1)
* rotate - 旋转角度(默认90)
* 返回值:
* 参见: 错误代码
**********************************/
int SXT_SetRotate(int direction, int rotate);
/*********************************
* 功能:
* 拍照
* 参数:
* index - 1 文件拍照 2 base64 拍照
* path - 文件路径(可选)
* 回调:
* index - 拍照方式 1 文件拍照 2 base64 拍照
* imgData - 文件拍照或拍照失败时为空字符串
* len - 文件拍照或拍照失败时为-1
* isOk - 0 拍照成功 其他拍照失败
* isDelete - 如果是pdf会删除原图片此时返回1,否则返回0(默认)
* 返回值:
* 参见: 错误代码
**********************************/
void DoSXT_Photograph_Callback(int index, String imgData, int len, int isOk, int isDelete);
// int SXT_Photograph(int index, String path, DoSXT_Photograph_Callback callback);
/*********************************
* 功能:
* 设置分辨率
* 参数:
* resolutionIndex - 分辨率编号 0开始
* 返回值:
* 参见: 错误代码
**********************************/
int SXT_SetResolution(int resolutionIndex);
int SXT_SetResolution2(int w,int h);
/*********************************
* 功能:
* 图形拆分
* 参数:
* imgPath - 需要拆分的文件绝对路径
* dir - 保存文件夹
* type - 1 左右 2 上下
* 返回值:
* 成功返回json字符串, 失败返回空字符串 {"path1":"/tmp/1.jpg","path1":"/tmp/2.jpg"}
**********************************/
String SXT_SplitImage(String imgPath, String dir, int type);
/*********************************
* 功能:
* 图形合并
* 参数:
* imgPath1 - 需要合并的文件1绝对路径
* imgPath2 - 需要合并的文件2绝对路径
* path - 保存路径
* type - 1 左右 2 上下
* 返回值:
* 成功返回json字符串, 失败返回空字符串 {"path":"/tmp/1.jpg"}
**********************************/
String SXT_CombineImage(String imgPath1, String imgPath2, String savePath, int type);
/*********************************
* 功能:
* 文件转Base64
* 参数:
* file - 文件路径
* 返回值:
* 参见: 成功返回base64数据 失败返回 空
**********************************/
String SXT_FileToBase64(String path);
/*********************************
* 功能:
* 一维码识别
* 参数:
* file - 一维码图片
* 返回值:
* 参见: 成功返回扫码到的数据 失败返回 空
**********************************/
String SXT_DecodeBarcodeImage(String path);
}
\ No newline at end of file
package com.mortals.xhx.module.capture.service;
import com.mortals.framework.common.Rest;
import com.mortals.xhx.busiz.req.PrintReq;
import com.mortals.xhx.module.capture.model.File;
import com.mortals.xhx.module.print.model.Printer;
import com.mortals.xhx.module.print.model.PrinterQueue;
import java.util.List;
/**
* 高拍仪 业务接口
*
* @author: zxfei
* @date: 2024/1/2 9:58
*/
public interface CaptureService {
Rest<List<File>> getCapture(String waitTime);
}
package com.mortals.xhx.module.capture.service.impl;
import com.alibaba.fastjson.JSON;
import com.mortals.framework.common.Rest;
import com.mortals.framework.exception.AppException;
import com.mortals.framework.util.DataUtil;
import com.mortals.xhx.busiz.req.PrintReq;
import com.mortals.xhx.common.code.YesNoEnum;
import com.mortals.xhx.common.utils.BeanUtil;
import com.mortals.xhx.module.capture.model.File;
import com.mortals.xhx.module.capture.service.CaptureService;
import com.mortals.xhx.module.print.model.Printer;
import com.mortals.xhx.module.print.model.PrinterQueue;
import com.mortals.xhx.module.print.service.PrintComponent.BasePrintComponent;
import com.mortals.xhx.module.print.service.PrintComponent.ComponentCons;
import com.mortals.xhx.module.print.service.PrintService;
import com.mortals.xhx.opencv.UI.CameraOprationByOpenCV;
import com.mortals.xhx.opencv.UI.CaptureUI;
import com.mortals.xhx.opencv.bean.PhotoBean;
import com.mortals.xhx.swing.SwingArea;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Service;
import javax.print.attribute.Attribute;
import javax.print.attribute.AttributeSet;
import java.awt.print.PrinterJob;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* 高拍仪实现类
*
* @author: zxfei
* @date: 2024/1/2 10:00
*/
@Service
@Slf4j
@ConditionalOnProperty(prefix = "config", name = "capture", havingValue = "default")
public class CaptureServiceImpl implements CaptureService {
@Value("${siteconfig.configpath:'/root/config.prop'}")
String configPath;
@Value("${active.active:'reg'}")
String active;
@Value("${config.captureUrl:ws://localhost:1818/}")
private String url;
@Override
public Rest<List<File>> getCapture(String waitTime) {
Rest<ArrayList<PhotoBean>> rest = null;
log.info("active:{}",active);
if(active.equals("reg")){ //若尔盖是老版本opencv打开高拍仪
rest = CameraOprationByOpenCV.getInstance().initWindow(DataUtil.converStr2Int(waitTime, 120),configPath);
}else { //后续对接用汉腾提供的api开发
rest = CaptureUI.getInstance().initWindow(DataUtil.converStr2Int(waitTime, 120),configPath,url);
}
if (rest.getCode() == YesNoEnum.YES.getValue()) {
log.info("fileData:{}", JSON.toJSONString(rest.getData()));
List<File> fileList = rest.getData().stream().map(item -> {
File file = new File();
file.setFilename(item.getFilename());
file.setBase64String(item.getBase64String());
return file;
}).collect(Collectors.toList());
return Rest.ok("获取拍照列表成功!", fileList);
} else {
return Rest.fail(rest.getMsg());
}
}
public static void main(String[] args) {
PhotoBean photoBean = new PhotoBean("111","222");
System.out.println(JSON.toJSONString(photoBean));
}
}
package com.mortals.xhx.module.demo;
public interface BackCategoryRepository {
String getBackCategoryDetail(long backCategoryId);
}
package com.mortals.xhx.module.demo;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Component;
@Component
@ConditionalOnProperty(prefix="config",name = "data", havingValue = "one")
public class BackCategoryRepositoryImpl implements BackCategoryRepository {
@Override
public String getBackCategoryDetail(long backCategoryId) {
return "one";
}
}
package com.mortals.xhx.module.demo;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Component;
@Component
@ConditionalOnProperty(prefix="config",name = "data", havingValue = "two")
public class BackCategoryRepositoryTwoImpl implements BackCategoryRepository {
@Override
public String getBackCategoryDetail(long backCategoryId) {
return "two";
}
}
package com.mortals.xhx.module.demo.desktop;
import java.awt.AWTException;
import java.awt.Image;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.Toolkit;
import java.awt.TrayIcon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
public class MySystemTray extends JFrame{
public MySystemTray() {
init();
}
public void init() {
this.setSize(300, 200);
this.setLocationRelativeTo(null);
this.setTray();
this.setVisible(true);
}
//添加托盘显示:1.先判断当前平台是否支持托盘显示
public void setTray() {
if(SystemTray.isSupported()){//判断当前平台是否支持托盘功能
//创建托盘实例
SystemTray tray = SystemTray.getSystemTray();
//创建托盘图标:1.显示图标Image 2.停留提示text 3.弹出菜单popupMenu 4.创建托盘图标实例
//1.创建Image图像
Image image = Toolkit.getDefaultToolkit().getImage("E:\\pic\\1.png");
//2.停留提示text
String text = "MySystemTray";
//3.弹出菜单popupMenu
PopupMenu popMenu = new PopupMenu();
MenuItem itmOpen = new MenuItem("打开");
itmOpen.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
Show();
}
});
MenuItem itmHide = new MenuItem("隐藏");
itmHide.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
UnVisible();
}
});
MenuItem itmExit = new MenuItem("退出");
itmExit.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
Exit();
}
});
popMenu.add(itmOpen);
popMenu.add(itmHide);
popMenu.add(itmExit);
//创建托盘图标
TrayIcon trayIcon = new TrayIcon(image,text,popMenu);
//将托盘图标加到托盘上
try {
tray.add(trayIcon);
} catch (AWTException e1) {
e1.printStackTrace();
}
}
}
//内部类中不方便直接调用外部类的实例(this不能指向)
public void UnVisible() {
this.setVisible(false);
}
public void Show() {
this.setVisible(true);
}
public void Exit() {
System.exit(0);
}
public static void main(String[] args) {
new MySystemTray();
}
}
\ No newline at end of file
package com.mortals.xhx.module.demo.print;
import com.mortals.xhx.common.utils.QrCodeUtil;
import java.awt.*;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import javax.swing.*;
public class Main extends JFrame {
public Main() {
setTitle("绘制几何图形");
setBounds(100, 200, 500, 500);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
Container c = getContentPane();
MyCanvas canvas = new MyCanvas();
c.add(canvas);
}
private class MyCanvas extends Canvas {
@Override
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;//新绘图类
//Image img = new ImageIcon("src/a.png").getImage();//获取图片来源
//g2.drawImage(img, 50, 0, this);a
BufferedImage barCode = QrCodeUtil.getBarCode("1231313123123131312aaaaaaaaaaa");
//g2.drawImage(barCode,null,20,100);
//居右
FontMetrics fontMetrics = g2.getFontMetrics();
String str="1231313123123131312aaaaaaaaaaa";
g2.drawImage(barCode,null,480 - barCode.getWidth(),100);
Color c = Color.RED;//设置颜色属性
Stroke stroke = new BasicStroke(8);//设置画笔属性
Font font = new Font("隶书", Font.BOLD, 16);
g2.setFont(font);//加载字体
g2.drawString("#################################################################################", 0, 30);//
g2.drawString("==================================================================", 0, 50);//
g2.drawString("..................................................................", 0, 70);//
//居右
fontMetrics = g2.getFontMetrics();
str="a lot of apple";
g2.drawString(str, 480 - fontMetrics.stringWidth(str), 90);//
//居中
fontMetrics = g2.getFontMetrics();
String str1="two lot of apple";
g2.drawString(str, (480 - fontMetrics.stringWidth(str1))/2, 220);//
float[] dash1 = {2.0f};
//设置打印线的属性。
//1.线宽 2、3、不知道,4、空白的宽度,5、虚线的宽度,6、偏移量
//g2.setStroke(new BasicStroke(0.5f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 2.0f, dash1, 0.0f));
g2.drawLine(10,10,200,10);
// g2.setStroke(stroke);//加载画笔
/*BasicStroke.CAP_ROUND : 圆角末端
*BasicStroke.CAP_BUTT :无修饰末端
*BasicStroke.CAP_SQUARE :正方形末端
*
*BasicStroke.JOIN_BEVEL :平角
*BasicStroke.JOIN_MITER :尖角(默认)
*BasicStroke.JOIN_ROUND :圆角
* */
stroke = new BasicStroke(12, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_ROUND);
g2.setStroke(stroke);//加载画笔
// g2.setColor(c);
// g2.setColor(Color.BLUE);
// g2.drawOval(60, 20, 30, 30);// 画了一个圆
// g2.setColor(c);
// g2.fillRect(60, 20, 20, 20);// 画矩形
// g2.setColor(Color.BLUE);
//
// Shape shape1 = new Rectangle2D.Double(110, 5, 100, 100);// 矩形圆形对象
// g2.fill(shape1);// 画这个图形
//
// Shape shape2 = new Rectangle2D.Double(220, 15, 80, 80);// 矩形圆形对象
// g2.fill(shape2);// 画这个图形
//
// g2.drawArc(320, 25, 100, 50, 270, 200);// 弧形
//
// g2.drawLine(5, 120, 100, 120);//横线
// g2.drawLine(50, 120, 50, 200);//垂直线
//
// g2.drawRoundRect(120, 120, 100, 50, 10, 10);// 圆角矩形
//
// int x[] = { 250, 300, 250, 300 };
// int y[] = { 130, 130, 200, 200 };
//// g2.drawPolygon(x, y, 4);// 多边形
//
// g2.drawPolyline(x, y, 4);// 多边线
}
}
/**
* Graphic2D文本绘制换行,多行绘制
*
* @param graphics2D Graphics2D画笔实例
* @param text 需要绘制的文本内容
* @param maxWidth 一行的总宽度(像素)
* @param startX X坐标起始点(像素)
* @param startY Y坐标起始点(像素)
* @param heightSpace 每行间距(像素)
*/
public static void drawStringWithMultiLine(Graphics2D graphics2D, String text, int maxWidth, int startX, int startY, int heightSpace) {
// INFO: Dechert: 2021/1/7 获取画笔的字体
Font font = graphics2D.getFont();
// INFO: Dechert: 2021/1/7 通过JLabel获取文本的总长度和总高度
JLabel jLabel = new JLabel(text);
jLabel.setFont(font);
FontMetrics fontMetrics = jLabel.getFontMetrics(font);
int textLength = text.length();
int totalWidth = fontMetrics.stringWidth(text); //一行的总长度,用于判断是否超出了范围
int textHeight = fontMetrics.getHeight(); //计算一行的高度
if (totalWidth > maxWidth) {
// INFO: Dechert: 2021/1/7 总长度超过了整个长度限制
int alreadyWriteLine = 0; //已经写了多少行
int nowWidth = 0; //目前一行写的长度
for (int i = 0; i < textLength; i++) {
int oneWordWidth = fontMetrics.charWidth(text.charAt(i)); //获取单个字符的长度
int tempWidth = oneWordWidth + nowWidth; //判断目前的一行加上这个字符的长度是否超出了总长度
if (tempWidth > maxWidth) {
// INFO: Dechert: 2021/1/7 如果超出了一行的总长度,则要换成下一行
nowWidth = 0;
alreadyWriteLine++;
int writeY = startY + alreadyWriteLine * (textHeight + heightSpace);
graphics2D.drawString(text.charAt(i) + "", startX + nowWidth, writeY);
nowWidth = oneWordWidth;
} else {
// INFO: Dechert: 2021/1/7 当前行长度足够,可以直接画
int writeY = startY + alreadyWriteLine * (textHeight + heightSpace);
graphics2D.drawString(text.charAt(i) + "", startX + nowWidth, writeY);
nowWidth = tempWidth;
}
}
} else {
// INFO: Dechert: 2021/1/7 没有超过限制,直接画
graphics2D.drawString(text, startX, startY);
}
}
public static void main(String args[]) {
Main m = new Main();
}
}
\ No newline at end of file
package com.mortals.xhx.module.demo.print;
import java.awt.event.*;
import java.awt.*;
import java.awt.print.*;
import javax.swing.*;
import java.awt.geom.*;
public class PrintPreviewDialog extends JDialog
implements ActionListener {
private JButton nextButton = new JButton("Next");
private JButton previousButton = new JButton("Previous");
private JButton closeButton = new JButton("Close");
private JPanel buttonPanel = new JPanel();
private PreviewCanvas canvas;
public PrintPreviewDialog(Frame parent, String title, boolean modal, PrintTest pt, String str) {
super(parent, title, modal);
canvas = new PreviewCanvas(pt, str);
setLayout();
}
private void setLayout() {
this.getContentPane().setLayout(new BorderLayout());
this.getContentPane().add(canvas, BorderLayout.CENTER);
nextButton.setMnemonic('N');
nextButton.addActionListener(this);
buttonPanel.add(nextButton);
previousButton.setMnemonic('N');
previousButton.addActionListener(this);
buttonPanel.add(previousButton);
closeButton.setMnemonic('N');
closeButton.addActionListener(this);
buttonPanel.add(closeButton);
this.getContentPane().add(buttonPanel, BorderLayout.SOUTH);
this.setBounds((int) ((SystemProperties.SCREEN_WIDTH - 400) / 2), (int) ((SystemProperties.SCREEN_HEIGHT - 400) / 2), 400, 400);
}
public void actionPerformed(ActionEvent evt) {
Object src = evt.getSource();
if (src == nextButton)
nextAction();
else if (src == previousButton)
previousAction();
else if (src == closeButton)
closeAction();
}
private void closeAction() {
this.setVisible(false);
this.dispose();
}
private void nextAction() {
canvas.viewPage(1);
}
private void previousAction() {
canvas.viewPage(-1);
}
class PreviewCanvas extends JPanel {
private String printStr;
private int currentPage = 0;
private PrintTest preview;
public PreviewCanvas(PrintTest pt, String str) {
printStr = str;
preview = pt;
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
PageFormat pf = PrinterJob.getPrinterJob().defaultPage();
double xoff;
double yoff;
double scale;
double px = pf.getWidth();
double py = pf.getHeight();
double sx = getWidth() - 1;
double sy = getHeight() - 1;
if (px / py < sx / sy) {
scale = sy / py;
xoff = 0.5 * (sx - scale * px);
yoff = 0;
} else {
scale = sx / px;
xoff = 0;
yoff = 0.5 * (sy - scale * py);
}
g2.translate((float) xoff, (float) yoff);
g2.scale((float) scale, (float) scale);
Rectangle2D page = new Rectangle2D.Double(0, 0, px, py);
g2.setPaint(Color.white);
g2.fill(page);
g2.setPaint(Color.black);
g2.draw(page);
try {
preview.print(g2, pf, currentPage);
} catch (PrinterException pe) {
g2.draw(new Line2D.Double(0, 0, px, py));
g2.draw(new Line2D.Double(0, px, 0, py));
}
}
public void viewPage(int pos) {
int newPage = currentPage + pos;
if (0 <= newPage && newPage < preview.getPagesCount(printStr)) {
currentPage = newPage;
repaint();
}
}
}
}
\ No newline at end of file
package com.mortals.xhx.module.demo.print;
import java.awt.*;
public final class SystemProperties {
public static final double SCREEN_WIDTH = Toolkit.getDefaultToolkit().getScreenSize().getWidth();
public static final double SCREEN_HEIGHT = Toolkit.getDefaultToolkit().getScreenSize().getHeight();
public static final String USER_DIR = System.getProperty("user.dir");
public static final String USER_HOME = System.getProperty("user.home");
public static final String USER_NAME = System.getProperty("user.name");
public static final String FILE_SEPARATOR = System.getProperty("file.separator");
public static final String LINE_SEPARATOR = System.getProperty("line.separator");
public static final String PATH_SEPARATOR = System.getProperty("path.separator");
public static final String JAVA_HOME = System.getProperty("java.home");
public static final String JAVA_VENDOR = System.getProperty("java.vendor");
public static final String JAVA_VENDOR_URL = System.getProperty("java.vendor.url");
public static final String JAVA_VERSION = System.getProperty("java.version");
public static final String JAVA_CLASS_PATH = System.getProperty("java.class.path");
public static final String JAVA_CLASS_VERSION = System.getProperty("java.class.version");
public static final String OS_NAME = System.getProperty("os.name");
public static final String OS_ARCH = System.getProperty("os.arch");
public static final String OS_VERSION = System.getProperty("os.version");
public static final String[] FONT_NAME_LIST = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
public static final Font[] FONT_LIST = GraphicsEnvironment.getLocalGraphicsEnvironment().getAllFonts();
public SystemProperties() {
}
}
package com.mortals.xhx.module.demo.print;
import java.awt.*;
import java.awt.print.*;
public class Test {
public static void main(String[] args) {
if (PrinterJob.lookupPrintServices().length > 0) {
//打印格式
PageFormat pageFormat = new PageFormat();
//设置打印起点从左上角开始,从左到右,从上到下打印
pageFormat.setOrientation(PageFormat.PORTRAIT);
//打印页面格式设置
Paper paper = new Paper();
//设置打印宽度(固定,和具体的打印机有关)和高度(跟实际打印内容的多少有关)
paper.setSize(140, 450);
//设置打印区域 打印起点坐标、打印的宽度和高度
paper.setImageableArea(0, 0, 135, 450);
pageFormat.setPaper(paper);
//创建打印文档
Book book = new Book();
book.append(new Printable() {
@Override
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
if (pageIndex > 0) {
return NO_SUCH_PAGE;
}
Graphics2D graphics2D = (Graphics2D) graphics;
Font font = new Font("宋体", Font.PLAIN, 5);
graphics2D.setFont(font);
drawString(graphics2D, "//", 10, 17, 119, 8);
font = new Font("宋体", Font.PLAIN, 7);
graphics2D.setFont(font);
int yIndex = 30;
int lineHeight = 10;
int lineWidth = 120;
Color defaultColor = graphics2D.getColor();
Color grey = new Color(145, 145, 145);
//收货信息
yIndex = drawString(graphics2D, "收货人:路人甲", 10, yIndex, lineWidth, lineHeight);
yIndex = drawString(graphics2D, "收货地址:北京市海淀区上地十街10号百度大厦", 10, yIndex + lineHeight, lineWidth, lineHeight);
//收货信息边框
Stroke stroke = new BasicStroke(0.5f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 0, new float[]{4, 4}, 0);
graphics2D.setStroke(stroke);
graphics2D.drawRect(5, 10, 129, yIndex);
//药店名称
lineWidth = 129;
lineHeight = 8;
graphics2D.setFont(new Font("宋体", Font.BOLD, 8));
graphics2D.setColor(defaultColor);
yIndex = drawString(graphics2D, "北京药店零售小票", 5, yIndex + lineHeight + 20, lineWidth, 12);
graphics2D.setFont(new Font("宋体", Font.PLAIN, 6));
graphics2D.setColor(grey);
yIndex = drawString(graphics2D, "操作员:小清新", 5, yIndex + lineHeight + 2, lineWidth, lineHeight);
yIndex = drawString(graphics2D, "日期:2017-01-05", 5 + lineWidth / 2, yIndex, lineWidth, lineHeight);
yIndex = drawString(graphics2D, "品名", 5, yIndex + lineHeight * 2 - 5, lineWidth, lineHeight);
yIndex = drawString(graphics2D, "规格", (lineWidth / 10) * 4, yIndex, lineWidth, lineHeight);
yIndex = drawString(graphics2D, "单价", (lineWidth / 10) * 8, yIndex, lineWidth, lineHeight);
yIndex = drawString(graphics2D, "数量", (lineWidth / 10) * 10, yIndex, lineWidth, lineHeight);
for (int i = 0; i < 5; i++) {
graphics2D.setFont(new Font("宋体", Font.PLAIN, 7));
yIndex = drawString(graphics2D, "E复合维生素B片100片E复合维生素B片100片", 5, yIndex + 15, (lineWidth / 10) * 7, 10);
graphics2D.setFont(new Font("宋体", Font.PLAIN, 6));
graphics2D.setColor(grey);
yIndex = drawString(graphics2D, "100片/盒", 5, yIndex + 11, lineWidth, lineHeight);
yIndex = drawString(graphics2D, "14.50", (lineWidth / 10) * 8, yIndex, lineWidth, lineHeight);
yIndex = drawString(graphics2D, "2", (lineWidth / 10) * 10, yIndex, lineWidth, lineHeight);
graphics2D.setFont(new Font("宋体", Font.PLAIN, 7));
yIndex = yIndex + 2;
graphics2D.drawLine(5, yIndex, 5 + lineWidth, yIndex);
}
graphics2D.setColor(defaultColor);
yIndex = drawString(graphics2D, "会员名称:小清新", 5, yIndex + lineHeight * 2, lineWidth, lineHeight);
yIndex = drawString(graphics2D, "总 数:6", 5, yIndex + lineHeight, lineWidth, lineHeight);
yIndex = drawString(graphics2D, "总 计:55.30", 5, yIndex + lineHeight, lineWidth, lineHeight);
yIndex = drawString(graphics2D, "收 款:100.00", 5, yIndex + lineHeight, lineWidth, lineHeight);
yIndex = drawString(graphics2D, "找 零:44.70", 5, yIndex + lineHeight, lineWidth, lineHeight);
graphics2D.setFont(new Font("宋体", Font.PLAIN, 6));
graphics2D.setColor(grey);
yIndex = drawString(graphics2D, "电话:020-123456", 5, yIndex + lineHeight * 2, lineWidth, lineHeight);
yIndex = drawString(graphics2D, "地址:北京市海淀区上地十街10号百度大厦", 5, yIndex + lineHeight, lineWidth, lineHeight);
yIndex = yIndex + 20;
graphics2D.drawLine(0, yIndex, 140, yIndex);
return PAGE_EXISTS;
}
}
, pageFormat);
//获取默认打印机
PrinterJob printerJob = PrinterJob.getPrinterJob();
printerJob.setPageable(book);
try {
printerJob.print();
} catch (PrinterException e) {
e.printStackTrace();
System.out.println("打印异常");
}
} else {
System.out.println("没法发现打印机服务");
}
}
/**
* 字符串输出
*
* @param graphics2D 画笔
* @param text 打印文本
* @param x 打印起点 x 坐标
* @param y 打印起点 y 坐标
* @param lineWidth 行宽
* @param lineHeight 行高
* @return 返回终点 y 坐标
*/
private static int drawString(Graphics2D graphics2D, String text, int x, int y, int lineWidth, int lineHeight) {
FontMetrics fontMetrics = graphics2D.getFontMetrics();
if (fontMetrics.stringWidth(text) > 0) {
graphics2D.drawString(text, x, y);
return y;
} else {
char[] chars = text.toCharArray();
int charsWidth = 0;
StringBuffer sb = new StringBuffer();
for (int i = 0; i < chars.length; i++) {
if ((charsWidth + fontMetrics.charWidth(chars[i])) > lineWidth) {
graphics2D.drawString(sb.toString(), x, y);
sb.setLength(0);
y = y + lineHeight;
charsWidth = fontMetrics.charWidth(chars[i]);
sb.append(chars[i]);
} else {
charsWidth = charsWidth + fontMetrics.charWidth(chars[i]);
sb.append(chars[i]);
}
}
if (sb.length() > 0) {
graphics2D.drawString(sb.toString(), x, y);
y = y + lineHeight;
}
return y - lineHeight;
}
}
}
package com.mortals.xhx.module.demo.print;
import lombok.Data;
import java.util.Date;
@Data
public class YcCustSale {
private Integer id;
private String totalPrice;
private String num;
private String ssPrice;
private String ysPrice;
private String yhPrice;
private String memberPhone;
private String memberScore;
private String zlPrice;
private String payType;
private Date createDate;
}
package com.mortals.xhx.module.demo.print;
import lombok.Data;
@Data
public class YcCustSaleDetail {
private String salePrice;
private Integer num;
private String goodsCode;
private String goodsName;
private String totalPrice;
}
package com.mortals.xhx.module.demo.print;
import lombok.Data;
@Data
public class YcStore {
private String storeName;
private String phone;
private String address;
}
package com.mortals.xhx.module.demo.print;
import lombok.Data;
@Data
public class YcUser {
private String loginName;
}
package com.mortals.xhx.module.idCard;
import com.mortals.xhx.common.osSelect;
import com.mortals.xhx.module.idCard.service.TMZParseSDK;
import com.mortals.xhx.module.idCard.service.TMZSDK;
import com.sun.jna.Native;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class TMZMain {
public static TMZSDK tmzSDK = null;
public static TMZParseSDK tmzParseSDK = null;
/**
* 根据不同操作系统选择不同的库文件和库路径
*
* @return
*/
public static boolean createSDKInstance() {
if (tmzSDK == null) {
synchronized (TMZSDK.class) {
String strDllPath = "";
try {
//System.setProperty("jna.debug_load", "true");
/* if (osSelect.isWindows())
//win系统加载库路径
strDllPath = System.getProperty("user.dir") + "\\lib\\tmz\\libSDTReader.so";
else if (osSelect.isLinux())*/
//Linux系统加载库路径
strDllPath = System.getProperty("user.dir") + "/lib/tmz/libSDTReader.so";
tmzSDK = Native.loadLibrary(strDllPath, TMZSDK.class);
strDllPath = System.getProperty("user.dir") + "/lib/tmz/libwlt.so";
tmzParseSDK = Native.loadLibrary(strDllPath, TMZParseSDK.class);
} catch (Exception ex) {
log.error("loadLibrary: " + strDllPath + " Error: " + ex.getMessage());
return false;
}
}
}
return true;
}
public static void main(String[] args) {
if (tmzSDK == null) {
if (!createSDKInstance()) {
System.out.println("Load SDK fail");
return;
}
}
//linux系统建议调用以下接口加载组件库
if (osSelect.isLinux()) {
TMZSDK.BYTE_ARRAY ptrByteArray1 = new TMZSDK.BYTE_ARRAY(256);
TMZSDK.BYTE_ARRAY ptrByteArray2 = new TMZSDK.BYTE_ARRAY(256);
//这里是库的绝对路径,请根据实际情况修改,注意改路径必须有访问权限
String strPath1 = System.getProperty("user.dir") + "/lib/libcrypto.so.1.1";
String strPath2 = System.getProperty("user.dir") + "/lib/libssl.so.1.1";
/*
System.arraycopy(strPath1.getBytes(), 0, ptrByteArray1.byValue, 0, strPath1.length());
ptrByteArray1.write();
hCNetSDK.NET_DVR_SetSDKInitCfg(3, ptrByteArray1.getPointer());
System.arraycopy(strPath2.getBytes(), 0, ptrByteArray2.byValue, 0, strPath2.length());
ptrByteArray2.write();
hCNetSDK.NET_DVR_SetSDKInitCfg(4, ptrByteArray2.getPointer());
String strPathCom = System.getProperty("user.dir")+"/lib/";
HCNetSDK.NET_DVR_LOCAL_SDK_PATH struComPath = new HCNetSDK.NET_DVR_LOCAL_SDK_PATH();
System.arraycopy(strPathCom.getBytes(), 0, struComPath.sPath, 0, strPathCom.length());
struComPath.write();
hCNetSDK.NET_DVR_SetSDKInitCfg(2, struComPath.getPointer());*/
}
}
}
package com.mortals.xhx.module.idCard.model;
import lombok.Data;
@Data
public class IdCardCons {
/**
* 设置不解码身份证头像照片,返回的photobase64将为空(目前仅支持amd64平台解码,其他平台暂不支持)
*/
private String NoPhoto;
/**
* 同一张身份证只读第一次。
*/
private String readOnce;
/**
* 读卡超时单位秒 最长60秒
*/
private String waitTime;
/**
* 以JSONP方式返回数据
*/
private String callback;
}
package com.mortals.xhx.module.idCard.model;
import lombok.Data;
@Data
public class XzxIdCard {
private String code;
private String nation;
private String fpDescribe;
private Object fpData;
private String fpFeature1;
private String fpFeature2;
private String retmsg;
private String userlifee;
private String backImg;
private String userlifeb;
private String cardType;
private String fpFingerName1;
private String passID;
private String fpFingerName2;
private String address;
private String sex;
private String born;
private String errmsg;
private String cardno;
private String fpRegResult1;
private String fpRegResult2;
private String photobase64;
private String police;
private String issuesTimes;
private String frontImg;
private String name;
private String certVol;
private String fpQuality2;
private String engName;
private String fpQuality1;
private String retcode;
}
\ No newline at end of file
package com.mortals.xhx.module.idCard.service;
import com.mortals.xhx.busiz.rsp.IdCardResp;
import com.mortals.xhx.module.idCard.model.IdCardCons;
/**
* 身份证业务接口
*
* @author:
* @date: 2022/12/26 13:26
*/
public interface IdCardService {
IdCardResp readIdCardMessage(IdCardCons cons);
}
package com.mortals.xhx.module.idCard.service;
import com.sun.jna.Library;
import com.sun.jna.Structure;
/**
* 身份证解析
*
* @author: zxfei
* @date: 2023/12/11 13:42
*/
public interface TMZParseSDK extends Library {
public static int success=0x90; //操作成功
int _SDT_OpenUsbByFD(int fd);//打开设备
int _SDT_CloseDev();//关闭设备
int _SDT_GetSAMID(byte[] pucSAMID);
/**
* @return 成功等于0x90,失败返回其他
* @brief 对 SAM_A 复位。
**/
int _SDT_ResetSAM();
/**
* @return 成功等于0,失败返回其他
* @brief 寻卡
* @param[OUT] pucManaInfo: 返回4字节0x00
**/
int _SDT_StartFindIDCard(byte[] pucManaInfo);
/**
* @return 成功等于0,失败返回其他
* @brief 选卡
* @param[OUT] pucManaMsg: 返回8字节0x00
**/
int _SDT_SelectIDCard(byte[] pucManaInfo);
/**
* @return 成功等于0x90,失败返回其他
* @brief 读取居民身份证机读文字信息和相片信息
* @param[OUT] pucCHMsg: 身份证文字信息
* @param[OUT] puiCHMsgLen: 身份证文字信息长度不少于256字节
* @param[OUT] pucPHMsg: 身份照片信息
* @param[OUT] puiPHMsgLen: 身份证照片信息长度不少于1024字节
**/
int _SDT_ReadBaseMsg(byte[] pucCHMsg, int puiCHMsgLen, byte[] pucPHMsg, int puiPHMsgLen);
/**
* @return 成功等于0x90,失败返回其他
* @brief 读取居民身份证机读文字信息、相片信息和指纹信息
* @param[OUT] pucCHMsg: 身份证文字信息
* @param[OUT] puiCHMsgLen: 身份证文字信息长度不少于256字节
* @param[OUT] pucPHMsg: 身份照片信息
* @param[OUT] puiPHMsgLen: 身份证照片信息长度不少于1024字节
* @param[OUT] pucFPMsg: 身份证指纹信息
* @param[OUT] puiFPMsgLen: 身份证指纹信息长度不少于1024字节
**/
int _SDT_ReadBaseFPMsg(byte[] pucCHMsg, int puiCHMsgLen, byte[] pucPHMsg, int puiPHMsgLen, byte[] pucFPMsg, int puiFPMsgLen);
/**
*@brief 解析身份证信息
**/
int _SDT_ParseIDCardTextInfo(byte[] pTextInfo, int iTextInfoLen, int iType, byte[] pWordInfo);
// int _SDT_ParseIDCardTextInfo(String pucCHMsg,int puiCHMsgLen,int iType,String pSFZInfo);
public static class BYTE_ARRAY extends Structure {
public byte[] byValue;
public BYTE_ARRAY(int iLen) {
byValue = new byte[iLen];
}
}
}
\ No newline at end of file
package com.mortals.xhx.module.idCard.service;
import com.sun.jna.Library;
import com.sun.jna.Structure;
import com.sun.jna.ptr.IntByReference;
/**
* 身份证阅读器so dell库
*
* @author: zxfei
* @date: 2023/12/11 13:42
*/
public interface TMZSDK extends Library {
static int success = 0x90; //操作成功
int _SDT_OpenUsbByFD(int fd);//打开设备
int _SDT_CloseDev();//关闭设备
int _SDT_GetSAMID(byte[] pucSAMID);
/**
* @return 成功等于0x90,失败返回其他
* @brief 对 SAM_A 复位。
**/
int _SDT_ResetSAM();
/**
* @return 成功等于0,失败返回其他
* @brief 寻卡
* @param[OUT] pucManaInfo: 返回4字节0x00
**/
int _SDT_StartFindIDCard(byte[] pucManaInfo);
/**
* @return 成功等于0,失败返回其他
* @brief 选卡
* @param[OUT] pucManaMsg: 返回8字节0x00
**/
int _SDT_SelectIDCard(byte[] pucManaInfo);
/**
* @return 成功等于0x90,失败返回其他
* @brief 读取居民身份证机读文字信息和相片信息
* @param[OUT] pucCHMsg: 身份证文字信息
* @param[OUT] puiCHMsgLen: 身份证文字信息长度不少于256字节
* @param[OUT] pucPHMsg: 身份照片信息
* @param[OUT] puiPHMsgLen: 身份证照片信息长度不少于1024字节
**/
int _SDT_ReadBaseMsg(byte[] pucCHMsg, IntByReference puiCHMsgLen, byte[] pucPHMsg, IntByReference puiPHMsgLen);
/**
* @return 成功等于0x90,失败返回其他
* @brief 读取居民身份证机读文字信息、相片信息和指纹信息
* @param[OUT] pucCHMsg: 身份证文字信息
* @param[OUT] puiCHMsgLen: 身份证文字信息长度不少于256字节
* @param[OUT] pucPHMsg: 身份照片信息
* @param[OUT] puiPHMsgLen: 身份证照片信息长度不少于1024字节
* @param[OUT] pucFPMsg: 身份证指纹信息
* @param[OUT] puiFPMsgLen: 身份证指纹信息长度不少于1024字节
**/
int _SDT_ReadBaseFPMsg(byte[] pucCHMsg, IntByReference puiCHMsgLen, byte[] pucPHMsg, IntByReference puiPHMsgLen, byte[] pucFPMsg, IntByReference puiFPMsgLen);
/**
* @brief 解析身份证信息
**/
int _SDT_ParseIDCardTextInfo(byte[] pTextInfo, int iTextInfoLen, IntByReference iType, byte[] pWordInfo);
int _SDT_ParsePhotoInfo(byte[] pPhotoInfo, int iPhotoInfoLen, int iBmpFormat, byte[] pBmpFile);
// int _SDT_ParseIDCardTextInfo(String pucCHMsg,int puiCHMsgLen,int iType,String pSFZInfo);
static class BYTE_ARRAY extends Structure {
public byte[] byValue;
public BYTE_ARRAY(int iLen) {
byValue = new byte[iLen];
}
}
}
\ No newline at end of file
package com.mortals.xhx.module.idCard.service.impl;
import com.mortals.xhx.busiz.rsp.IdCardResp;
import com.mortals.xhx.module.idCard.model.IdCardCons;
import com.mortals.xhx.module.idCard.service.IdCardService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Service;
/**
* 德卡身份证实现类
*
* @author:
* @date: 2022/12/26 14:09
*/
@Service
@Slf4j
@ConditionalOnProperty(prefix = "config", name = "idcard", havingValue = "dk")
public class DKIdCardServiceImpl implements IdCardService {
@Value("${config.xzxUrl:http://localhost:8989/api/ReadMsg}")
private String url;
@Override
public IdCardResp readIdCardMessage(IdCardCons cons) {
//todo 德卡身份证识别待实现
IdCardResp idCardResp = new IdCardResp();
return idCardResp;
}
}
package com.mortals.xhx.module.idCard.service.impl;
import com.mortals.xhx.busiz.rsp.IdCardResp;
import com.mortals.xhx.module.idCard.model.IdCardCons;
import com.mortals.xhx.module.idCard.service.IdCardService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Service;
/**
* 国腾身份证实现类
*
* @author:
* @date: 2022/12/26 14:09
*/
@Service
@Slf4j
@ConditionalOnProperty(prefix = "config", name = "idcard", havingValue = "gt")
public class GTIdCardServiceImpl implements IdCardService {
@Value("${config.xzxUrl:http://localhost:8989/api/ReadMsg}")
private String url;
@Override
public IdCardResp readIdCardMessage(IdCardCons cons) {
//todo 国腾身份证识别待实现
IdCardResp idCardResp = new IdCardResp();
return idCardResp;
}
}
package com.mortals.xhx.module.idCard.service.impl;
import com.mortals.xhx.busiz.rsp.IdCardResp;
import com.mortals.xhx.module.idCard.model.IdCardCons;
import com.mortals.xhx.module.idCard.service.IdCardService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Service;
/**
* 华视身份证实现类
*
* @author:
* @date: 2022/12/26 14:09
*/
@Service
@Slf4j
@ConditionalOnProperty(prefix = "config", name = "idcard", havingValue = "hs")
public class HSIdCardServiceImpl implements IdCardService {
@Value("${config.xzxUrl:http://localhost:8989/api/ReadMsg}")
private String url;
@Override
public IdCardResp readIdCardMessage(IdCardCons cons) {
//todo 华视身份证识别待实现
IdCardResp idCardResp = new IdCardResp();
return idCardResp;
}
}
package com.mortals.xhx.module.idCard.service.impl;
import com.mortals.xhx.busiz.rsp.IdCardResp;
import com.mortals.xhx.module.idCard.model.IdCardCons;
import com.mortals.xhx.module.idCard.service.IdCardService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Service;
/**
* 精伦身份证实现类
*
* @author:
* @date: 2022/12/26 14:09
*/
@Service
@Slf4j
@ConditionalOnProperty(prefix = "config", name = "idcard", havingValue = "jl")
public class JLIdCardServiceImpl implements IdCardService {
@Value("${config.xzxUrl:http://localhost:8989/api/ReadMsg}")
private String url;
@Override
public IdCardResp readIdCardMessage(IdCardCons cons) {
//todo 精伦身份证识别待实现
IdCardResp idCardResp = new IdCardResp();
return idCardResp;
}
}
package com.mortals.xhx.module.idCard.service.impl;
import com.mortals.xhx.busiz.rsp.IdCardResp;
import com.mortals.xhx.module.idCard.model.IdCardCons;
import com.mortals.xhx.module.idCard.service.IdCardService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Service;
/**
* 神思身份证实现类
*
* @author:
* @date: 2022/12/26 14:09
*/
@Service
@Slf4j
@ConditionalOnProperty(prefix = "config", name = "idcard", havingValue = "ss")
public class SSIdCardServiceImpl implements IdCardService {
@Value("${config.xzxUrl:http://localhost:8989/api/ReadMsg}")
private String url;
@Override
public IdCardResp readIdCardMessage(IdCardCons cons) {
//todo 神思身份证识别待实现
IdCardResp idCardResp = new IdCardResp();
return idCardResp;
}
}
package com.mortals.xhx.module.idCard.service.impl;
import cn.hutool.core.codec.Base64;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.mortals.framework.util.DataUtil;
import com.mortals.xhx.busiz.rsp.IdCardResp;
import com.mortals.xhx.common.code.YesNoEnum;
import com.mortals.xhx.common.utils.Base64Util;
import com.mortals.xhx.module.idCard.TMZMain;
import com.mortals.xhx.module.idCard.model.IdCardCons;
import com.mortals.xhx.module.idCard.model.XzxIdCard;
import com.mortals.xhx.module.idCard.service.IdCardService;
import com.mortals.xhx.module.idCard.service.TMZSDK;
import com.sun.jna.ptr.IntByReference;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import java.nio.charset.StandardCharsets;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
/**
* TMZ身份证实现类
* <p>
* 加载so 调用so方法 完成身份证阅读
*
* @author: zxfei
* @date: 2023/12/12 15:04
*/
@Service
@Slf4j
@ConditionalOnProperty(prefix = "config", name = "idcard", havingValue = "tmz")
public class TMZIdCardServiceImpl implements IdCardService {
private Boolean DevOpen = false;
private Integer waitTime = 60;//单位秒
@Override
public IdCardResp readIdCardMessage(IdCardCons cons) {
if (cons.getWaitTime() != null) {
DataUtil.converStr2Int(cons.getWaitTime(), 60);
}
IdCardResp idCardResp = new IdCardResp();
idCardResp.setStatus(YesNoEnum.NO.getValue() + "");
boolean sdkInstance = TMZMain.createSDKInstance();
if (!sdkInstance) {
idCardResp.setMessage("身份证阅读器初始化sdk失败!");
return idCardResp;
}
if (DevOpen) {
//关闭设备
TMZMain.tmzSDK._SDT_CloseDev();
}
int openret = TMZMain.tmzSDK._SDT_OpenUsbByFD(0);
log.info("打卡usb:{}", Integer.toHexString(openret));
if (Integer.toHexString(openret).equals("90")) {
ReadIDCardCycle(idCardResp);
}
return idCardResp;
}
/**
* 循环读卡
*
* @param idCardResp
* @return
*/
private IdCardResp ReadIDCardCycle(IdCardResp idCardResp) {
//等待时间 判断退出
DateTime endTime = DateUtil.offsetSecond(new Date(), waitTime);
while (true) {
int compare = DateUtil.compare(new Date(), endTime);
if (compare > 0) {
//超过读取时间,跳出循环,返回超时读取错误
idCardResp.setStatus(YesNoEnum.NO.getValue() + "");
idCardResp.setMessage("读取超时!");
break;
}
Boolean readIDCard = this.ReadIDCard(idCardResp);
if (readIDCard) {
log.info("读取成功!");
break;
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
log.error(e.getMessage());
}
}
return idCardResp;
}
private Boolean ReadIDCard(IdCardResp idCardResp) {
//寻卡
byte[] pucManaInfo = new byte[4];
int ret = TMZMain.tmzSDK._SDT_StartFindIDCard(pucManaInfo);
log.info("寻卡:0x{},pucManaInfo:{}", Integer.toHexString(ret), pucManaInfo);
//选卡
int selectret = TMZMain.tmzSDK._SDT_SelectIDCard(pucManaInfo);
log.info("选卡:0x{}", Integer.toHexString(selectret));
//读卡
byte[] pucCHMsg = new byte[512];
byte[] pucPHMsg = new byte[2048];
byte[] pucFPMsg = new byte[2048];
IntByReference puiCHMsgLen = new IntByReference();
IntByReference puiPHMsgLen = new IntByReference();
IntByReference puiFHMsgLen = new IntByReference();
int readret = TMZMain.tmzSDK._SDT_ReadBaseFPMsg(pucCHMsg, puiCHMsgLen, pucPHMsg, puiPHMsgLen, pucFPMsg, puiFHMsgLen);
log.info("读卡:0x{}", Integer.toHexString(readret));
IntByReference iType = new IntByReference();
byte[] pSFZInfo = new byte[260];
int parseret = TMZMain.tmzSDK._SDT_ParseIDCardTextInfo(pucCHMsg, puiCHMsgLen.getValue(), iType, pSFZInfo);
String sfzStr = new String(pSFZInfo, StandardCharsets.UTF_8);
List<String> splitList = StrUtil.split(sfzStr, "|");
//String[] split = sfzStr.split("|");
log.info("parseret:0x{},sfzStr:{}", Integer.toHexString(parseret), sfzStr);
//身份证信息封装
if (splitList.size() > 7) {
if (ObjectUtils.isEmpty(splitList.get(0))) {
log.info("身份证号码为空!");
return false;
}
idCardResp.setUsername(splitList.get(0));
idCardResp.setSex(splitList.get(1));
idCardResp.setNation(splitList.get(2));
idCardResp.setBorn(splitList.get(3));
idCardResp.setAddress(splitList.get(4));
idCardResp.setIdcardno(splitList.get(5));
idCardResp.setGrantDept(splitList.get(6));
idCardResp.setUserLifeBegin(splitList.get(7));
idCardResp.setUserLifeEnd(splitList.get(8));
String fileName = "/tmp/sfz_" + new Date().getTime() + ".jpg";
byte[] pBmpFile = fileName.getBytes(StandardCharsets.UTF_8);
int photoRet = TMZMain.tmzSDK._SDT_ParsePhotoInfo(pucPHMsg, puiPHMsgLen.getValue(), 4, pBmpFile);
log.info("photoRet:0x{},pucPHMsg lens:{}", Integer.toHexString(photoRet), pucPHMsg.length);
boolean exist = FileUtil.exist(fileName);
if(exist){
byte[] bytes = FileUtil.readBytes(fileName);
String photoBase64 = Base64.encode(bytes);
idCardResp.setPhotoBase64String("data:image/jpg;base64," + photoBase64);
}
idCardResp.setStatus(YesNoEnum.YES.getValue() + "");
idCardResp.setMessage("获取身份证成功");
return true;
}
return false;
}
public static void main(String[] args) {
/* byte[] bytes = FileUtil.readBytes("E:\\pic\\1.png");
String s = Base64.encode(bytes);
System.out.println(s);
*/
String str = "||||||||||";
// String[] split = str.split("|");
List<String> split = StrUtil.split(str, "|");
System.out.println(split.get(0));
}
}
package com.mortals.xhx.module.idCard.service.impl;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.mortals.xhx.busiz.rsp.IdCardResp;
import com.mortals.xhx.common.code.YesNoEnum;
import com.mortals.xhx.module.idCard.model.IdCardCons;
import com.mortals.xhx.module.idCard.model.XzxIdCard;
import com.mortals.xhx.module.idCard.service.IdCardService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import java.util.HashMap;
/**
* 新中新身份证实现类
*
* @author:
* @date: 2022/12/26 14:09
*/
@Service
@Slf4j
@ConditionalOnProperty(prefix = "config", name = "idcard", havingValue = "xzx")
public class XZXIdCardServiceImpl implements IdCardService {
@Value("${config.idcard.xzxUrl:http://localhost:8989/api/ReadMsg}")
private String url;
@Override
public IdCardResp readIdCardMessage(IdCardCons cons) {
HashMap<String, String> params = new HashMap<>();
if (cons.getNoPhoto() != null) {
params.put("NoPhoto", cons.getNoPhoto());
}
if (cons.getReadOnce() != null) {
params.put("readOnce", cons.getReadOnce());
}
if (cons.getWaitTime() != null) {
params.put("waitTime", cons.getWaitTime());
}
if (cons.getCallback() != null) {
params.put("callback ", cons.getCallback());
}
String queryParams = HttpUtil.toParams(params);
String readUrl = url;
if (!ObjectUtils.isEmpty(readUrl)) {
readUrl = url + "?" + queryParams;
}
log.info("readUrl={}", readUrl);
String resp = HttpUtil.get(readUrl);
XzxIdCard idCard = JSON.parseObject(resp, XzxIdCard.class);
IdCardResp idCardResp = new IdCardResp();
if ("0".equals(idCard.getCode())) {
//映射
idCardResp.setUsername(idCard.getName());
idCardResp.setIdcardno(idCard.getCardno());
idCardResp.setSex(idCard.getSex());
idCardResp.setAddress(idCard.getAddress());
idCardResp.setBorn(idCard.getBorn());
idCardResp.setGrantDept(idCard.getPolice());
idCardResp.setNation(idCard.getNation());
idCardResp.setUserLifeBegin(idCard.getUserlifeb());
idCardResp.setUserLifeEnd(idCard.getUserlifee());
//idCardResp.setPhotoFileName();
idCardResp.setPhotoBase64String("data:image/jpg;base64," + idCard.getPhotobase64());
idCardResp.setStatus(YesNoEnum.YES.getValue() + "");
idCardResp.setMessage(idCard.getRetmsg());
} else {
idCardResp.setStatus(YesNoEnum.NO.getValue() + "");
idCardResp.setMessage(idCard.getErrmsg());
}
return idCardResp;
}
}
package com.mortals.xhx.module.print.model;
import lombok.Data;
@Data
public class PrintContent {
private String imgwidth;
private String fontstyle;
private String printtype;
private String fontsize;
private String fontunit;
private String title;
private String fontname;
private String align;
private String content;
public void initAttrValue() {
this.imgwidth = "100";
this.printtype = "text";
this.fontstyle = "regular";
this.fontsize = "12";
this.fontunit = "point";
this.title = "xxx";
this.fontname = "微软雅黑";
this.align = "left";
this.content = "目前正卡在这里寸步难行,请问我现在往哪里发展,应该怎么做,开了个大月。";
}
}
\ No newline at end of file
package com.mortals.xhx.module.print.model;
import lombok.Data;
@Data
public class Printer {
private String pinter;
}
\ No newline at end of file
package com.mortals.xhx.module.print.model;
import lombok.Data;
@Data
public class PrinterQueue {
private String queueName;
}
\ No newline at end of file
package com.mortals.xhx.module.print.service.PrintComponent;
import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.spring.SpringUtil;
import com.mortals.framework.exception.AppException;
import com.mortals.xhx.common.code.Base64TypeEnum;
import com.mortals.xhx.common.code.PrintTypeEnum;
import org.apache.commons.codec.binary.Base64;
import javax.print.*;
import javax.print.attribute.*;
import javax.print.attribute.standard.Copies;
import java.io.File;
import java.util.Date;
import java.util.List;
public class Base64PrintComponent extends BasePrintComponent {
public Base64PrintComponent(String type) {
super(type);
}
@Override
public void print(ComponentCons cons) {
PrintService printService = getPrintService(cons);
//base64 转换成图片 等其它 data:image/jpg;base64,/9j/4AAQSkZJRgA
String base64 = cons.getBase64();
String filePath = SpringUtil.getProperty("upload.path");
List<String> split = StrUtil.split(base64, ",");
if(split.size()<2){
throw new AppException("base64格式不正确!");
}
String head = split.get(0);
String base64Content = split.get(1);
if(Base64TypeEnum.BASE64_FILETYPE_JPG.getDesc().equalsIgnoreCase(head)){
}else if(Base64TypeEnum.BASE64_FILETYPE_TXT.getDesc().equalsIgnoreCase(head)){
String destFile = filePath + File.separator + new Date().getTime() + "." + Base64TypeEnum.BASE64_FILETYPE_TXT.getValue();
//Base64Util.decodeBase64(destFile,base64Content);
byte[] bytes = Base64.decodeBase64(base64Content);
//打印文件
DocFlavor flavor = DocFlavor.BYTE_ARRAY.AUTOSENSE;
DocPrintJob job = printService.createPrintJob();
PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
DocAttributeSet das = new HashDocAttributeSet();
pras.add(new Copies(1));
Doc doc = new SimpleDoc(bytes, flavor, das);
try {
job.print(doc, pras);
} catch (PrintException e) {
throw new RuntimeException(e);
}
//Base64Util.decodeBase64String()
}
//String type = StrUtil.subBetween(head, "data:", ";");
//判断base64文件类型 生成不同类型文件
}
@Override
public String getType() {
return PrintTypeEnum.PRINT_BASE64.getValue();
}
}
package com.mortals.xhx.module.print.service.PrintComponent;
import com.mortals.framework.exception.AppException;
import com.mortals.xhx.common.code.PrintTypeEnum;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.ObjectUtils;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import java.awt.print.PrinterJob;
@Slf4j
public abstract class BasePrintComponent {
private String type;
public BasePrintComponent(String type) {
this.type = type;
}
public abstract void print(ComponentCons cons);
protected PrintService getPrintService(ComponentCons cons) {
PrintService printService = null;
if (ObjectUtils.isEmpty(cons.getPrintername())) {
printService = PrintServiceLookup.lookupDefaultPrintService();
if(printService==null){
PrintService[] printServices = PrinterJob.lookupPrintServices();
if(printServices.length>0){
printService=printServices[0];
}
}
} else {
// 匹配指定打印机
// 获得本台电脑连接的所有打印机
PrintService[] printServices = PrinterJob.lookupPrintServices();
if (printServices == null || printServices.length == 0) {
log.info("打印失败,未找到可用打印机,请检查!");
throw new AppException("打印失败,未找到可用打印机,请检查!");
}
for (int i = 0; i < printServices.length; i++) {
log.info(printServices[i].getName());
if (printServices[i].getName().contains(cons.getPrintername())) {
printService = printServices[i];
break;
}
}
if(printService==null){
printService = PrintServiceLookup.lookupDefaultPrintService();
}
}
return printService;
}
public static BasePrintComponent createType(String type) {
if (type.equals(PrintTypeEnum.PRINT_URL.getValue())) {
return new UrlPrintComponent(type);
} else if (type.equals(PrintTypeEnum.PRINT_BASE64.getValue())) {
return new Base64PrintComponent(type);
} else if (type.equals(PrintTypeEnum.PRINT_NORMAL.getValue())) {
return new NormalPrintComponent(type);
} else {
throw new AppException(String.format("不支持当前组件类型,Type:%s", type));
}
}
public abstract String getType();
}
package com.mortals.xhx.module.print.service.PrintComponent;
import com.mortals.xhx.module.print.model.PrintContent;
import lombok.Data;
import java.util.List;
@Data
public class ComponentCons {
private String papertype;
/**
* 打印机纸张宽度
*/
private String printerpaperwidth;
/**
* 打印机名称,为空则为默认打印机
*/
private String printername;
/**
* 网络附件下载连接
*/
private String url;
private String base64;
private List<PrintContent> contents;
}
package com.mortals.xhx.module.print.service.PrintComponent;
import cn.hutool.extra.spring.SpringUtil;
import com.mortals.framework.exception.AppException;
import com.mortals.framework.util.DataUtil;
import com.mortals.xhx.common.code.PaperTypeEnum;
import com.mortals.xhx.common.code.PrintTypeEnum;
import com.mortals.xhx.common.code.TicketTypeWidthEnum;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.ObjectUtils;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.standard.Sides;
import java.awt.print.*;
/**
* 普通行打印
*
* @author:
* @date: 2022/12/27 9:37
*/
@Slf4j
public class NormalPrintComponent extends BasePrintComponent {
Integer ticketMarginWidth = 30;
Integer marginTop = 20;
Integer marginBottom = 10;
public NormalPrintComponent(String type) {
super(type);
}
@Override
public void print(ComponentCons cons) {
String ticketType = SpringUtil.getProperty("print.ticket");
//创建打印文档
Book book = new Book();
//设置
TicketPrinter ticketPrinter = new TicketPrinter();
ticketPrinter.setMarginWidth(ticketMarginWidth);
ticketPrinter.setMarginTop(marginTop);
ticketPrinter.setPrintContentList(cons.getContents());
Integer ticketWidth = Integer.parseInt(TicketTypeWidthEnum.TYPE_LARGER.getDesc());
if (TicketTypeWidthEnum.TYPE_LARGER.getValue().equals(ticketType)) {
ticketWidth = Integer.parseInt(TicketTypeWidthEnum.TYPE_LARGER.getDesc());
} else if (TicketTypeWidthEnum.TYPE_SMALL.getValue().equals(ticketType)) {
ticketWidth = Integer.parseInt(TicketTypeWidthEnum.TYPE_SMALL.getDesc());
ticketMarginWidth = 22;
}
//打印格式
PageFormat pageFormat = new PageFormat();
//设置打印起点从左上角开始,从左到右,从上到下打印
pageFormat.setOrientation(PageFormat.PORTRAIT);
//打印页面格式设置
Paper paper = new Paper();
//设置打印宽度(固定,和具体的打印机有关)和高度(跟实际打印内容的多少有关)
if (cons.getPapertype().equals(PaperTypeEnum.PAPER_A3.getValue())) {
paper.setSize(841, 1190);
//设置打印区域 打印起点坐标、打印的宽度和高度
paper.setImageableArea(0, 0, 841, 1190);
} else if (cons.getPapertype().equals(PaperTypeEnum.PAPER_A4.getValue())) {
paper.setSize(595, 842);
//设置打印区域 打印起点坐标、打印的宽度和高度
paper.setImageableArea(0, 0, 595, 842);
} else if (cons.getPapertype().equals(PaperTypeEnum.PAPER_TICKET.getValue())) {
paper.setSize(ticketWidth, 576);
paper.setImageableArea(0, 0, ticketWidth, 566);
pageFormat.setPaper(paper);
int actualHeight = ticketPrinter.getActualHeight(pageFormat);
actualHeight += marginBottom;
log.info("ticketWidth:{} actualHeight:{}", ticketWidth, actualHeight);
//actualHeight=1500;
paper.setSize(ticketWidth, actualHeight);
//设置打印区域 打印起点坐标、打印的宽度和高度
paper.setImageableArea(0, 0, ticketWidth, actualHeight);
pageFormat.setPaper(paper);
/* paper.setSize(ticketWidth, 1314);
//设置打印区域 打印起点坐标、打印的宽度和高度
paper.setImageableArea(0, 0, ticketWidth, 1314);*/
} else {
//默认小票高宽 两种纸张宽度宽度 1.164 页边距11 2.227 页边距14
int actualHeight = ticketPrinter.getActualHeight(pageFormat);
//actualHeight += marginBottom;
//actualHeight=1500;
paper.setSize(ticketWidth, actualHeight);
//设置打印区域 打印起点坐标、打印的宽度和高度
paper.setImageableArea(0, 0, ticketWidth, actualHeight);
log.info("ticketWidth:{} actualHeight:{}", ticketWidth, actualHeight);
/* paper.setSize(ticketWidth, 566);
//设置打印区域 打印起点坐标、打印的宽度和高度
paper.setImageableArea(0, 0, ticketWidth, 566);*/
}
pageFormat.setPaper(paper);
book.append(ticketPrinter, pageFormat);
//获取默认打印机
PrintService printService = getPrintService(cons);
PrinterJob printerJob = PrinterJob.getPrinterJob();
log.info("page:" + book.getNumberOfPages());
printerJob.setPageable(book);
printerJob.setCopies(1);// 设置打印份数
try {
if (printService != null) {
printerJob.setPrintService(printService);
HashPrintRequestAttributeSet pars = new HashPrintRequestAttributeSet();
pars.add(Sides.ONE_SIDED); // 设置单双页
printerJob.print(pars);
} else {
log.info("打印失败,未找到名称为" + cons.getPrintername() + "的打印机,请检查。");
throw new AppException("打印失败,未找到名称为" + cons.getPrintername() + "的打印机,请检查。");
}
} catch (PrinterException e) {
log.error("打印异常", e);
throw new AppException(e.getMessage());
}
}
@Override
public String getType() {
return PrintTypeEnum.PRINT_NORMAL.getValue();
}
}
package com.mortals.xhx.module.print.service.PrintComponent;
import cn.hutool.core.io.FileUtil;
import cn.hutool.http.HttpUtil;
import com.mortals.xhx.common.code.PrintTypeEnum;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class UrlPrintComponent extends BasePrintComponent {
public UrlPrintComponent(String type) {
super(type);
}
@Override
public void print(ComponentCons cons) {
//通过网络下载附件地址
byte[] fileBytes = HttpUtil.downloadBytes(cons.getUrl());
//获取文件后缀
String suffixName = FileUtil.getSuffix(cons.getUrl());
log.info("file lens:{}", fileBytes.length);
log.info("file suffixName:{}", suffixName);
}
@Override
public String getType() {
return PrintTypeEnum.PRINT_URL.getValue();
}
}
package com.mortals.xhx.module.print.service;
import com.mortals.framework.common.Rest;
import com.mortals.xhx.busiz.req.PrintReq;
import com.mortals.xhx.module.print.model.Printer;
import com.mortals.xhx.module.print.model.PrinterQueue;
import java.util.List;
/**
* 打印业务接口
*
* @author:
* @date: 2022/12/26 13:26
*/
public interface PrintService {
Rest<Void> executePrint(PrintReq printReq);
Rest<List<Printer>> getPrintList();
Rest<List<PrinterQueue>> getPrintQueue(String printerName);
}
package com.mortals.xhx.module.print.service.impl;
import com.mortals.framework.common.Rest;
import com.mortals.framework.exception.AppException;
import com.mortals.xhx.busiz.req.PrintReq;
import com.mortals.xhx.common.utils.BeanUtil;
import com.mortals.xhx.module.print.model.Printer;
import com.mortals.xhx.module.print.model.PrinterQueue;
import com.mortals.xhx.module.print.service.PrintComponent.BasePrintComponent;
import com.mortals.xhx.module.print.service.PrintComponent.ComponentCons;
import com.mortals.xhx.module.print.service.PrintService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import javax.print.attribute.Attribute;
import javax.print.attribute.AttributeSet;
import java.awt.print.PrinterJob;
import java.util.ArrayList;
import java.util.List;
/**
* 打印实现类
*
* @author:
* @date: 2022/12/26 14:09
*/
@Service
@Slf4j
public class PrintServiceImpl implements PrintService {
@Override
public Rest<Void> executePrint(PrintReq printReq) {
//根据打印类型
BasePrintComponent basePrintComponent = BasePrintComponent.createType(printReq.getPrintertype());
ComponentCons componentCons = new ComponentCons();
BeanUtils.copyProperties(printReq,componentCons, BeanUtil.getNullPropertyNames(printReq));
basePrintComponent.print(componentCons);
//获取打印的类型
return Rest.ok();
}
@Override
public Rest<List<Printer>> getPrintList() {
List<Printer> list = new ArrayList<>();
javax.print.PrintService[] printServices = PrinterJob.lookupPrintServices();
for (int i = 0; i < printServices.length; i++) {
log.info(printServices[i].getName());
Printer printer = new Printer();
printer.setPinter(printServices[i].getName());
list.add(printer);
}
return Rest.ok(list);
}
@Override
public Rest<List<PrinterQueue>> getPrintQueue(String printerName) {
ArrayList<PrinterQueue> printerQueues = new ArrayList<>();
javax.print.PrintService printService = null;
javax.print.PrintService[] printServices = PrinterJob.lookupPrintServices();
if (printServices == null || printServices.length == 0) {
log.info("打印失败,未找到可用打印机,请检查!");
throw new AppException("打印失败,未找到可用打印机,请检查!");
}
for (int i = 0; i < printServices.length; i++) {
log.info(printServices[i].getName());
if (printServices[i].getName().contains(printerName)) {
printService = printServices[i];
break;
}
}
//队列数量
int queue = 0;
if(printServices!=null){
AttributeSet attributes = printService.getAttributes();
for (Attribute a : attributes.toArray()) {
String name = a.getName();
String value = attributes.get(a.getClass()).toString();
log.info(name + " : " + value);
if (name.equals("queued-job-count")) {
queue = Integer.parseInt(value);
}
}
for (int i = 0; i <queue ; i++) {
PrinterQueue printerQueue = new PrinterQueue();
printerQueue.setQueueName("打印队列"+i);
printerQueues.add(printerQueue);
}
// Object[] obj = attributes.toArray();
}
return Rest.ok(printerQueues);
}
}
package com.mortals.xhx.module.sign.modle;
import lombok.Data;
/**
* 签名图片信息
* @author: zhou
* @date: 2024/7/9 9:54
*/
@Data
public class File {
/**
* 文件类型 base64
* data:image/jpg;base64,/8j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQ//2Q==
*/
private String Base64String;
}
package com.mortals.xhx.module.sign.service;
import com.mortals.framework.common.Rest;
import com.mortals.xhx.busiz.req.SignReq;
import com.mortals.xhx.busiz.rsp.SignResp;
import com.mortals.xhx.module.sign.modle.File;
import java.util.List;
/**
* 高拍仪 业务接口
*
* @author: zxfei
* @date: 2024/1/2 9:58
*/
public interface SignService {
SignResp getSign(String sigType);
}
package com.mortals.xhx.module.sign.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.mortals.xhx.busiz.req.SignReq;
import com.mortals.xhx.busiz.rsp.SignResp;
import com.mortals.xhx.module.sign.service.SignService;
import lombok.extern.slf4j.Slf4j;
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.handshake.ServerHandshake;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.net.URI;
import java.net.URISyntaxException;
/**
* 签名版实现类
*
* @author: zhou
* @date: 2024/7/8 10:00
*/
@Service
@Slf4j
public class SignServiceImpl implements SignService {
@Value("${config.signUrl:ws://127.0.0.1:29999/}")
private String url;
static int runTime = 60; //60S超时返回
@Override
public SignResp getSign(String signType) {
WebSocketClient webSocketClient = null;
URI uri;
SignResp signResp = new SignResp();
if(runTime != 60){
signResp.setHWPenSign(signType);
signResp.setMsgID(-1);
signResp.setMessage("操作中,请勿重复发送指令");
return signResp;
}
//提交操作参数
SignReq signReq = new SignReq();
signReq.setHWPenSign(signType);
try {
uri = new URI(url);
} catch (Exception e) {
throw new RuntimeException(e);
}
if(webSocketClient != null && !webSocketClient.isClosed()){
String msg = JSON.toJSONString(signReq);
log.info("发送msg = " +msg);
webSocketClient.send(msg.getBytes());
}else {
webSocketClient = new WebSocketClient(uri) {
@Override
public void onOpen(ServerHandshake handshakedata) {
String msg = JSON.toJSONString(signReq);
log.info("新连接已打开:msg =" +msg);
send(msg.getBytes());
}
@Override
public void onMessage(String message) {
log.info("接收到消息: {}",message);
if(message != null){
JSONObject jsonObject = JSON.parseObject(message);
signResp.setHWPenSign(jsonObject.getString("HWPenSign"));
signResp.setMsgID(jsonObject.getInteger("msgID"));
signResp.setMessage(jsonObject.getString("message"));
}
}
@Override
public void onClose(int code, String reason, boolean remote) {
log.info("连接已关闭,code:{} reason:{} {}",code,reason,remote);
signResp.setHWPenSign(signType);
signResp.setMsgID(-1);
signResp.setMessage("连接已关闭,code="+code+",reason="+reason);
}
@Override
public void onError(Exception ex) {
ex.printStackTrace();
log.info("链接出错了"+ex.toString());
signResp.setHWPenSign(signType);
signResp.setMsgID(-1);
signResp.setMessage(ex.toString());
}
};
webSocketClient.connect(); // 连接到WebSocket服务器
}
while (true){
try {
runTime --;
Thread.sleep(1000);
} catch (InterruptedException e) {
}
if(signResp.getHWPenSign() != null && !signResp.getHWPenSign().equals("")){
runTime = 60;
return signResp;
}
if(runTime <= 0){
runTime = 60;
signResp.setHWPenSign(signType);
signResp.setMsgID(-1);
signResp.setMessage("链接签名板失败,操作超时");
return signResp;
}
}
}
public static void main(String[] args) {
URI uri = null;
try {
SignReq signReq = new SignReq();
signReq.setHWPenSign("HWGetDeviceStatus");
uri = new URI("ws://192.168.0.158:29999/");
WebSocketClient webSocketClient = new WebSocketClient(uri) {
@Override
public void onOpen(ServerHandshake handshakedata) {
System.out.println("新连接已打开");
}
@Override
public void onMessage(String message) {
System.out.println("接收到消息: "+message);
}
@Override
public void onClose(int code, String reason, boolean remote) {
System.out.println("连接已关闭,code="+code+",reason="+reason);
}
@Override
public void onError(Exception ex) {
ex.printStackTrace();
System.out.println("链接出错了"+ex.toString());
}
};
webSocketClient.connect(); // 连接到WebSocket服务器
webSocketClient.send(JSON.toJSONString(signReq));
} catch (URISyntaxException e) {
throw new RuntimeException(e);
}
}
}
package com.mortals.xhx.module.social.service;
import com.mortals.xhx.busiz.rsp.SignResp;
import com.mortals.xhx.busiz.rsp.SocialResp;
/**
* 高拍仪 业务接口
*
* @author: zxfei
* @date: 2024/1/2 9:58
*/
public interface SocialService {
SocialResp getSocial(String socialType);
}
package com.mortals.xhx.module.social.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.mortals.xhx.busiz.req.SignReq;
import com.mortals.xhx.busiz.req.SocialReq;
import com.mortals.xhx.busiz.rsp.SignResp;
import com.mortals.xhx.busiz.rsp.SocialResp;
import com.mortals.xhx.module.social.service.SocialService;
import lombok.extern.slf4j.Slf4j;
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.handshake.ServerHandshake;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.net.URI;
import java.net.URISyntaxException;
/**
* 社保卡实现类
*
* @author: zhou
* @date: 2024/7/8 10:00
*/
@Service
@Slf4j
public class SocialServiceImpl implements SocialService {
@Value("${config.socialUrl:ws://localhost:12342/}")
private String url;
static int runTime = 60; //60S超时返回
WebSocketClient webSocketClient = null;
SocialResp socialResp = null;
@Override
public SocialResp getSocial(String socialType) {
URI uri;
socialResp = new SocialResp();
socialResp.setMessage("");
//提交操作参数
SocialReq socialReq = new SocialReq();
socialReq.setFunction(socialType);
if(socialType.equals("iReadSFZ")){ //读身份证
socialReq.setPchPhotoAddr("/tmp/head.bmp");
}
if(socialType.equals("iReadCardBas_HSM_Step1")){ //社保卡识别类型 1接触卡 2非接触卡
socialReq.setIType("2");
}
try {
uri = new URI(url);
} catch (Exception e) {
throw new RuntimeException(e);
}
if(webSocketClient != null){
String msg = JSON.toJSONString(socialReq);
log.info("发送msg = " +msg);
webSocketClient.send(msg);
}else {
webSocketClient = new WebSocketClient(uri) {
@Override
public void onOpen(ServerHandshake handshakedata) {
String msg = JSON.toJSONString(socialReq);
log.info("新连接已打开:msg =" +msg);
send(msg);
}
@Override
public void onMessage(String message) {
log.info("接收到消息: {}",message);
if(message != null){
socialResp.setMessage(message);
}
}
@Override
public void onClose(int code, String reason, boolean remote) {
log.info("连接已关闭,code:{} reason:{} {}",code,reason,remote);
socialResp.setMessage("连接已关闭,code="+code+",reason="+reason);
}
@Override
public void onError(Exception ex) {
ex.printStackTrace();
log.info("链接出错了"+ex.toString());
socialResp.setMessage(ex.toString());
}
};
webSocketClient.connect(); // 连接到WebSocket服务器
}
while (true){
// log.info("runtime:{}",runTime);
try {
runTime --;
Thread.sleep(1000);
} catch (InterruptedException e) {
}
if(socialResp.getMessage() != null && !socialResp.getMessage().equals("")){
runTime = 60;
break;
}
if(runTime <= 0){
runTime = 60;
socialResp.setMessage("链接社保卡失败,操作超时");
break;
}
}
return socialResp;
}
}
package com.mortals.xhx.opencv;
import lombok.extern.slf4j.Slf4j;
import org.bytedeco.javacpp.Pointer;
import org.bytedeco.javacv.Java2DFrameUtils;
import org.bytedeco.opencv.opencv_core.Mat;
import org.bytedeco.opencv.opencv_core.MatVector;
import org.bytedeco.opencv.opencv_core.Rect;
import org.opencv.imgproc.Imgproc;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.util.ArrayList;
import java.util.List;
import static org.bytedeco.opencv.global.opencv_highgui.*;//包含了所有图形接口函数
import static org.bytedeco.opencv.global.opencv_imgcodecs.*;
import static org.bytedeco.opencv.global.opencv_imgproc.*; //COLOR_RGB2GRAY
@Slf4j
public class Demo {
public void test(){
String filePath = "F:\\opencv-demo\\1704165443969.jpg";
Mat sourceImage = imread(filePath); // 加载图像
/* Imgproc.cvtColor(sourceImage, gray, Imgproc.COLOR_BGR2GRAY);*/
Mat gray = new Mat();
BufferedImage bufferedImage = Java2DFrameUtils.toBufferedImage(sourceImage);
Mat mat = Java2DFrameUtils.toMat(bufferedImage);
// new OpenCVFrameConverter.ToMat()
cvtColor(sourceImage, gray, COLOR_BGR2GRAY); // 转换颜色从BGR到RGB
Mat binary = new Mat();
threshold(gray, binary, 0, 255, THRESH_BINARY | THRESH_OTSU);
Mat edges = new Mat();
Canny(binary, edges, 50, 150);
Mat hierarchy = new Mat();
MatVector matVector = new MatVector();
findContours(binary,matVector,hierarchy,RETR_TREE, CHAIN_APPROX_SIMPLE);
// 找出最大的轮廓(假设这是图片内容)
double maxArea = 0;
int maxContourIndex = 0;
for (int i = 0; i < matVector.size(); i++) {
double area = contourArea(matVector.get(i));
if (area > maxArea) {
maxArea = area;
maxContourIndex = i;
}
}
Rect rect = boundingRect(matVector.get(maxContourIndex));
Mat outImage = new Mat(sourceImage, rect);
imwrite("F:\\opencv-demo\\outimage.jpg", outImage);
// BufferedImage bufferedImage = matToBufferedImage(outImage);
// List<Pointer> contours = new ArrayList<>();
// Mat hierarchy = new Mat();
// findContours(binary, contours, hierarchy,RETR_TREE, CHAIN_APPROX_SIMPLE);
log.info("image rows:{}",sourceImage.rows());
// 转为灰度图像
/* imshow("1", image);// 原始图像
Mat gray = new Mat();
cvtColor(image, gray, COLOR_BGRA2GRAY); // 彩色图像转为灰度图像COLOR_RGB2GRAY
imshow("2", gray);// 灰度图像
Mat bin = new Mat();
threshold(gray, bin, 120, 255, THRESH_TOZERO); // 图像二值化
imshow("3", bin);// 二值图像
waitKey(0);*/
}
public static BufferedImage matToBufferedImage(Mat mat) {
byte[] data = new byte[mat.channels() * mat.cols() * mat.rows()];
//mat.get(0, 0, data); // 获取所有像素值
BufferedImage image = new BufferedImage(mat.cols(), mat.rows(), mat.channels() == 1 ? BufferedImage.TYPE_BYTE_GRAY : BufferedImage.TYPE_3BYTE_BGR);
final byte[] targetPixels = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();
System.arraycopy(data, 0, targetPixels, 0, data.length);
return image;
}
public static void main(String[] args) {
new Demo().test();
}
}
package com.mortals.xhx.opencv;
import org.apache.log4j.Logger;
import org.opencv.core.Mat;
import org.opencv.core.Scalar;
import org.opencv.imgcodecs.Imgcodecs;
import java.io.File;
/**
* @author ZYW
* @date 2024-01-02 10:30
*/
public class TakePhotoProcess extends Thread{
private String imgPath;
private Mat faceMat;
private final static Scalar color = new Scalar(0, 0, 255);
public TakePhotoProcess(String imgPath, Mat faceMat) {
this.imgPath = imgPath;
this.faceMat = faceMat;
File file = new File(imgPath);
if(!file.exists()){
file.mkdir();
}
}
public void run() {
try {
long currentTime = System.currentTimeMillis();
StringBuffer samplePath = new StringBuffer();
samplePath.append(imgPath).append(currentTime).append(".jpg");
Imgcodecs.imwrite(samplePath.toString(), faceMat);
System.out.println(">>>>>>write image into->" + samplePath.toString());
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
package com.mortals.xhx.opencv.UI;
import com.mortals.xhx.opencv.utils.OpencvHelper;
import lombok.extern.slf4j.Slf4j;
import org.bytedeco.opencv.opencv_core.Mat;
import org.bytedeco.opencv.opencv_core.Rect;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.Base64;
/**
* @author ZYW
* @date 2024-01-02 10:26
*/
@Slf4j
public class CapturePanel extends JPanel {
private ImageIcon imageIcon;
/**
* base64图像解码成字节流
* @param base64Image
*/
public void decodeToImage(String base64Image) throws IOException {
// 解码Base64字符串
byte[] imageBytes = Base64.getDecoder().decode(base64Image);
// 创建字节数组输入流
ByteArrayInputStream bis = new ByteArrayInputStream(imageBytes);
// 通过ImageIO读取图像
BufferedImage bufferedImage = ImageIO.read(bis);
imageIcon = new ImageIcon(bufferedImage);
// 关闭输入流
bis.close();
this.repaint();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (imageIcon != null) {
imageIcon.paintIcon(this, g, 0, 0);
}
}
}
This diff is collapsed.
package com.mortals.xhx.opencv.UI;
import com.mortals.xhx.opencv.utils.ImageUtil;
import com.mortals.xhx.opencv.utils.ResourcesUtil;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
/**
* @author ZYW
* @date 2024-01-02 15:31
*/
public class MyImageLabel extends JLabel {
private ImageIcon image;
private ImageIcon delImage = ImageUtil.getImage("img/delpic.png");
public MyImageLabel(ImageIcon image) {
this.image = image;
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
// 在标签上绘制图片
g2d.drawImage(image.getImage(), 0, 0, this);
// 在图片上绘制热门标签图片(假设你已经知道热门标签图片的大小和位置)
g2d.drawImage(delImage.getImage(), image.getIconWidth() - delImage.getIconWidth(), 0, this); // xPos和yPos是热门标签图片的位置坐标
}
}
This diff is collapsed.
This diff is collapsed.
package com.mortals.xhx.opencv.utils;
import java.io.File;
/**
* @author ZYW
* @date 2023-12-27 11:02
*/
public class ResourcesUtil {
public static final String resourcesPath = ResourcesUtil.class.getResource("/").getPath() + File.separator;
}
This diff is collapsed.
...@@ -40,7 +40,6 @@ config: ...@@ -40,7 +40,6 @@ config:
captureUrl: ws://127.0.0.1:1818/ #高拍仪websocket地址 captureUrl: ws://127.0.0.1:1818/ #高拍仪websocket地址
siteconfig: siteconfig:
filepath: @profiles.siteconfig.filepath@
url: @profiles.siteconfig.url@ url: @profiles.siteconfig.url@
configpath: @profiles.siteconfig.configpath@ configpath: @profiles.siteconfig.configpath@
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment