이 가이드에서는 Java를 사용하여 바이두 AI의 신분증 인식 API를 호출하여 이미지에서 정보를 추출하는 방법을 설명합니다.
1. 사전 준비
- 바이두 AI 계정 생성
- API Key 및 Secret Key 발급
2. 구현 단계
2.1. 프로젝트 설정
HTTP 통신을 위해 Hutool 라이브러리를 사용합니다. 다음 의존성을 Maven pom.xml 파일에 추가합니다.
<!-- OkHttp 의존성 -->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.12.0</version>
</dependency>
<!-- Hutool 의존성 -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.16</version>
</dependency>
2.2. Java 코드 작성
API Key와 Secret Key를 사용하여 인증 토큰을 발급받고, 신분증 이미지 파일을 Base64로 인코딩하여 API에 요청합니다. 추출된 정보는 JSON 형식으로 반환됩니다.
import cn.hutool.http.HttpRequest;
import com.alibaba.fastjson.JSONObject; // Hutool의 JSON 기능 사용 시 대체 가능
import java.io.IOException;
import java.net.URLEncoder;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
import org.junit.jupiter.api.Test; // JUnit 5 사용 예시
public class BaiduIdCardOcr {
// 발급받은 API Key와 Secret Key로 대체해야 합니다.
private static final String API_KEY = "YOUR_API_KEY";
private static final String SECRET_KEY = "YOUR_SECRET_KEY";
private static final String OAUTH_TOKEN_URL = "https://aip.baidubce.com/oauth/2.0/token";
private static final String ID_CARD_OCR_URL = "https://aip.baidubce.com/rest/2.0/ocr/v1/idcard";
/**
* API Key와 Secret Key를 사용하여 접근 토큰(Access Token)을 생성합니다.
*/
private String getAccessToken() throws IOException {
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("grant_type", "client_credentials");
paramMap.put("client_id", API_KEY);
paramMap.put("client_secret", SECRET_KEY);
String responseBody = HttpRequest.post(OAUTH_TOKEN_URL)
.header("Content-Type", "application/x-www-form-urlencoded")
.form(paramMap)
.execute()
.body();
// fastjson 또는 Hutool의 JSON 기능을 사용하여 파싱합니다.
JSONObject jsonResponse = JSONObject.parseObject(responseBody);
return jsonResponse.getString("access_token");
}
/**
* 지정된 경로의 파일을 Base64로 인코딩합니다.
* @param filePath 파일 경로
* @param urlEncode URL 인코딩 필요 여부 (application/x-www-form-urlencoded 사용 시 true)
* @return Base64 인코딩된 문자열 (파일 헤더 제외)
* @throws IOException 파일 읽기 오류 시 발생
*/
private String encodeFileToBase64(String filePath, boolean urlEncode) throws IOException {
byte[] fileBytes = Files.readAllBytes(Paths.get(filePath));
String base64Encoded = Base64.getEncoder().encodeToString(fileBytes);
if (urlEncode) {
return URLEncoder.encode(base64Encoded, "UTF-8");
}
return base64Encoded;
}
@Test
void extractIdCardInfo() throws IOException {
// 신분증 이미지 파일 경로를 지정합니다.
String imagePath = "C:/path/to/your/idcard.jpg";
// API 요청 헤더 설정
Map<String, String> headers = new HashMap<>();
headers.put("Content-Type", "application/x-www-form-urlencoded");
headers.put("Accept", "application/json");
// API 요청 본문 파라미터 설정
Map<String, Object> requestBody = new HashMap<>();
requestBody.put("id_card_side", "front"); // "front" 또는 "back"
requestBody.put("image", encodeFileToBase64(imagePath, false));
// 접근 토큰 발급
String accessToken = getAccessToken();
// 신분증 인식 API 호출
String response = HttpRequest.post(ID_CARD_OCR_URL + "?access_token=" + accessToken)
.addHeaders(headers)
.form(requestBody)
.execute()
.body();
// 응답 결과 출력 (Map으로 파싱)
Map<?, ?> resultMap = JSONObject.parseObject(response, Map.class);
System.out.println("신분증 인식 결과: " + resultMap);
}
}