jacob调用精伦身份证读卡器

最近接手一个任务,在nc人力资源模块通过精伦的身份证读卡器获取人员信息;

查阅了网上的资料,尝试了多种方式,最后采取了以下这种=调用读卡器dll

第一步: 在工程中导入 jna.jar 这个包。 

 

 

 

 

第二步: 将相关dll放到系统目录,注意64位和32位有区别的

 

第三步: java代码

复制代码

package nc.itf.idrControl;
import com.sun.jna.*;

public class test {
    interface CLibrary extends Library { 
        CLibrary sdtapi = (CLibrary)Native.loadLibrary((Platform.isWindows() ? "sdtapi" : "c"),CLibrary.class);
        int InitComm(int port);
        int Authenticate();
        int ReadBaseInfosPhoto(byte[] Name,byte[] Gender,byte[] Folk,byte[] BirthDay,byte[] Code,byte[] Address,byte[] Agency,byte[] ExpireStart,byte[] ExpireEnd,String Dir);
    }
        
    public static void main(String[] args) throws Exception {
        byte sid[] = new byte[37];
        byte name[] = new byte[31];
        byte sex[] = new byte[3];
        byte folk[] = new byte[10];
        byte birth[] = new byte[9];
        byte code[] = new byte[19];
        byte add[] = new byte[71];
        byte agency[] = new byte[31];
        byte expirestart[] = new byte[9];
        byte expireend[] = new byte[9];
        //初始化端口
        if (CLibrary.sdtapi.InitComm(1001) == 1){
            //卡认证    
            int ret = CLibrary.sdtapi.Authenticate();
            if(ret == 1){
                //读取卡信息
                ret = CLibrary.sdtapi.ReadBaseInfosPhoto(name,sex,folk,birth,code,add,agency,expirestart,expireend,"D:\\Project\\20180105zhongnan\\nchome_bk\\shenfenzheng");
                if(ret == 1){                            
                    System.out.println(new String(name,"GBK"));
                    System.out.println(new String(sex));
                    System.out.println(new String(folk));
                    System.out.println(new String(birth));
                    System.out.println(new String(code));
                    System.out.println(new String(add));
                    System.out.println(new String(agency));
                    System.out.println(new String(expirestart));
                    System.out.println(new String(expireend));
                }
            }
        }else{
            System.out.println("读取失败!");
        }
    }
}

复制代码

 

第四步: 总结

  相关dll,与提供读卡器的厂商沟通,他们会提供dll和demo;当然没有的话,网上大多数也能找到,我的就是在CSDL花费了5个大洋下的.... 

 

 

后续:在提交到服务器上运行后,客户使用UClient登陆客户端访问功能时出现一个问题:

Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError:

Could not initialize class nc.ui.hi.psndoc.action.CardImportActionReadCard$CLibrary

at nc.ui.hi.psndoc.action.CardImportActionReadCard.getPsndocVO(CardImportActionReadCard.java:80)
at nc.ui.hi.psndoc.action.CardImportAction.getDefaultValue(CardImportAction.java:210)
at nc.ui.hi.psndoc.action.CardImportAction.doAction(CardImportAction.java:88)
at nc.ui.uif2.NCAction.actionPerformed(NCAction.java:85)
at nc.funcnode.ui.action.ActionDelegate.actionPerformed(ActionDelegate.java:296)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.AbstractButton.doClick(Unknown Source)
at nc.ui.plaf.basic.UIMenuItemUI.doClick(UIMenuItemUI.java:1191)
at nc.ui.plaf.basic.UIMenuItemUI$MouseInputHandler.mouseReleased(UIMenuItemUI.java:1016)
at java.awt.Component.processMouseEvent(Unknown Source)

多番测试找出原因是因为使用64位jdk运行客户端无法解析以上代码,在UClient设置为32位jdk运行;问题的具体原因没有进一步研究,猜测是该jna类库不支持64位jdk

 

 

========再次遇到了这类问题,原因是dll有32位与64位之分,即32位dll需要32jdk解析。如果是java调用,可以通过vs查询dll的版本:

 

 

 

=================  已经上传了demo(资源未审批通过。。。。。有需要的留言revin1220@sina.com吧)

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
### 回答1: Java通过Jacob可以轻松调用Bartender。Bartender是一款强大的条码标签打印软件,而Jacob是连接Java和Microsoft Office的一种技术。Java可以使用Jacob的API,通过COM接口来调用Bartender的应用程序程序接口(API)。这可以让Java应用程序使用Bartender的打印功能,从而生成和打印条形码标签。最常用的方法是使用Jacob的Dispatch类和Method类,来调用Bartender的API命令,从而实现打印功能。同时,Java和Bartender都支持自定义的脚本和代码,因此可以更加灵活地实现打印的业务逻辑。通过Java和Jacob的结合,实现了Bartender和其他应用程序的打印功能的集成,为工业、物流等领域的数据采集和信息管理提供了可靠的技术支持,使得企业的生产管理变得更加高效。 ### 回答2: Bartender是一个条码标签打印软件,而jacob是Java COM桥接,可以将Java程序与COM组件进行通信。使用jacob可以在Java程序中调用Bartender的COM 接口,进而实现打印条码标签等功能。 首先,需要下载jacob库并在Java工程中导入相关的jar包。然后,需要安装Bartender软件并通过其开放的COM接口。对于Bartender的COM接口,需要在Bartender的菜单栏中选择“文件”→“打印”→“COM打印对象设置”来打开COM设置窗口。在其中选择“启用COM对象”并保存。 接下来,在Java程序中实现调用Bartender的步骤如下: 1. 创建jacob的ActiveXComponent对象,指定Bartender的COM对象ID“Bartender.Application”。 2. 使用对象方法调用Bartender的COM接口,例如设置打印模板、设定数据源等。 3. 调用jacob的Variant对象,将参数传递给Bartender的COM接口。 4. 调用jacob的Dispatch.call方法传递方法名和参数,实现调用Bartender的COM接口。 示例代码如下: // 创建ActiveXComponent对象 ActiveXComponent bartender = new ActiveXComponent("Bartender.Application"); // 指定模板和数据源 bartender.invoke("Open", new Variant("标签模板")); bartender.invoke("SetNamedSubStringValue", new Variant("数据源名称"), new Variant("数据源值")); // 设定打印机 bartender.setProperty("Printer", new Variant("打印机名称")); // 执行打印 bartender.invoke("StartPrintJob"); bartender.invoke("PrintOut", new Variant(false)); bartender.invoke("CancelPrintJob"); 通过上述方法,我们可以使用Java程序调用Bartender的COM接口,在Java程序中实现打印标签等功能。需要注意的是,Bartender的COM接口需要有相应的权限才能被调用,因此需要确保用户的权限设置正确。同时,也需要按照Bartender的COM接口文档使用正确的方法和参数,才能成功调用Bartender的接口。 ### 回答3: Java 通过jacob调用Bartender是一个常见的需求,Bartender是一款非常流行的标签设计和打印软件。jacob是Java的COM桥接,它可以让Java程序通过COM接口调用Windows平台下的各种COM组件,比如Bartender。下面我们将详细介绍Java通过jacob调用Bartender的步骤。 首先我们需要下载jacob,并添加到Java工程的类路径中。接着我们需要在Java程序中编写Bartender调用的代码。在Java程序中,我们可以通过jacob来连接COM对象,后面的操作跟普通的Java操作一样,包括设置打印参数、调用打印方法等等。 下面是一个简单的Java代码示例,展示如何通过jacob调用Bartender: ```java public class BartenderService { private ComServer bartend; public BartenderService(String bartenderPath) { bartend = new ComServer(); if (bartend.init(bartenderPath)) { return; } throw new RuntimeException("failed init bartender"); } public void printLabel(String filePath, String labelName, Map<String,String> fieldValues) { bartend.call("Format.FileOpen", filePath, true, ""); bartend.call("Document.Open", labelName); for (Map.Entry<String,String> entry : fieldValues.entrySet()) { bartend.setProperty("Document.Variables(\"" + entry.getKey() + "\")", entry.getValue()); } bartend.setProperty("Document.PrinterSetup.PrinterName", "your-printer-name"); bartend.call("Document.PrintLabel", 1, 1); } } ``` 在这个代码示例中,我们定义了一个BartenderService类,它初始化时需要传入Bartender的安装路径。在打印标签时,我们会调用printLabel方法,传入标签文件路径、标签名称和打印参数。这个方法会打开文件、打开标签、设置打印参数和变量(即标签中的占位符),最后调用打印方法来完成打印操作。 总的来说,Java通过jacob调用Bartender是非常方便的,只需要简单地编写几十行代码,就可以实现标签的设计和打印。如果您在工作中有相关需求,建议尝试一下这个技术。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值