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 "未知参数";
+ }
+ }
+
/**
* 内存拷贝
*