在物流和电商行业快速发展的今天,快递单信息的自动化处理成为提升效率的关键环节。传统人工录入方式效率低下且容易出错,而OCR(光学字符识别)技术的应用为这一问题提供了完美的解决方案。本文将详细介绍如何使用百度OCR API实现快递单信息的智能识别与关键信息提取,涵盖从基础调用到高级信息提取的全过程。
百度OCR API是百度AI开放平台提供的强大文字识别服务,支持多种场景下的文字识别需求。其特点包括:
百度OCR提供两种主要的文字识别接口:
特性 | 标准版 | 高精度版 |
|---|---|---|
识别精度 | 较高 | 极高 |
支持语言 | 13种 | 28种 |
图像大小限制 | 8M/4096px | 10M/8192px |
生僻字识别 | 一般 | 优秀 |
处理速度 | 较快 | 稍慢 |
适用场景 | 常规文字识别 | 高精度需求场景 |
在使用百度OCR API前,需要完成以下准备:
Access Token是调用百度OCR API的凭证,有效期为30天。以下是Java实现代码:
public class BaiduOcrUtil {
private static final String ACCESS_TOKEN_URL = "https://aip.baidubce.com/oauth/2.0/token";
private static final String API_KEY = "your_api_key";
private static final String SECRET_KEY = "your_secret_key";
public static String getAccessToken() throws IOException {
String url = ACCESS_TOKEN_URL + "?grant_type=client_credentials" +
"&client_id=" + API_KEY +
"&client_secret=" + SECRET_KEY;
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
connection.setRequestMethod("GET");
StringBuilder response = new StringBuilder();
try (BufferedReader in = new BufferedReader(
new InputStreamReader(connection.getInputStream()))) {
String line;
while ((line = in.readLine()) != null) {
response.append(line);
}
}
// 解析JSON获取access_token
JSONObject json = new JSONObject(response.toString());
return json.getString("access_token");
}
}以下是使用标准版API识别图片中文字的完整Java实现:
public class GeneralOcrDemo {
private static final String OCR_API_URL = "https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic";
public static String recognizeText(String accessToken, String imagePath) throws IOException {
// 将图片转换为Base64
String imageBase64 = imageToBase64(imagePath);
// 构建请求参数
String params = "image=" + URLEncoder.encode(imageBase64, "UTF-8") +
"&language_type=CHN_ENG";
// 创建HTTP连接
HttpURLConnection connection = (HttpURLConnection)
new URL(OCR_API_URL + "?access_token=" + accessToken).openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setDoOutput(true);
// 发送请求
try (DataOutputStream out = new DataOutputStream(connection.getOutputStream())) {
out.writeBytes(params);
}
// 读取响应
StringBuilder response = new StringBuilder();
try (BufferedReader in = new BufferedReader(
new InputStreamReader(connection.getInputStream()))) {
String line;
while ((line = in.readLine()) != null) {
response.append(line);
}
}
return response.toString();
}
private static String imageToBase64(String imagePath) throws IOException {
byte[] fileContent = Files.readAllBytes(Paths.get(imagePath));
return Base64.getEncoder().encodeToString(fileContent);
}
}对于快递单等需要高精度识别的场景,建议使用高精度版API:
public class AccurateOcrDemo {
private static final String ACCURATE_OCR_URL = "https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic";
public static String recognizeTextAccurate(String accessToken, String imagePath) throws IOException {
String imageBase64 = imageToBase64(imagePath);
String params = "image=" + URLEncoder.encode(imageBase64, "UTF-8") +
"&language_type=auto_detect" +
"&detect_direction=true" +
"¶graph=true";
HttpURLConnection connection = (HttpURLConnection)
new URL(ACCURATE_OCR_URL + "?access_token=" + accessToken).openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setDoOutput(true);
try (DataOutputStream out = new DataOutputStream(connection.getOutputStream())) {
out.writeBytes(params);
}
StringBuilder response = new StringBuilder();
try (BufferedReader in = new BufferedReader(
new InputStreamReader(connection.getInputStream()))) {
String line;
while ((line = in.readLine()) != null) {
response.append(line);
}
}
return response.toString();
}
}快递单中的关键信息主要包括:
针对这些信息,我们可以采用以下提取策略:
public class ExpressInfoExtractor {
/
* 精确提取快递单号
*/
public static String extractExpressNumber(String ocrResult) {
try {
JSONObject json = new JSONObject(ocrResult);
JSONArray wordsResult = json.getJSONArray("words_result");
// 快递单号可能的关键字前缀
String[] keywords = {"快递单号", "运单号", "单号"};
for (int i = 0; i < wordsResult.length(); i++) {
JSONObject item = wordsResult.getJSONObject(i);
String text = item.getString("words");
for (String keyword : keywords) {
if (text.contains(keyword)) {
// 提取可能的分隔符后的内容
String[] parts = text.split(keyword + "[::\\s]+");
if (parts.length > 1) {
// 进一步清洗提取结果
String number = parts[1].trim()
.replaceAll("[^A-Za-z0-9]", "")
.replaceAll("\\s", "");
if (number.length() >= 10) { // 假设快递单号至少10位
return number;
}
}
}
}
}
return null;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}public class PhoneNumberExtractor {
/
* 精确提取收货人手机号
*/
public static String extractReceiverPhone(String ocrResult) {
try {
JSONObject json = new JSONObject(ocrResult);
JSONArray wordsResult = json.getJSONArray("words_result");
// 手机号可能的关键字前缀
String[] keywords = {"收货人手机", "收件人电话", "联系电话"};
for (int i = 0; i < wordsResult.length(); i++) {
JSONObject item = wordsResult.getJSONObject(i);
String text = item.getString("words");
for (String keyword : keywords) {
if (text.contains(keyword)) {
// 使用正则提取11位手机号
Pattern pattern = Pattern.compile(keyword + "[::\\s]+(1[3-9]\\d{9})");
Matcher matcher = pattern.matcher(text);
if (matcher.find()) {
return matcher.group(1);
}
}
}
}
return null;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}下面是一个完整的快递单信息处理示例:
public class ExpressBillProcessor {
public static void main(String[] args) {
try {
// 1. 获取Access Token
String accessToken = BaiduOcrUtil.getAccessToken();
// 2. 识别快递单图片
String imagePath = "express_bill.jpg";
String ocrResult = AccurateOcrDemo.recognizeTextAccurate(accessToken, imagePath);
// 3. 提取关键信息
String expressNumber = ExpressInfoExtractor.extractExpressNumber(ocrResult);
String phoneNumber = PhoneNumberExtractor.extractReceiverPhone(ocrResult);
// 4. 输出结果
System.out.println("快递单号: " + expressNumber);
System.out.println("收货人手机: " + phoneNumber);
// 5. 可进一步处理:存储到数据库或生成电子面单等
saveToDatabase(expressNumber, phoneNumber);
} catch (Exception e) {
e.printStackTrace();
}
}
private static void saveToDatabase(String expressNumber, String phoneNumber) {
// 实现数据库存储逻辑
}
}本文详细介绍了利用百度OCR API实现快递单信息智能识别的完整流程,从基础的API调用到关键信息的精确提取。通过合理的关键字定位和正则表达式匹配,我们可以高效准确地从OCR结果中提取出快递单号和手机号等关键信息。
在实际应用中,建议:
随着AI技术的不断发展,OCR在物流行业的应用将更加广泛和深入,为企业降本增效提供强大支持。