feat(scanner): 增加设备参数获取与管理功能

- 新增HGLibDeviceParam构造函数支持Pointer初始化
- 新增HGLibDeviceParamGroup构造函数支持Pointer初始化
- 新增getDeviceParam方法获取设备参数结构体- 新增getIntDeviceParam、getEnumDeviceParam等类型安全的参数获取方法
- 新增getDeviceParamGroupList方法获取参数组列表
- 新增getDeviceParamsByGroup方法获取指定组的参数列表
- 新增resetDeviceParam方法重置设备参数
- 新增getDeviceParamDescription方法获取参数描述信息
- 引入IntByReference类用于参数计数引用传递
- 调整Maven GPG插件和Central发布插件配置至release profile
- 升级项目版本号从1.0.2到1.0.3
This commit is contained in:
zkh
2025-11-14 00:28:12 +08:00
parent 9500557cc4
commit 40fd40caab
3 changed files with 372 additions and 43 deletions

85
pom.xml
View File

@ -7,7 +7,7 @@
<!-- 基本信息 -->
<groupId>vip.jcfd</groupId>
<artifactId>HuaGoScanner-SDK</artifactId>
<version>1.0.2</version>
<version>1.0.3</version>
<packaging>jar</packaging>
<!-- 项目信息 -->
@ -102,48 +102,6 @@
<target>11</target>
</configuration>
</plugin>
<!-- Maven GPG Plugin - 用于签名构件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<id>sign-artifacts</id>
<phase>verify</phase>
<goals>
<goal>sign</goal>
</goals>
</execution>
</executions>
<configuration>
<!-- 使用环境变量中的gpg密钥密码 -->
<passphrase>${env.GPG_PASSPHRASE}</passphrase>
<!-- 指定GPG可执行文件路径 -->
<executable>gpg</executable>
<!-- 使用默认密钥 -->
<useAgent>true</useAgent>
<!-- 设置gpg主目录 -->
<gpgArguments>
<arg>--pinentry-mode</arg>
<arg>loopback</arg>
</gpgArguments>
</configuration>
</plugin>
<!-- Central Publishing Plugin - 发布到Maven Central -->
<plugin>
<groupId>org.sonatype.central</groupId>
<artifactId>central-publishing-maven-plugin</artifactId>
<version>0.9.0</version>
<extensions>true</extensions>
<configuration>
<publishingServerId>central</publishingServerId>
<!-- 确保所有文件都被签名 -->
<autoPublish>true</autoPublish>
</configuration>
</plugin>
</plugins>
</build>
@ -153,6 +111,47 @@
<id>release</id>
<build>
<plugins>
<!-- Maven GPG Plugin - 用于签名构件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<id>sign-artifacts</id>
<phase>verify</phase>
<goals>
<goal>sign</goal>
</goals>
</execution>
</executions>
<configuration>
<!-- 使用环境变量中的gpg密钥密码 -->
<passphrase>${env.GPG_PASSPHRASE}</passphrase>
<!-- 指定GPG可执行文件路径 -->
<executable>gpg</executable>
<!-- 使用默认密钥 -->
<useAgent>true</useAgent>
<!-- 设置gpg主目录 -->
<gpgArguments>
<arg>--pinentry-mode</arg>
<arg>loopback</arg>
</gpgArguments>
</configuration>
</plugin>
<!-- Central Publishing Plugin - 发布到Maven Central -->
<plugin>
<groupId>org.sonatype.central</groupId>
<artifactId>central-publishing-maven-plugin</artifactId>
<version>0.9.0</version>
<extensions>true</extensions>
<configuration>
<publishingServerId>central</publishingServerId>
<!-- 确保所有文件都被签名 -->
<autoPublish>true</autoPublish>
</configuration>
</plugin>
<!-- 在发布时激活source和javadoc插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>

View File

@ -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<String> getFieldOrder() {
return Arrays.asList("group", "param", "paramCount");

View File

@ -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<HGScannerLib.HGLibDeviceParamGroup> 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<HGScannerLib.HGLibDeviceParamGroup> 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<HGScannerLib.HGLibDeviceParam> getDeviceParamsByGroup(HGScannerLib.HGLibDevice device, int group) {
List<HGScannerLib.HGLibDeviceParamGroup> paramGroups = getDeviceParamGroupList(device);
List<HGScannerLib.HGLibDeviceParam> 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 "未知参数";
}
}
/**
* 内存拷贝
*