CLOVA OCR Custom API
- Print
- PDF
CLOVA OCR Custom API
- Print
- PDF
Article Summary
Share feedback
Thanks for sharing your feedback!
version
Version | Date | Changes |
---|---|---|
v1.0.0 | 2019-12-05 | First written |
v1.0.1 | 2020-02-21 | Providing boundingPoly information in response to General API call |
v2.0.0 | 2020-03-26 | Multibox and checkbox recognition functions added by providing CLOVA OCR premium model Bounding/boundingPoly information is provided as recognition results according to requested version (V1/V2) Use of V2 is recommended, and the boundingPoly is provided with V2 |
v2.0.1 | 2021-01-21 | Provision of JSON line break information for General API Delete subFiled in ImageField object |
v2.0.2 | 2021-02-04 | Addition of the convertedImageInfo field within Recognition Results Object |
v2.0.3 | 2021-05-27 | Addition of the combineResult field and lineBreak api |
v2.0.4 | 2021-07-22 | Supporting zh-TW language |
v2.0.5 | 2021-09-16 | Addition of the table extraction feature |
v2.0.6 | 2023-02-23 | Addition of the multiple language selection feature |
Requests
Method | Request URI |
---|---|
POST | Calls to API Gateway's InvokeURL created from CLOVA OCR builder A unique call URL is generated for each domain |
- Text OCR recognition and Template OCR recognition request
Classification | Description | Path | Request | Response |
---|---|---|---|---|
TEXT OCR | Recognizes all text in an image without a defined template | /general | Follows the image recognition request format | Follows the image recognition result format matchedTemplate, title, and validationResult values are not transferred |
Template OCR | Recognizes images that include the template released to the domain | /infer | Follows the image recognition request format | Follows the image recognition result format |
Request headers
Header name | Description |
---|---|
X-OCR-SECRET | X-OCR-SECRET:{Client Secret} created when linking API Gateway in the domain |
Content-Type | application/json : request use json body. Support images.url or images.data encoded with base64. - multipart/form-data : request use multipart form body. Support image file transferred as stream. |
Request bodies
Content-Type : application/json
- Image recognition request
Classification | Json Model |
---|---|
Image recognition request | { "version": "string", "requestId": "string", "timestamp": 0, "lang": "string", "images": [{ "format": "string", "url": "string", "data": "string", "name": "string", "templateIds": [ 0 ] }], "enableTableDetection": true } |
Detailed descriptions of image recognition request fields
Field name | Required | Type | Description | Service limits |
---|---|---|---|---|
version | Yes | string | Version information required. Input either V1 or V2 Use of V2 is recommended, and the boundingPoly is provided with V2 | |
requestId | Yes | string | API call UUID | |
timestamp | Yes | 0 | API call Timestamp | |
lang | No | string | Language information to be requested for OCR recognition | Available language values to be set are "ko," "ja," and "zh-TW." If the lang field is not set, the language settings of the domain will be set as default. Multiple languages can be called with a comma. (Example: "ko,ja,zh-TW") |
images | Yes | string | Input as JSON arrays, and only 1 image can be accepted at the moment (Korean/Japanese) | GeneralOCR supports up to 50 MB, and Template OCR supports up to 20 MB (PDF, TIFF up to 50 MB) |
images.format | Yes | string | Setting image formats | "JPEG", "PNG", "PDF","TIFF" image formats are supported. General OCR: supports recognition of up to 10 pages of PDF file, Template OCR: supports up to 5 pages of PDF/TIFF file |
images.url | No | string | Either images.url or image.data must exist | The URL must be a public URL that can be imported from |
images.data | No | string | Either images.url or image.data must exist. (If both the URL and data exist, it uses data and ignores the URL.) | image.data is image bytes encoded in base64 |
images.name | Yes | string | Enter the image name It is used to identify the image, as well as for checking the response result | |
images.templateIds | No | json array | It is not used in text OCR API If this field is not set in the Template OCR API, then they will be automatically categorized into all service templates released to the domain | |
enableTableDetection | No | Boolean | Automatically recognizes the table in the document and provides it in a structured format with text. | Support limited to General OCR |
CURL example:
curl --request POST 'your apigw invoke url' \
--header 'X-OCR-SECRET: your secret key' \
--data-raw '{"images":[{"format":"jpg","name":"demo","url":"your image url"}],"requestId":"guide-json-demo","version":"V2","timestamp":1584062336793}'
Content-Type : multipart/form-data
- Image Recognition Request
KEY | Required | VALUE |
---|---|---|
message | Y | {"version": "string","requestId": "string","timestamp": 0,"lang": "string","images": [{ "format": "string", "name": "string", "templateIds": [ 0 ] }]} |
file | Y | image file steam data |
Form Data Message Value Description
Field name | Required | Type | Description | Constraints |
---|---|---|---|---|
version | Yes | string | Version information required. Input either V1 or V2 | Use of V2 is recommended, and the boundingPoly is provided with V2 |
requestId | Yes | string | API call UUID | |
timestamp | Yes | integer | API call Timestamp value | |
lang | No | string | Language information to be requested for OCR recognition | Language values that can be set are 'ko'/'ja'/'zh-TW', and if the lang field is not set, the language setting value of the domain is set to default Use comma(,) in multi-language.ex:"ko,ja,zh-TW" |
images | Yes | string | It is entered as Json array and currently only one image input is allowed (Korean/Japanese) | GeneralOCR supports up to 50 MB, and Template OCR supports up to 20 MB (PDF, TIFF up to 50 MB) |
images.format | Yes | string | Setting image formats | "JPEG", "PNG", "PDF","TIFF" image formats are supported. General OCR: supports recognition of up to 10 pages of PDF file, Template OCR: supports up to 5 pages of PDF/TIFF file |
images.name | Yes | string | Input image name. It is used to identify the image, as well as for checking the response result | |
images.templateIds | No | json array | It is not used in text OCR API If this field is not set in the Template OCR API, then they will be automatically categorized into all service templates released to the domain | |
enableTableDetection | No | Boolean | Automatically recognizes the table in the document and provides it in a structured format with text | Only GENERAL domain support |
CURL example:
curl --request POST 'your apigw invoke url' \
--header 'X-OCR-SECRET: your secret key' \
--form 'message={"images":[{"format":"png","name":"demo"}],"requestId":"guide-demo","version":"V2","timestamp":1584062336793}' \
--form 'file=@image.png'
Responses
V1 response bodies
Request version is 'V1'
- Image recognition result
Classification | Json Model |
---|---|
Image recognition result | { "uid": "string", "name": "string", "inferResult": "string", "message": "string", "matchedTemplate": { "id": 0, "name": "string" }, "title": {}, "fields": [ {} ], "validationResult": { "result": "string", "message": "string"} } |
Detailed descriptions of image recognition result fields
Field name | Data type | Description |
---|---|---|
uid | string | It is a unique ID provided for the validation of the API, and used to track the validity test request |
name | string | Name of the requested image |
inferResult | string | - Image inference result "SUCCESS": image recognition succeeded "FAILURE": image recognition failed "ERROR": image recognition exception. |
message | string | The "SUCCESS" message is displayed when the image recognition succeeds An error message is displayed when image recognition is failed Error messages are shown in detail at the end |
matchedTemplate | json object | It is the matching template information from the image recognition. It includes the template ID and name When the inference fails, or when a matching template can't be found, this field won't respond |
matchedTemplate.id | 0 | Template ID |
matchedTemplate.name | string | Template name |
title | string | Image title |
fields | Json array object | Reference to ImageField objects |
validationResult | json object | Validation result |
validationResult.result | string | - Result code "NO_REQUESTED": the validation task wasn't executed "UNCHECKED": the response for the action wasn't confirmed, or the response wasn't accepted "ERROR": an error occurred during the validation operation "VALID": the validation result is valid "INVALID": the validation result is invalid "UNCHECKED", "ERROR" and "INVALID" are displayed as validation failure |
validationResult.message | string | This is a value that is not always returned in a detailed message for the validation |
combineResult | json object | Combine analysis result |
combineResult.name | string | Combined field name |
combineResult.text | string | Output value per field + fixed text |
- ImageField object
Classification | Json Model |
---|---|
Image Field | { "name": "string", "valueType": "string", "inferText": "string", "inferConfidence": 0.0, "bounding": {} } |
Detailed descriptions of ImageField object fields
Field name | Data type | Description |
---|---|---|
name | string | Image name |
valueType | string | A value that is not always returned (A text value type of the field) "ALL": text and numbers |
inferText | string | Inference result text |
inferConfidence | 0.0 | Confidence of the inference result. The value is between 0 and 1. The greater the value, the more accurate it is |
bounding | Bounding object | Refer to bounding object |
- Bounding object
Classification | Json Model |
---|---|
bounding | { "top": 0.0, "left": 0.0, "width": 0.0, "height": 0.0 } |
Detailed descriptions of bounding object fields
Field name | Data type | Description |
---|---|---|
top | 0.0 | Bounding Y coordinate |
left | 0.0 | Bounding X coordinate |
width | 0.0 | Bounding width. |
height | 0.0 | Bounding height. |
V2 response bodies
Request version is 'V2'
- Image Recognition Results
Classification | Json Model |
---|---|
Image Recognition Results | { "uid": "string", "name": "string", "inferResult": "string", "message": "string", "matchedTemplate": { "id": 0, "name": "string" }, "title": {}, "fields": [ {} ], "validationResult": { "result": "string", "message": "string"} } |
Detailed description of the Image Recognition Results field
Field Name | Data Type | Description |
---|---|---|
uid | string | A unique ID that is provided to validate the API, which is used to track validation requests. |
name | string | The requested image name. |
inferResult | string | Image inference result. "SUCCESS": Image recognition successful. "FAILURE": image recognition failed. "ERROR": image recognition exception. Not charged when the result is ERROR. |
message | string | Successful image recognition, "SUCCESS" If image recognition fails, an error message is displayed. Error messages are detailed at the bottom |
matchedTemplate | json object | Include the template ID and name with template information that matches image recognition. This field does not respond if recognition fails or a matched template cannot be found. |
matchedTemplate.id | integer | Template ID. |
matchedTemplate.name | string | Name of the template. |
title | json object | ImageField Object Reference |
fields | Json array object | ImageField Object Reference |
validationResult | json object | Validation result. |
validationResult.result | string | Result Code. "NO_REQUESTED": the validation task did not run. "UNCHECKED": action response not confirmed or not accepted "ERROR": error executing validation. "VALID": the verification result is valid. "INVALID": the verification result is invalid. "UNCHECKED","ERROR" and "INVALID" are shown as validation failures. |
validationResult.message | string | It is not always the value that is returned in the Validation detail message. |
convertedImageInfo | json object | Only response when image format is pdf/tiff. Coordinates are based on converted image when request format is pdf/tiff. |
convertedImageInfo.width | integer | The base image width. |
convertedImageInfo.height | integer | The base image height. |
convertedImageInfo.pageIndex | integer | The page index of pdf/tiff. |
combineResult | json object | Combine analysis result |
combineResult.name | string | Combined field name |
combineResult.text | string | Output value per field + fixed text |
tables | Json array object | ImageTable Object Reference |
- ImageField object
Classification | Json Model |
---|---|
Image Field | { "name": "string", "valueType": "string", "inferText": "string", "inferConfidence": 0.0, "boundingPoly": {}, "type": "string", "subFields": [{}], "checked":true, "lineBreak":true } |
ImageField Object Field Details
Field Name | Data Type | Description |
---|---|---|
name | string | Image name. |
valueType | string | It is the text value type of the field. "ALL": text and numbers "NUMERIC":numbers |
inferText | string | Recognition Result Text When type is checkbox , it will be replaced by the return value in the setting |
inferConfidence | float | Confidence of infer result. Larger values of 0-1 are more accurate. |
boundingPoly | boundingPoly Object | boundingPoly Object reference |
type | string | - NORMAL - MULTI_BOX - CHECKBOX |
checked | boolean | Only 'CHECKBOX' type supported. Whether the field is checked or not. |
lineBreak | boolean | Only response in GENERAL api. Whether there is a newline after the text |
subFields | Json Array | Only response in Template api. SubField Object reference |
- boundingPoly object
Classification | Json Model |
---|---|
boundingPoly | { "vertices":[{}] } |
boundingPoly Object Field Details
Field Name | Data Type | Description |
---|---|---|
vertices | vertices object | vertices object reference |
- vertices object
Classification | Json Model |
---|---|
vertices | { "x": 0.0, "y": 0.0 } |
vertices Object Field Details
Field Name | Data Type | Description |
---|---|---|
x | float | X coodinate |
y | float | y coodinate |
- SubField Object
Classification | Json Model |
---|---|
subField | { "boundingPoly": {}, "inferText": "string", "inferConfidence":0.0 "lineBreak": false } |
subField Object Field Details
Field Name | Data Type | Description |
---|---|---|
boundingPoly | boundingPoly Object | boundingPoly Object reference |
inferText | string | Recognition Result Text |
inferConfidence | float | Confidence of infer result. Larger values of 0-1 are more accurate. |
lineBreak | boolean | Whether there is a newline after the text |
- ImageTable Object
Classification | Json Model |
---|---|
subField | { "cells": [], "boundingPoly": {}, "inferConfidence":0.0 } |
ImageTable Object Field Details
Field Name | Data Type | Description |
---|---|---|
boundingPoly | boundingPoly Object | boundingPoly Object reference |
cells | json array object | TableCell Object reference |
inferConfidence | float | Confidence of infer result. Larger values of 0-1 are more accurate. |
- TableCell Object
Classification | Json Model |
---|---|
subField | { "cellTextLines": [], "boundingPoly": {}, "inferConfidence":0.0, "rowSpan":0, "rowIndex":0, "columnSpan":0, "columnIndex":0 } |
TableCell Object Field Details
Field Name | Data Type | Description |
---|---|---|
boundingPoly | boundingPoly Object | boundingPoly Object reference |
cellTextLines | json array object | The lines in a cell. CellTextLine Object reference. |
inferConfidence | float | Confidence of infer result. Larger values of 0-1 are more accurate. |
rowSpan | int | The rowSpan property specifies the number of rows a cell should span. |
rowIndex | int | The rowIndex property specifies the position of a row in the collection of rows in a table. |
columnSpan | int | The columnSpan property specifies how many columns an element should span across. |
columnIndex | int | The columnIndex property specifies the position of a column in the collection of columns in a table. |
- CellTextLine Object
Classification | Json Model |
---|---|
subField | { "cellWords": [], "boundingPoly": {}, "inferConfidence":0.0 } |
CellTextLine Object Field Details
Field Name | Data Type | Description |
---|---|---|
boundingPoly | boundingPoly Object | boundingPoly Object reference |
inferConfidence | float | Confidence of infer result. Larger values of 0-1 are more accurate. |
cellWords | json array object | The words in a line. CellWord Object reference. |
- CellWord Object
Classification | Json Model |
---|---|
subField | { "inferText": "", "boundingPoly": {}, "inferConfidence":0.0 } |
CellWord Object Field Details
Field Name | Data Type | Description |
---|---|---|
boundingPoly | boundingPoly Object | boundingPoly Object reference |
inferConfidence | float | Confidence of infer result. Larger values of 0-1 are more accurate. |
inferText | string | Inference result text |
Examples
Text OCR request examples
{
"version": "V2",
"requestId": "string",
"timestamp": 0,
"lang":"ko",
"images": [
{
"format": "jpg",
"name": "test 1",
"url": "https://www.ncloud.com/ocr-test/test.jpg"
}
]
}
Text OCR response examples
{
"version": "V2",
"requestId": "string",
"timestamp": 1576569034247,
"images": [{
"uid": "9fd73a6aacad4025b3099a36ee55aacd",
"name": "medium",
"inferResult": "SUCCESS",
"message": "SUCCESS",
"fields": [{
"valueType": "ALL",
"inferText": "Beautiful",
"inferConfidence": 0.99992156,
"type": "NORMAL",
"lineBreak": true,
"boundingPoly": {
"vertices": [{
"x": 2713.7295,
"y": 1277.0492
}, {
"x": 2713.7295,
"y": 977.7408
}, {
"x": 2841.4343,
"y": 977.7408
}, {
"x": 2841.4343,
"y": 1277.0492
}]
}
},
{
"valueType": "ALL",
"inferText": "This",
"inferConfidence": 0.99958915,
"type": "NORMAL",
"lineBreak": false,
"boundingPoly": {
"vertices": [{
"x": 2314.6516,
"y": 1468.6066
}, {
"x": 2314.6516,
"y": 1328.9293
}, {
"x": 2426.3936,
"y": 1328.9293
}, {
"x": 2426.3936,
"y": 1468.6066
}]
}
},
{
"valueType": "ALL",
"inferText": "World",
"inferConfidence": 0.9998707,
"type": "NORMAL",
"lineBreak": false,
"boundingPoly": {
"vertices": [{
"x": 2314.6516,
"y": 1604.2931
}, {
"x": 2314.6516,
"y": 1460.625
}, {
"x": 2430.3843,
"y": 1460.625
}, {
"x": 2430.3843,
"y": 1604.2931
}]
}
}
],
"validationResult": {
"result": "NO_REQUESTED"
}
}]
}
Template OCR request examples
{
"version": "V1",
"requestId": "string",
"timestamp": 0,
"lang":"ko",
"images": [
{
"format": "jpg",
"name": "test 1",
"url": "https://www.ncloud.com/ocr-test/test.jpg",
"templateIds":[390]
}
]
}
Template OCR response examples
{
"version": "V2",
"requestId": "string",
"timestamp": 1584067653255,
"images": [
{
"uid": "1b220cd049de4a7c9e0dc1942d982867",
"name": "test 1",
"inferResult": "SUCCESS",
"message": "SUCCESS",
"matchedTemplate": {
"id": 390,
"name": "template"
},
"validationResult": {
"result": "NO_REQUESTED"
},
"title": {
"name": "title",
"boundingPoly": {
"vertices": [
{
"x": 453.7125,
"y": 54.1125
},
{
"x": 961.5375,
"y": 54.1125
},
{
"x": 961.5375,
"y": 108.225
},
{
"x": 453.7125,
"y": 108.225
}
]
},
"inferText": "Insurance claim form (monthly personal insurance)",
"inferConfidence": 0.94674826
},
"fields": [
{
"name": "id",
"valueType": "NUMERIC",
"boundingPoly": {
"vertices": [
{
"x": 488.88235,
"y": 284.92896
},
{
"x": 550.3732,
"y": 284.93716
},
{
"x": 550.39166,
"y": 333.93698
},
{
"x": 488.90073,
"y": 333.9292
}
]
},
"inferText": "102831",
"inferConfidence": 0.9319761,
"type": "MULTI_BOX",
"subFields": [
{
"boundingPoly": {
"vertices": [
{
"x": 488.88235,
"y": 284.92896
},
{
"x": 550.3732,
"y": 284.93716
},
{
"x": 550.39166,
"y": 333.93698
},
{
"x": 488.90073,
"y": 333.9292
}
]
},
"inferText": "1",
"inferConfidence": 0.9798796
},
{
"boundingPoly": {
"vertices": [
{
"x": 551.37305,
"y": 284.9373
},
{
"x": 612.86285,
"y": 284.9455
},
{
"x": 612.88153,
"y": 333.94495
},
{
"x": 551.39154,
"y": 333.9371
}
]
},
"inferText": "0",
"inferConfidence": 0.6391636
},
{
"boundingPoly": {
"vertices": [
{
"x": 613.86273,
"y": 284.94562
},
{
"x": 675.3515,
"y": 284.95383
},
{
"x": 675.3702,
"y": 333.95288
},
{
"x": 613.8812,
"y": 333.94504
}
]
},
"inferText": "2",
"inferConfidence": 0.99591047
},
{
"boundingPoly": {
"vertices": [
{
"x": 676.3513,
"y": 284.95395
},
{
"x": 737.8392,
"y": 284.9622
},
{
"x": 737.8579,
"y": 333.96082
},
{
"x": 676.37006,
"y": 333.953
}
]
},
"inferText": "8",
"inferConfidence": 0.99782735
},
{
"boundingPoly": {
"vertices": [
{
"x": 738.83887,
"y": 284.96228
},
{
"x": 800.3257,
"y": 284.97052
},
{
"x": 800.34454,
"y": 333.96872
},
{
"x": 738.8577,
"y": 333.9609
}
]
},
"inferText": "3",
"inferConfidence": 0.99916536
},
{
"boundingPoly": {
"vertices": [
{
"x": 801.3255,
"y": 284.97064
},
{
"x": 862.8112,
"y": 284.97882
},
{
"x": 862.8301,
"y": 333.97662
},
{
"x": 801.3443,
"y": 333.96884
}
]
},
"inferText": "1",
"inferConfidence": 0.9799099
}
]
},
{
"name": "name",
"valueType": "ALL",
"boundingPoly": {
"vertices": [
{
"x": 287.2125,
"y": 287.2125
},
{
"x": 380.86874,
"y": 287.2125
},
{
"x": 380.86874,
"y": 328.8375
},
{
"x": 287.2125,
"y": 328.8375
}
]
},
"inferText": "David",
"inferConfidence": 0.99630755,
"type": "NORMAL"
},
{
"name": "fax-checkbox",
"valueType": "ALL",
"boundingPoly": {
"vertices": [
{
"x": 87.08151,
"y": 736.90735
},
{
"x": 140.0801,
"y": 736.91125
},
{
"x": 140.10016,
"y": 791.9156
},
{
"x": 87.101494,
"y": 791.9121
}
]
},
"inferText": "",
"inferConfidence": 0.99464625,
"type": "CHECKBOX",
"checked": true
}
]
}
]
}
API examples
The following are some examples of CLOVA OCR API implementation for each language
- Request with multipart/form-data
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.UUID;
import org.json.JSONArray;
import org.json.JSONObject;
public class OCRGeneralAPIDemo {
public static void main(String[] args) {
String apiURL = "YOUR_API_URL";
String secretKey = "YOUR_SECRET_KEY";
String imageFile = "YOUR_IMAGE_FILE";
try {
URL url = new URL(apiURL);
HttpURLConnection con = (HttpURLConnection)url.openConnection();
con.setUseCaches(false);
con.setDoInput(true);
con.setDoOutput(true);
con.setReadTimeout(30000);
con.setRequestMethod("POST");
String boundary = "----" + UUID.randomUUID().toString().replaceAll("-", "");
con.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
con.setRequestProperty("X-OCR-SECRET", secretKey);
JSONObject json = new JSONObject();
json.put("version", "V2");
json.put("requestId", UUID.randomUUID().toString());
json.put("timestamp", System.currentTimeMillis());
JSONObject image = new JSONObject();
image.put("format", "jpg");
image.put("name", "demo");
JSONArray images = new JSONArray();
images.put(image);
json.put("images", images);
String postParams = json.toString();
con.connect();
DataOutputStream wr = new DataOutputStream(con.getOutputStream());
long start = System.currentTimeMillis();
File file = new File(imageFile);
writeMultiPart(wr, postParams, file, boundary);
wr.close();
int responseCode = con.getResponseCode();
BufferedReader br;
if (responseCode == 200) {
br = new BufferedReader(new InputStreamReader(con.getInputStream()));
} else {
br = new BufferedReader(new InputStreamReader(con.getErrorStream()));
}
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = br.readLine()) != null) {
response.append(inputLine);
}
br.close();
System.out.println(response);
} catch (Exception e) {
System.out.println(e);
}
}
private static void writeMultiPart(OutputStream out, String jsonMessage, File file, String boundary) throws
IOException {
StringBuilder sb = new StringBuilder();
sb.append("--").append(boundary).append("\r\n");
sb.append("Content-Disposition:form-data; name=\"message\"\r\n\r\n");
sb.append(jsonMessage);
sb.append("\r\n");
out.write(sb.toString().getBytes("UTF-8"));
out.flush();
if (file != null && file.isFile()) {
out.write(("--" + boundary + "\r\n").getBytes("UTF-8"));
StringBuilder fileString = new StringBuilder();
fileString
.append("Content-Disposition:form-data; name=\"file\"; filename=");
fileString.append("\"" + file.getName() + "\"\r\n");
fileString.append("Content-Type: application/octet-stream\r\n\r\n");
out.write(fileString.toString().getBytes("UTF-8"));
out.flush();
try (FileInputStream fis = new FileInputStream(file)) {
byte[] buffer = new byte[8192];
int count;
while ((count = fis.read(buffer)) != -1) {
out.write(buffer, 0, count);
}
out.write("\r\n".getBytes());
}
out.write(("--" + boundary + "--\r\n").getBytes("UTF-8"));
}
out.flush();
}
}
import requests
import uuid
import time
import json
api_url = 'YOUR_API_URL'
secret_key = 'YOUR_SECRET_KEY'
image_file = 'YOUR_IMAGE_FILE'
request_json = {
'images': [
{
'format': 'jpg',
'name': 'demo'
}
],
'requestId': str(uuid.uuid4()),
'version': 'V2',
'timestamp': int(round(time.time() * 1000))
}
payload = {'message': json.dumps(request_json).encode('UTF-8')}
files = [
('file', open(image_file,'rb'))
]
headers = {
'X-OCR-SECRET': secret_key
}
response = requests.request("POST", api_url, headers=headers, data = payload, files = files)
print(response.text.encode('utf8'))
<?php
$client_secret = "YOUR_SECRET_KEY";
$url = "YOUR_API_URL";
$image_file = "YOUR_IMAGE_FILE";
$params->version = "V2";
$params->requestId = uniqid();
$params->timestamp = time();
$image->format = "jpg";
$image->name = "demo";
$images = array($image);
$params->images = $images;
$json = json_encode($params);
$boundary = uniqid();
$is_post = true;
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, $is_post);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$post_form = array("message" => $json, "file" => new CURLFILE($image_file));
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_form);
$headers = array();
$headers[] = "X-OCR-SECRET: ".$client_secret;
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($ch);
$err = curl_error($ch);
$status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close ($ch);
echo $status_code;
if($status_code == 200) {
echo $response;
} else {
echo "ERROR: ".$response;
}
?>
const FormData = require('form-data')
const axios = require('axios')
function requestWithBase64 () {
axios
.post(
'', // APIGW Invoke URL
{
images: [
{
format: '', // file format
name: '', // image name
data: '' // image base64 string(only need part of data). Example: base64String.split(',')[1]
}
],
requestId: '', // unique string
timestamp: 0,
version: 'V2'
},
{
headers: {
'X-OCR-SECRET': '' // Secret Key
}
}
)
.then(res => {
if (res.status === 200) {
console.log('requestWithBase64 response:', res.data)
}
})
.catch(e => {
console.warn('requestWithBase64 error', e.response)
})
}
function requestWithFile () {
const file = '' // image file object. Example: fs.createReadStream('./example.png')
const message = {
images: [
{
format: '', // file format
name: '' // file name
}
],
requestId: '', // unique string
timestamp: 0,
version: 'V2'
}
const formData = new FormData()
formData.append('file', file)
formData.append('message', JSON.stringify(message))
axios
.post(
'', // APIGW Invoke URL
formData,
{
headers: {
'X-OCR-SECRET': '', // Secret Key
...formData.getHeaders()
}
}
)
.then(res => {
if (res.status === 200) {
console.log('requestWithFile response:', res.data)
}
})
.catch(e => {
console.warn('requestWithFile error', e.response)
})
}
- Request with application/json
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.UUID;
import org.json.JSONArray;
import org.json.JSONObject;
public class OCRGeneralAPIDemo {
public static void main(String[] args) {
String apiURL = "YOUR_API_URL";
String secretKey = "YOUR_SECRET_KEY";
try {
URL url = new URL(apiURL);
HttpURLConnection con = (HttpURLConnection)url.openConnection();
con.setUseCaches(false);
con.setDoInput(true);
con.setDoOutput(true);
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/json; charset=utf-8");
con.setRequestProperty("X-OCR-SECRET", secretKey);
JSONObject json = new JSONObject();
json.put("version", "V2");
json.put("requestId", UUID.randomUUID().toString());
json.put("timestamp", System.currentTimeMillis());
JSONObject image = new JSONObject();
image.put("format", "jpg");
image.put("url", "https://kr.object.ncloudstorage.com/ocr-ci-test/sample/1.jpg"); // image should be public, otherwise, should use data
// FileInputStream inputStream = new FileInputStream("YOUR_IMAGE_FILE");
// byte[] buffer = new byte[inputStream.available()];
// inputStream.read(buffer);
// inputStream.close();
// image.put("data", buffer);
image.put("name", "demo");
JSONArray images = new JSONArray();
images.put(image);
json.put("images", images);
String postParams = json.toString();
DataOutputStream wr = new DataOutputStream(con.getOutputStream());
wr.writeBytes(postParams);
wr.flush();
wr.close();
int responseCode = con.getResponseCode();
BufferedReader br;
if (responseCode == 200) {
br = new BufferedReader(new InputStreamReader(con.getInputStream()));
} else {
br = new BufferedReader(new InputStreamReader(con.getErrorStream()));
}
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = br.readLine()) != null) {
response.append(inputLine);
}
br.close();
System.out.println(response);
} catch (Exception e) {
System.out.println(e);
}
}
}
import requests
import uuid
import time
import base64
import json
api_url = 'YOUR_API_URL'
secret_key = 'YOUR_SECRET_KEY'
image_url = 'YOUR_IMAGE_URL'
# image_file = 'YOUR_IMAGE_FILE'
# with open(image_file,'rb') as f:
# file_data = f.read()
request_json = {
'images': [
{
'format': 'jpg',
'name': 'demo',
# 'data': base64.b64encode(file_data).decode()
'url': image_url
}
],
'requestId': str(uuid.uuid4()),
'version': 'V2',
'timestamp': int(round(time.time() * 1000))
}
payload = json.dumps(request_json).encode('UTF-8')
headers = {
'X-OCR-SECRET': secret_key,
'Content-Type': 'application/json'
}
response = requests.request("POST", api_url, headers=headers, data = payload)
print(response.text)
<?php
$client_secret = "YOUR_SECRET_KEY";
$url = "YOUR_API_URL";
$image_url = "YOUR_IMAGE_URL";
// $image_file = "YOUR_IMAGE_FILE";
$params->version = "V2";
$params->requestId = "uuid";
$params->timestamp = time();
$image->format = "jpg";
$image->url = $image_url;
// $image->data = base64_encode(file_get_contents($image_file));
$image->name = "demo";
$images = array($image);
$params->images = $images;
$json = json_encode($params);
$is_post = true;
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, $is_post);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $json);
$headers = array();
$headers[] = "X-OCR-SECRET: ".$client_secret;
$headers[] = "Content-Type:application/json; charset=utf-8";
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($ch);
$err = curl_error($ch);
$status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close ($ch);
echo $status_code;
if($status_code == 200) {
echo $response;
} else {
echo "ERROR: ".$response;
}
?>
<%
Function ASPPostJSON()
Dim objXmlHttp
Set objXmlHttp = Server.CreateObject("Microsoft.XMLHTTP")
url = "YOUR_INVOKE_URL"
secret = "YOUR_SECRET_KEY"
base64 = """"+ToBase64(getBinaryFile(Server.MapPath("test.jpg")))+""""
body = "{""images"":[{""format"":""jpg"",""name"":""test 1"",""data"":"+base64+"}],""requestId"":""string"",""timestamp"":0,""version"":""V2"",""lang"":""ko""}"
objXmlHttp.Open "POST", url, False
objXmlHttp.SetRequestHeader "Content-Type", "application/json"
objXmlHttp.SetRequestHeader "X-OCR-SECRET", secret
objXmlHttp.Send body
ASPPostJSON = CStr(objXmlHttp.ResponseText)
Response.write(ASPPostJSON)
Set objXmlHttp = Nothing
End Function
Function getBinaryFile(strFilePath)
Dim TypeBinary, oStream
TypeBinary = 1
Set oStream = Server.CreateObject("ADODB.Stream")
oStream.Open
oStream.Type = TypeBinary
oStream.LoadFromFile strFilePath
getBinaryFile = oStream.read
Set oStream = Nothing
End Function
Function ToBase64(rabyt)
Dim xml: Set xml = CreateObject("MSXML2.DOMDocument.3.0")
xml.LoadXml "<root />"
xml.documentElement.dataType = "bin.base64"
xml.documentElement.nodeTypedValue = rabyt
ToBase64 = xml.documentElement.Text
End Function
call ASPPostJSON()
%>
Error code
HttpStatusCode | Description |
---|---|
400 | Request parameters invalid or constraint problem. |
401 | Api secret(X-CHATBOT-API-KEY) wrong |
500 | Internal server error |
Error Response Body:
{
"code": "Error Code",
"message": "error details message.",
"path": "request API path",
"timestamp": 1570776853475
}
ErrorCode | Description |
---|---|
0001 | URL is invalid. |
0002 | Secret key validate failed. |
0011 | Request body invalid. |
0021 | Protocol version not support. |
0022 | Request domain invalid. |
0023 | API request count reach the upper limit. |
0025 | Calls to this api have exceeded the rate limit. |
0500 | Unknown service error. |
0501 | OCR Service error. |
1021 | Not found deploy infomation. Please confirm the template is released. |
Was this article helpful?