This topic describes how to use Content Moderation SDK for Java to call the optical character recognition (OCR) operation to detect text in images,and return the results in real time.

Before you begin

Before you call operations, make the following preparations:
  • Create an AccessKey pair for your Alibaba Cloud account. For more information, see Create an AccessKey pair.
  • Install Java dependencies. For more information, see Installation.
  • Optional:Download and import the Extension.Uploader utility class into your project if you submit an on-premises image or a binary image stream for image moderation.

Submit synchronous OCR tasks

Operation Description Supported region
ImageSyncScanRequest Sends synchronous OCR requests to detect text in images after you set the scenes parameter to ocr.
  • cn-shanghai
  • cn-beijing
  • cn-shenzhen
  • ap-southeast-1
  • ap-southeast-5
Sample code
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.green.model.v20180509.ImageSyncScanRequest;
import com.aliyuncs.http.FormatType;
import com.aliyuncs.http.HttpResponse;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.http.ProtocolType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;

import java.util.*;

public class Main {

    public static void main(String[] args) throws Exception {
        IClientProfile profile = DefaultProfile
            .getProfile("cn-shanghai", "yourAccessKeyId", "yourAccessKeySecret");
        DefaultProfile
            .addEndpoint("cn-shanghai", "Green", "green.cn-shanghai.aliyuncs.com");
        IAcsClient client = new DefaultAcsClient(profile);

        ImageSyncScanRequest imageSyncScanRequest = new ImageSyncScanRequest();
        // Specify the response format of the operation.
        imageSyncScanRequest.setAcceptFormat(FormatType.JSON);
        // Specify the request method.
        imageSyncScanRequest.setMethod(MethodType.POST);
        imageSyncScanRequest.setEncoding("utf-8");
        // Both HTTP and HTTPS are supported.
        imageSyncScanRequest.setProtocol(ProtocolType.HTTP);

        JSONObject httpBody = new JSONObject();
        /**
         * Specify the moderation scenario.
          * The value ocr of the scenes parameter indicates that the server uses OCR to detect text in images.
          */
        httpBody.put("scenes", Arrays.asList("ocr"));

        /**
         * Create one task for each image to be moderated.
         * If you moderate multiple images in a request, the total response time that the server spends processing the request starts from when the request is initiated to when the last image is moderated.
         * Generally, the average response time of moderating multiple images in a request is longer than that of moderating a single image. The more images you submit at a time, the higher the probability that the average response time will be extended.
         * In this example, a single image is moderated. If you need to moderate multiple images at a time, create one task for each image to be moderated.
         */
        JSONObject task = new JSONObject();
        task.put("dataId", UUID.randomUUID().toString());

        // Specify the image URL.
        task.put("url", "https://xxx.jpg");
        httpBody.put("tasks", Arrays.asList(task));

        imageSyncScanRequest.setHttpContent(org.apache.commons.codec.binary.StringUtils.getBytesUtf8(httpBody.toJSONString()), "UTF-8", FormatType.JSON);
        /**
         * Specify the connection timeout and read timeout. The timeout period for the server to complete an image moderation request is 10s. Specify the timeout based on this period.
          * If you set the read timeout to a period shorter than 10s, the server is prone to generate a read timeout error during request processing.
          */
        imageSyncScanRequest.setConnectTimeout(3000);
        imageSyncScanRequest.setReadTimeout(10000);
        HttpResponse httpResponse = null;
        try {
            httpResponse = client.doAction(imageSyncScanRequest);
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            e.printStackTrace();
        } catch (Exception e){
            e.printStackTrace();
        }

        // The results that are returned after the server receives and processes your request.
        if(httpResponse ! = null && httpResponse.isSuccess()){
            JSONObject scrResponse = JSON.parseObject(org.apache.commons.codec.binary.StringUtils.newStringUtf8(httpResponse.getHttpContent()));
            System.out.println(JSON.toJSONString(scrResponse));
            int requestCode = scrResponse.getIntValue("code");
            // The moderation results of each image.
            JSONArray taskResults = scrResponse.getJSONArray("data");
            if (200 == requestCode) {
                for (Object taskResult : taskResults) {
                    // The moderation results of a single image.
                    int taskCode = ((JSONObject)taskResult).getIntValue("code");
                    // The moderation results of the image in the corresponding moderation scenario. If you specified multiple moderation scenarios in the request, the moderation result of the image in each scenario is returned.
                    JSONArray sceneResults = ((JSONObject)taskResult).getJSONArray("results");
                    if(200 == taskCode){
                        for (Object sceneResult : sceneResults) {
                            String scene = ((JSONObject)sceneResult).getString("scene");
                            String suggestion = ((JSONObject)sceneResult).getString("suggestion");
                            //do something
                            // The text in the moderated image.
                            if("review" .equals(suggestion) && "ocr".equals(scene)){
                                JSONObject idCardInfo =  ((JSONObject) sceneResult).getJSONObject("idCardInfo");
                                System.out.println(idCardInfo.toJSONString());
                            }
                        }
                    }else{
                        // A single image failed to be moderated. Analyze the failure based on the actual situation.
                        System.out.println("task process fail. task response:" + JSON.toJSONString(taskResult));
                     }
                }
            } else {
                /**
                 * Your whole request failed to be processed. Analyze the failure based on the actual situation.
                  */
                System.out.println("the whole image scan request failed. response:" + JSON.toJSONString(scrResponse));
             }
        }
    }
}