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) {
}
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 = “
//識別身份證正面資訊
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