java 身份证智能识别

准备工作:
1.现在百度云上注册一个账号,创建一个图片识别的应用,大概有50000次免费使用,短期使用是没有问题的。
2.创建应用后,可以下载jar包在这里插入图片描述
和查看说明文档。
3.实现代码

代码如下

1.身份证实体类

package com.res.pc.idcard;

public class IDCard {
private String name;//姓名
private String cardNo;//身份证
private String sex;//性别
private String birthday;//生日
private String effect;//有效期
private String address;//住址
private String nation;//民族
private String visa;//签发机关
public String getVisa() {
return visa;
}
public void setVisa(String visa) {
this.visa = visa;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCardNo() {
return cardNo;
}
public void setCardNo(String cardNo) {
this.cardNo = cardNo;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
public String getEffect() {
return effect;
}
public void setEffect(String effect) {
this.effect = effect;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getNation() {
return nation;
}
public void setNation(String nation) {
this.nation = nation;
}

}

2.身份证正反面识别解析

package com.res.pc.idcard;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import org.json.JSONObject;
import com.baidu.aip.ocr.AipOcr;
import com.res.pc.util.IdCardUtils;

public class ParseIDCard {
//设置APPID/AK/SK
public static final String APP_ID = “APP_ID”;
public static final String API_KEY = “API_KEY”;
public static final String SECRET_KEY = “API_KEY”;
public static final String proxy_host = “aip.baidubce.com”;
//识别身份证正面信息
public static IDCard parseIDCardBefore(String path){
// 初始化一个AipOcr
AipOcr client = new AipOcr(APP_ID, API_KEY, SECRET_KEY);
IDCard idc = new IDCard();
// 可选:设置网络连接参数
client.setConnectionTimeoutInMillis(2000);
client.setSocketTimeoutInMillis(60000);
//System.setProperty(“aip.log4j.conf”, “path/to/your/log4j.properties”);
JSONObject res2 = client.basicGeneral(path, new HashMap<String, String>());
System.out.println("======================="+res2);
//System.out.println(res.toString(2));
//String str = res.get(“words_result”);
org.json.JSONArray res = (org.json.JSONArray) res2.get(“words_result”);
if(res.length()>0){
String address = “”;
for(int key=0;key<res.length();key++){
JSONObject object = (JSONObject) res.get(key);
String value = object.getString(“words”);
if(value.startsWith(“姓名”)){
idc.setName(value.substring(2, value.length()));
res.remove(key);
}else if(value.startsWith(“姓”)||value.startsWith(“名”)){
idc.setName(value.substring(1, value.length()));
res.remove(key);
}

        if(value.startsWith("出生")){
        	idc.setBirthday(value.substring(2, value.length()));
        	res.remove(key);
        }else if(value.startsWith("出")||value.startsWith("生")){
        	idc.setBirthday(value.substring(1, value.length()));
        	res.remove(key);
        }
        if(value.startsWith("民族")){
        	idc.setNation(value.substring(2, value.length()));
        	res.remove(key);
        }else if(value.indexOf("民族")>0){
        	idc.setNation(value.substring(value.indexOf("族"), value.length()));
        	res.remove(key);
        }else if(value.startsWith("民")||value.startsWith("族")){
        	idc.setNation(value.substring(1, value.length()));
        	res.remove(key);
        }
        if(value.startsWith("性别")){
        	if("男".equals(value.substring(2, 3))||"女".equals(value.substring(2, 3))){
        		idc.setSex(value.substring(2, 3));
        		res.remove(key);
        	}
        }else if(value.startsWith("性")||value.startsWith("别")){
        	if("男".equals(value.substring(1, 2))||"女".equals(value.substring(1, 2))){
        		idc.setSex(value.substring(1, 2));
        		res.remove(key);
        	}
        }
        if(value.startsWith("公民身份号码")){
        	idc.setCardNo(value.substring(6, value.length()));
        	res.remove(key);
        }else if(value.startsWith("公民身份号")||value.startsWith("民身份号码")){
        	idc.setCardNo(value.substring(5, value.length()));
        	res.remove(key);
        	
        }else if(value.startsWith("公民身份")||value.startsWith("身份号码")){
        	idc.setCardNo(value.substring(4, value.length()));
        	res.remove(key);
        }
        if(value.trim().startsWith("住址")){
        	address = address+value.substring(2, value.length());
        }else if(value.trim().startsWith("址")){
        	address = address+value.substring(1, value.length());
        }else if(value.trim().startsWith("住")){
        	address = address+value.substring(1, value.length());
        }
        //address= address +value;
        idc.setAddress(address);
    }
}
    net.sf.json.JSONObject object = net.sf.json.JSONObject.fromObject(idc);
    System.out.println(object.toString());
    return idc;
}
//识别身份证反面信息
public static IDCard parseIDCardAfter(String path){
	// 初始化一个AipOcr
    AipOcr client = new AipOcr(APP_ID, API_KEY, SECRET_KEY);
    IDCard idc = new IDCard();
    // 可选:设置网络连接参数
    //client.setConnectionTimeoutInMillis(2000);
    //client.setSocketTimeoutInMillis(60000);
    //System.setProperty("aip.log4j.conf", "path/to/your/log4j.properties");
    JSONObject res2 = client.basicGeneral(path, new HashMap<String, String>());
    org.json.JSONArray res = (org.json.JSONArray) res2.get("words_result");
    if(res.length()>0){
    for(int key=0;key<res.length();key++){
   	 JSONObject object = (JSONObject) res.get(key);
   	 String value = object.getString("words");
    if(value.startsWith("有效期限")){
    	value = value.replace(".", "");
    	idc.setEffect(value.substring(value.length()-8,value.length()));
    }
    }
    }
    System.out.println(idc.getEffect());
    return idc;
}

/**
 * 
 * 身份证认证 1:身份证有效期  2.姓名与填写内容是否相符 3.身份证号码是否符合规则
 * @param path
 * @return
 */
public static boolean checkIDcard(String beforePath,String AfterPath,String userName){
	boolean flag = true;
	IDCard idc = parseIDCardBefore(beforePath);
	if(userName == null || idc.getCardNo() == null){
		return  false;
	}
	if(!idc.getName().equals(userName)){
		return false;
	}
	if(!IdCardUtils.validateCard(idc.getCardNo())){
		return false;
	}
	Date  nowDate = new Date();
	SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");
	try {
		if(parseIDCardAfter(AfterPath).getEffect() == null){
			return false;
		}else{
		Date checkDate = formatter.parse(parseIDCardAfter(AfterPath).getEffect());
		if(nowDate.after(checkDate)){
			return false;
		}
		}
	} catch (ParseException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	return flag;
}

//测试
public static void main(String[] args) {
String beforePath = “d:/test1.jpg”;
//String afterPath = “d:/test2.jpg”;
//parseLicence(yyzz);
parseIDCardBefore(beforPath);
//parseIDCardAfter(afterPath);
//boolean flag = checkIDcard(beforPath,afterPath,“姓名”);
//System.out.println(flag);
}
}
至此,代码结束,有什么问题可以加QQ:463653370

猜你喜欢

转载自blog.csdn.net/liswing86/article/details/84580686
今日推荐