diff --git a/pom.xml b/pom.xml index 40a84c2..6568b2e 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ vip.jcfd HuaGoScanner-SDK - 1.0.2 + 1.0.3 jar @@ -102,48 +102,6 @@ 11 - - - - org.apache.maven.plugins - maven-gpg-plugin - 3.1.0 - - - sign-artifacts - verify - - sign - - - - - - ${env.GPG_PASSPHRASE} - - gpg - - true - - - --pinentry-mode - loopback - - - - - - - org.sonatype.central - central-publishing-maven-plugin - 0.9.0 - true - - central - - true - - @@ -153,6 +111,47 @@ release + + + org.apache.maven.plugins + maven-gpg-plugin + 3.1.0 + + + sign-artifacts + verify + + sign + + + + + + ${env.GPG_PASSPHRASE} + + gpg + + true + + + --pinentry-mode + loopback + + + + + + + org.sonatype.central + central-publishing-maven-plugin + 0.9.0 + true + + central + + true + + org.apache.maven.plugins diff --git a/src/main/java/vip/jcfd/sdk/HGScannerLib.java b/src/main/java/vip/jcfd/sdk/HGScannerLib.java index 6ae0861..cdd4a90 100644 --- a/src/main/java/vip/jcfd/sdk/HGScannerLib.java +++ b/src/main/java/vip/jcfd/sdk/HGScannerLib.java @@ -196,7 +196,18 @@ public interface HGScannerLib extends HGDef, StdCallLibrary { // 使用联合体需要在JNA中特殊处理 @Structure.FieldOrder({"option", "type", "intValue", "enumValue", "doubleValue", "boolValue", "rangeType", "unionData"}) class HGLibDeviceParam extends Structure { + public HGLibDeviceParam(Pointer paramPtr) { + super(paramPtr); + } + public static class ByValue extends HGLibDeviceParam implements Structure.ByValue { + + public ByValue(Pointer paramPtr) { + super(paramPtr); + } + + public ByValue() { + } } public int option; // 配置名, 参见HGLIB_OPTION_NAME_* @@ -226,6 +237,10 @@ public interface HGScannerLib extends HGDef, StdCallLibrary { public HGLibDeviceParamGroup() { } + public HGLibDeviceParamGroup(Pointer groupPtr) { + super(groupPtr); + } + @Override protected List getFieldOrder() { return Arrays.asList("group", "param", "paramCount"); diff --git a/src/main/java/vip/jcfd/sdk/HGScannerWrapper.java b/src/main/java/vip/jcfd/sdk/HGScannerWrapper.java index b19802f..5aa5374 100644 --- a/src/main/java/vip/jcfd/sdk/HGScannerWrapper.java +++ b/src/main/java/vip/jcfd/sdk/HGScannerWrapper.java @@ -4,6 +4,7 @@ import com.sun.jna.Memory; import com.sun.jna.Native; import com.sun.jna.NativeLibrary; import com.sun.jna.Pointer; +import com.sun.jna.ptr.IntByReference; import java.nio.charset.StandardCharsets; import java.util.ArrayList; @@ -378,6 +379,320 @@ public class HGScannerWrapper { return scannerLib.HGLib_ReleaseOcrText(ocrText); } + /** + * 获取设备参数 + * + * @param device 设备句柄 + * @param option 配置名,参考HGLIB_OPTION_NAME_* + * @return 设备参数结构体,失败时返回null + */ + public static HGScannerLib.HGLibDeviceParam getDeviceParam(HGScannerLib.HGLibDevice device, int option) { + Pointer paramPtr = scannerLib.HGLib_GetDeviceParam(device, option); + if (paramPtr == null || paramPtr.equals(Pointer.NULL)) { + return null; + } + + HGScannerLib.HGLibDeviceParam param = new HGScannerLib.HGLibDeviceParam.ByValue(paramPtr); + param.read(); + scannerLib.HGLib_ReleaseDeviceParam(paramPtr); + return param; + } + + /** + * 获取设备参数值(整数类型) + * + * @param device 设备句柄 + * @param option 配置名,参考HGLIB_OPTION_NAME_* + * @return 参数值,失败时返回0 + */ + public static int getIntDeviceParam(HGScannerLib.HGLibDevice device, int option) { + HGScannerLib.HGLibDeviceParam param = getDeviceParam(device, option); + if (param == null || param.type != HGScannerConstants.HGLIB_OPTION_VALUETYPE_INT) { + return 0; + } + return param.intValue; + } + + /** + * 获取设备参数值(枚举类型) + * + * @param device 设备句柄 + * @param option 配置名,参考HGLIB_OPTION_NAME_* + * @return 参数值,失败时返回0 + */ + public static int getEnumDeviceParam(HGScannerLib.HGLibDevice device, int option) { + HGScannerLib.HGLibDeviceParam param = getDeviceParam(device, option); + if (param == null || param.type != HGScannerConstants.HGLIB_OPTION_VALUETYPE_ENUM) { + return 0; + } + return param.enumValue; + } + + /** + * 获取设备参数值(双精度类型) + * + * @param device 设备句柄 + * @param option 配置名,参考HGLIB_OPTION_NAME_* + * @return 参数值,失败时返回0.0 + */ + public static double getDoubleDeviceParam(HGScannerLib.HGLibDevice device, int option) { + HGScannerLib.HGLibDeviceParam param = getDeviceParam(device, option); + if (param == null || param.type != HGScannerConstants.HGLIB_OPTION_VALUETYPE_DOUBLE) { + return 0.0; + } + return param.doubleValue; + } + + /** + * 获取设备参数值(布尔类型) + * + * @param device 设备句柄 + * @param option 配置名,参考HGLIB_OPTION_NAME_* + * @return 参数值,失败时返回false + */ + public static boolean getBoolDeviceParam(HGScannerLib.HGLibDevice device, int option) { + HGScannerLib.HGLibDeviceParam param = getDeviceParam(device, option); + if (param == null || param.type != HGScannerConstants.HGLIB_OPTION_VALUETYPE_BOOL) { + return false; + } + return param.boolValue != 0; + } + + /** + * 获取设备参数组列表 + * + * @param device 设备句柄 + * @return 参数组列表,失败时返回空列表 + */ + public static List getDeviceParamGroupList(HGScannerLib.HGLibDevice device) { + IntByReference countRef = new IntByReference(); + Pointer paramGroupPtr = scannerLib.HGLib_GetDeviceParamGroupList(device, countRef); + + if (paramGroupPtr == null || paramGroupPtr.equals(Pointer.NULL) || countRef.getValue() <= 0) { + return new ArrayList<>(); + } + + List paramGroups = new ArrayList<>(); + try { + for (int i = 0; i < countRef.getValue(); i++) { + Pointer groupPtr = paramGroupPtr.getPointer((long) i * Native.POINTER_SIZE); + HGScannerLib.HGLibDeviceParamGroup paramGroup = new HGScannerLib.HGLibDeviceParamGroup(groupPtr); + paramGroup.read(); + paramGroups.add(paramGroup); + } + } finally { + scannerLib.HGLib_ReleaseDeviceParamGroupList(paramGroupPtr, countRef.getValue()); + } + + return paramGroups; + } + + /** + * 获取特定组的所有参数 + * + * @param device 设备句柄 + * @param group 组名,参考HGLIB_GROUP_NAME_* + * @return 参数列表,失败时返回空列表 + */ + public static List getDeviceParamsByGroup(HGScannerLib.HGLibDevice device, int group) { + List paramGroups = getDeviceParamGroupList(device); + List params = new ArrayList<>(); + + for (HGScannerLib.HGLibDeviceParamGroup paramGroup : paramGroups) { + if (paramGroup.group == group) { + if (paramGroup.param != null && !paramGroup.param.equals(Pointer.NULL)) { + for (int i = 0; i < paramGroup.paramCount; i++) { + Pointer paramPtr = paramGroup.param.getPointer((long) i * Native.POINTER_SIZE); + HGScannerLib.HGLibDeviceParam param = new HGScannerLib.HGLibDeviceParam(paramPtr); + param.read(); + scannerLib.HGLib_ReleaseDeviceParam(paramPtr); + params.add(param); + } + } + break; + } + } + + return params; + } + + /** + * 重置设备参数为默认值 + * + * @param device 设备句柄 + * @return 是否重置成功 + */ + public static boolean resetDeviceParam(HGScannerLib.HGLibDevice device) { + return scannerLib.HGLib_ResetDeviceParam(device); + } + + /** + * 获取设备参数描述信息 + * + * @param option 配置名,参考HGLIB_OPTION_NAME_* + * @return 参数描述 + */ + public static String getDeviceParamDescription(int option) { + switch (option) { + case HGScannerConstants.HGLIB_OPTION_NAME_UNKNOWN: + return "未知"; + case HGScannerConstants.HGLIB_OPTION_NAME_DLSC: + return "多流输出"; + case HGScannerConstants.HGLIB_OPTION_NAME_DLSCLX: + return "多流输出类型"; + case HGScannerConstants.HGLIB_OPTION_NAME_YSMS: + return "颜色模式"; + case HGScannerConstants.HGLIB_OPTION_NAME_HBTXYZ: + return "黑白图像阈值"; + case HGScannerConstants.HGLIB_OPTION_NAME_HDHHBTX_CS: + return "灰度或黑白图像 - 除色"; + case HGScannerConstants.HGLIB_OPTION_NAME_24WCSTX_DLSCCH: + return "24位彩色图像 - 多流输出除红"; + case HGScannerConstants.HGLIB_OPTION_NAME_24WCSTX_DTKCH: + return "24位彩色图像 - 答题卡除红"; + case HGScannerConstants.HGLIB_OPTION_NAME_BJYC: + return "背景移除"; + case HGScannerConstants.HGLIB_OPTION_NAME_BJSCFDFW: + return "背景色彩浮动范围"; + case HGScannerConstants.HGLIB_OPTION_NAME_RHYMH: + return "锐化与模糊"; + case HGScannerConstants.HGLIB_OPTION_NAME_QCMW: + return "去除摩尔纹"; + case HGScannerConstants.HGLIB_OPTION_NAME_CWW: + return "除网纹"; + case HGScannerConstants.HGLIB_OPTION_NAME_CWKS: + return "错误扩散"; + case HGScannerConstants.HGLIB_OPTION_NAME_HBTXZDYH: + return "黑白图像噪点优化"; + case HGScannerConstants.HGLIB_OPTION_NAME_ZDYHCC: + return "噪点优化尺寸"; + case HGScannerConstants.HGLIB_OPTION_NAME_ZZCC: + return "纸张尺寸"; + case HGScannerConstants.HGLIB_OPTION_NAME_ZDYSMQY: + return "自定义扫描区域"; + case HGScannerConstants.HGLIB_OPTION_NAME_SMQYZCmm: + return "扫描区域左侧(mm)"; + case HGScannerConstants.HGLIB_OPTION_NAME_SMQYYCmm: + return "扫描区域右侧(mm)"; + case HGScannerConstants.HGLIB_OPTION_NAME_SMQYSCmm: + return "扫描区域上侧(mm)"; + case HGScannerConstants.HGLIB_OPTION_NAME_SMQYXCmm: + return "扫描区域下侧(mm)"; + case HGScannerConstants.HGLIB_OPTION_NAME_CCJC: + return "尺寸检测"; + case HGScannerConstants.HGLIB_OPTION_NAME_SMYM: + return "扫描页面"; + case HGScannerConstants.HGLIB_OPTION_NAME_TGKBYLMD: + return "跳过空白页灵敏度"; + case HGScannerConstants.HGLIB_OPTION_NAME_FZQD: + return "分纸强度"; + case HGScannerConstants.HGLIB_OPTION_NAME_XMSJ: + return "休眠时间"; + case HGScannerConstants.HGLIB_OPTION_NAME_FBL: + return "分辨率"; + case HGScannerConstants.HGLIB_OPTION_NAME_HZ: + return "画质"; + case HGScannerConstants.HGLIB_OPTION_NAME_JHZFM: + return "交换正反面"; + case HGScannerConstants.HGLIB_OPTION_NAME_TXCF: + return "图像拆分"; + case HGScannerConstants.HGLIB_OPTION_NAME_ZDJP: + return "自动纠偏"; + case HGScannerConstants.HGLIB_OPTION_NAME_QYSDQX: + return "启用色调曲线"; + case HGScannerConstants.HGLIB_OPTION_NAME_LDZ: + return "亮度值"; + case HGScannerConstants.HGLIB_OPTION_NAME_DBD: + return "对比度"; + case HGScannerConstants.HGLIB_OPTION_NAME_GMZ: + return "伽马值"; + case HGScannerConstants.HGLIB_OPTION_NAME_ZPMS: + return "照片模式"; + case HGScannerConstants.HGLIB_OPTION_NAME_XCHK: + return "消除黑框"; + case HGScannerConstants.HGLIB_OPTION_NAME_SSYZ: + return "深色样张"; + case HGScannerConstants.HGLIB_OPTION_NAME_YZ: + return "阈值"; + case HGScannerConstants.HGLIB_OPTION_NAME_BJKZDJ: + return "背景抗噪等级"; + case HGScannerConstants.HGLIB_OPTION_NAME_BYSJ: + return "边缘缩进"; + case HGScannerConstants.HGLIB_OPTION_NAME_BJTCFS: + return "背景填充方式"; + case HGScannerConstants.HGLIB_OPTION_NAME_FZST: + return "防止渗透"; + case HGScannerConstants.HGLIB_OPTION_NAME_FZSTDJ: + return "防止渗透等级"; + case HGScannerConstants.HGLIB_OPTION_NAME_CKYCZC: + return "穿孔移除—左侧"; + case HGScannerConstants.HGLIB_OPTION_NAME_ZCCKSSFWZFMBL: + return "左侧穿孔搜索范围占幅面比例"; + case HGScannerConstants.HGLIB_OPTION_NAME_CKYCYC: + return "穿孔移除—右侧"; + case HGScannerConstants.HGLIB_OPTION_NAME_YCCKSSFWZFMBL: + return "右侧穿孔搜索范围占幅面比例"; + case HGScannerConstants.HGLIB_OPTION_NAME_CKYCSC: + return "穿孔移除—上侧"; + case HGScannerConstants.HGLIB_OPTION_NAME_SCCKSSFWZFMBL: + return "上侧穿孔搜索范围占幅面比例"; + case HGScannerConstants.HGLIB_OPTION_NAME_CKYCXC: + return "穿孔移除—下侧"; + case HGScannerConstants.HGLIB_OPTION_NAME_XCCKSSFWZFMBL: + return "下侧穿孔搜索范围占幅面比例"; + case HGScannerConstants.HGLIB_OPTION_NAME_SCTC: + return "色彩填充"; + case HGScannerConstants.HGLIB_OPTION_NAME_CSBJC: + return "超声波检测"; + case HGScannerConstants.HGLIB_OPTION_NAME_SZTPCL: + return "双张图片处理"; + case HGScannerConstants.HGLIB_OPTION_NAME_ZDJC: + return "装订检测"; + case HGScannerConstants.HGLIB_OPTION_NAME_SMZS: + return "扫描张数"; + case HGScannerConstants.HGLIB_OPTION_NAME_SMSL: + return "扫描数量"; + case HGScannerConstants.HGLIB_OPTION_NAME_WGFX: + return "文稿方向"; + case HGScannerConstants.HGLIB_OPTION_NAME_BMXZ180: + return "背面旋转180°"; + case HGScannerConstants.HGLIB_OPTION_NAME_ZJJC: + return "折角检测"; + case HGScannerConstants.HGLIB_OPTION_NAME_ZJDX: + return "折角大小"; + case HGScannerConstants.HGLIB_OPTION_NAME_WXJC: + return "歪斜检测"; + case HGScannerConstants.HGLIB_OPTION_NAME_WXRRD: + return "歪斜容忍度"; + case HGScannerConstants.HGLIB_OPTION_NAME_ZDCZQD: + return "自动分纸强度"; + case HGScannerConstants.HGLIB_OPTION_NAME_CZYZ: + return "进纸失败率"; + case HGScannerConstants.HGLIB_OPTION_NAME_DZSM: + return "待纸扫描"; + case HGScannerConstants.HGLIB_OPTION_NAME_HBTXFSSC: + return "黑白图像反色输出"; + case HGScannerConstants.HGLIB_OPTION_NAME_DZSMTCSJ: + return "待纸扫描退出时间"; + case HGScannerConstants.HGLIB_OPTION_NAME_TGKBY: + return "跳过空白页"; + case HGScannerConstants.HGLIB_OPTION_NAME_JTZWJC: + return "镜头脏污检测"; + case HGScannerConstants.HGLIB_OPTION_NAME_CKYC: + return "穿孔移除"; + case HGScannerConstants.HGLIB_OPTION_NAME_CKSSFWZFMBL: + return "穿孔搜索范围占幅面比例"; + case HGScannerConstants.HGLIB_OPTION_NAME_BJJC: + return "边界检测"; + case HGScannerConstants.HGLIB_OPTION_NAME_SMCGQXHQD: + return "扫描传感器信号强度"; + case HGScannerConstants.HGLIB_OPTION_NAME_TGKBYBYKD: + return "跳过空白页边缘宽度"; + default: + return "未知参数"; + } + } + /** * 内存拷贝 *