LINE WORKS OCRで業務を効率化するための簡単スタートガイド!(4/4)

LINE WORKS OCRで業務を効率化するための簡単スタートガイド!(4/4)

このステップのゴール

文字認識をさせるためにどういった情報を送信する必要があるか、またその方法をご理解いただき、実際にお手元のアプリケーション等から画像をリクエストして認識結果を取得します。

1. テンプレートをリリースする

作成したOCRのAPIに対して、各プログラミング言語やアプリケーションを使用し「この画像を文字起こしして」と要求することです。

形式が決まっているので本ページに記載のサンプルコードを流用することで簡単にリクエストすることができます。

2. リクエストの準備

  1. 1. リクエスト画像を用意
    ローカルに保存されている画像または公開されたサーバーに格納されている画像をリクエストできます。

  2. 2. Invoke URLとSecret Keyを用意
    「CLOVA OCRのドメイン作成」のページで取得した”Invoke URL”と”Secret Key”を使います。

  3. 3. リクエストする言語や環境を用意
    各プログラミング言語やアプリケーションでリクエストしますが、必要な環境のご用意は各提供元のサイト等からインストールしご準備ください。

  4. 4.(Generalのみ)テーブル認識をする場合は、ドメインの「Table」トグルをオン
    ※テーブル認識を使用すると、月額内読み取り枚数が10万枚から9,091枚になりますのでご注意ください。

3. フィールド情報

💡フィールドとは

どのような情報をどういった形でリクエストしているのかを定義する情報です。

💡application/jsonとmultipart/form-dataの違いについて

 

データ形式の違いですが、CLOVA OCRを利用する場合はリクエストする画像の指定の仕方が以下のように異なります。

 

application/json:インターネットに公開された画像のURLを指定するか、画像をBase64という形式の文字列にエンコード(変換)して指定します。

 

Base64で指定する際はエンコードした文字列をコピペするだけで済みますが、文字列が長くなることが多いです。

 

multipart/form-data:画像をローカルフォルダから指定します。

 

Postmanを使う場合、「Settings」で指定されているPostmanフォルダの中に画像を格納しそこから指定してあげる必要があります。

multipart/form-data
  1. 1. version:V1 / V2を選べますがV2を推奨します
    ※V2では位置情報のboundingPloyが返却されます
  2. 2. requestId:リクエストに付ける名前です。任意の文字列が入力できます。
  3. 3. timestamp:日付や時刻など、数字を入力できます。
  4. 4. lang:言語の指定です。日本語の場合はjaを入力してください。
  5. 5. (Generalのみ)enableTableDetection:テーブル認識を使用する指示です。
    使用する場合は、true を指定します。
  6. 6. images:画像情報の詳細を指定します。
    • format:該当するファイル形式をjpg/jpeg/png/pdf/tiffから指定してください。
    • name:ファイルの名前をつけることができます。OCRでは画像のファイル名を読み込まないため、リクエスト画像と同じ名前にしてどの画像の結果か分かりやすくすること等の用途に使えます。
    • templateIds:Template OCRの場合は、Template IDを指定することが出来ます。指定しない場合でもAI側が自動判別で適切なテンプレートを判断します。
      Generalの場合はこのフィールドは指定できません。
  1.  
application/json
  1. 1. version:V1 / V2を選べますがV2を推奨します ※V2では位置情報のboundingPloyが返却されます。
  2. 2. requestId:リクエストに付ける名前です。任意の文字列が入力できます。
  3. 3. timestamp:日付や時刻など、数字を入力できます。
  4. 4. lang:言語の指定です。日本語の場合はjaを入力してください。
  5. 5. (Generalのみ)enableTableDetection:テーブル認識を使用する指示です。
    使用する場合は、true を指定します。
  6. 6. images:画像情報の詳細を指定します。
    なお、urlとdataはどちらか一方を選んでください。(両方指定されている場合、dataが優先されます。)
    • format:該当するファイル形式をjpg/jpeg/png/pdf/tiffから指定してください。
    • url:画像のURLを入力します。この場合、画像はウェブに公開されている必要があります。
    • data:画像をBase64にエンコードして指定します。
    • name:ファイルの名前をつけることができます。
      OCRでは画像のファイル名を読み込まないため、リクエスト画像と同じ名前にしてどの画像の結果か分かりやすくすること等の用途に使えます。
    • templateIds:Template OCRの場合は、Template IDを指定することが出来ます。
      指定しない場合でもAI側が自動判別で適切なテンプレートを判断します。
      Generalの場合はこのフィールドは指定できません。

4. Curlリクエストサンプルコード

Mac(ターミナルなど)

curl -X POST ‘ここにInvoke URLを入力‘ \
-H ‘X-OCR-SECRET: ここにSecret Keyを入力‘ \
-F ‘message={“images”:[{“format”:”png/jpg/pdf/tiff“,”name”:”demo”}],”requestId”:”guide-demo”,”version”:”V2″,”timestamp”:1584062336793,”lang”:”ja”}’ \
-F ‘file=@ここにファイルパスを入力

				
					curl -X POST 'ここにInvoke URLを入力' \
-H 'X-OCR-SECRET: ここにSecret Keyを入力' \
-F 'message={"images":[{"format":"png/jpg/pdf/tiff","name":"demo"}],"requestId":"guide-demo","version":"V2","timestamp":1584062336793,"lang":"ja"}' \
-F 'file=@ここにファイルパスを入力'
				
			
Windows (コマンドプロンプトなど)

curl –request POST “ここにInvoke URLを入力
–header “X-OCR-SECRET: ここにSecret Keyを入力
–form “message={\”images\”:[{\”format\”:\”png/jpg/pdf/tiff\”,\”name\”:\”demo\”}],\”requestId\”:\”guide-demo\”,\”version\”:\”V2\”,\”timestamp\”:1584062336793,\”lang\”:\”ja\”}”
–form “file=@ここにファイルパスを入力

5. Pythonリクエストサンプルコード

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’: ‘png/jpg/pdf‘,
‘name’: ‘demo’
}
],
‘requestId’: str(uuid.uuid4()),
‘version’: ‘V2’,
‘timestamp’: int(round(time.time() * 1000)),
‘lang’:’ja’
}

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’))

				
					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': 'png/jpg/pdf',
'name': 'demo'
}
],
'requestId': str(uuid.uuid4()),
'version': 'V2',
'timestamp': int(round(time.time() * 1000)),
'lang':'ja'
}

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'))
				
			

6. Javaリクエストサンプルコード

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());

json.put(“lang”, “ja”);

JSONObject image = new JSONObject();

image.put(“format”, “png/jpg/pdf“);

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();

}

}

7. PHPリクエストサンプルコード

<?php
$client_secret = “YOUR_SECRET_KEY“;
$url = “YOUR_API_URL“;
$image_url = “YOUR_IMAGE_URL“;
// Uncomment the following line if you want to use image file instead of URL
// $image_file = “YOUR_IMAGE_FILE“;

// Initialize a new stdClass object for params and image
$params = new stdClass();
$image = new stdClass();

$params->version = “V2”;
// You should replace ‘uuid’ with an actual unique ID generation method
$params->requestId = ‘uuid’; // Consider using a UUID generation library
$params->timestamp = time();
$image->format = “jpg“;
$image->url = $image_url;
// Uncomment below to send an image file as base64-encoded string
// $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, true); // Set to true to enable SSL verification
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);

if ($err) {
echo “cURL Error #:” . $err;
} else {
echo “HTTP Status Code: ” . $status_code . “\n”;
if ($status_code == 200) {
// Handle successful response
echo $response;
} else {
// Handle error, potentially differentiating by status code
echo “ERROR: ” . $response;
}
}
?>

8. Postmanを使用したリクエスト手順

PostmanはPostman, inc.が提供しているAPI開発用コラボレーションプラットフォームです。

Postmanを使うとプログラミング言語が分からなくてもツール操作のみでリクエストすることができます。

なお、ご利用に際してはPostmanのサービスサイトをご確認のうえご利用ください。

  1. 1. リクエストメソッドはPOSTを選択します
  2. 2. 隣の欄にInvoke URLを入力します
  3. 3. Headersタブをクリックします
  4. 4. KEY列に X-OCR-SECRET と Content-Type をそれぞれ入力します
multipart/form-dataの場合
  1. 1. Bodyタブをクリックし、form-data を選択します。
  2. 2. KEY列にfileと入力し、マウスオーバーして表示される枠内右端の「Text▼」をクリックして”File”に変更します。
  3. 3. 読み込ませたい画像をPOSTMANのfileフォルダに格納します。
    フォルダの場所は「設定マーク」>「Settings」>「General」の”Location”に表示されています。
  4. 4. VALUE列で”Select files”をクリックしPOSTMANのfileフォルダから読み込ませたい画像を添付します。
  5. 5. 2行目のKEY列にmessageと入力します。
  6. 6. 隣のVALUE列には以下のフィールド情報を記載の要領で入力します

PostmanはPostman, inc.が提供しているAPI開発用コラボレーションプラットフォームです。

Postmanを使うとプログラミング言語が分からなくてもツール操作のみでリクエストすることができます。

なお、ご利用に際してはPostmanのサービスサイトをご確認のうえご利用ください。

  1. 7. invoke URLを入力した欄の右横にある青いボタンの「Send」をクリックすると画像のリクエストが開始されます。
  2. 8. 以下のようにエラー無くレスポンスが表示されたら成功です。
multipart/form-dataの場合
  1. 1. Body > raw をクリックします。
  2. 2. コード入力欄に以下の要領で記述します。

{
“version”: “string”,
“requestId”: “string”,
“timestamp”: 0,
“lang”: “string”,
“images”: [{ “format”: “string”, “url”: “string”, “data”: “string”, “name”: “string”, “templateIds”: [ 0 ] }]
}

  1. 3. invoke URLを入力した欄の右横にある青いボタンの「Send」をクリックすると画像のリクエストが開始されます。
  2. 4. 以下のようにエラー無くレスポンスが表示されたら成功です。

9. エラーが出る場合

エラーの内容に応じて対応が異なります。

エラーコードエラー内容原因と対処
0001Invoke URLが誤っています

Invoke URLが正しく入力されているかご確認ください。
なおAPI Gatewayと手動で連携を行っている場合は、Stage Invoke URLの末尾に以下の文字列が必要です。

General: /general
Template: /infer

0002Secret Keyが誤っていますSecret Keyが正しく入力できているかご確認ください。
0011Bodyの内容が誤っています

正しい構文でリクエストが出来ていない状況です。

記号やフィールド名、値が正しく記載されているかこれまでのガイドを参考にあらためてご確認ください。

具体的な要因はmessageに記載されている内容をご参照ください。

0021versionフィールドの値が誤っていますV2,V1以外の値になっていると思われますので、一度V2を指定して再度お試しください。
0022Request domain invalid.

Invoke URLに指定したドメインが削除されている等、無効になっています。

再度、リクエスト先のドメインをご確認ください。

0023API request count reach the upper limit.

Template Freeプランをご利用で、毎月の300件の上限に達しています。

翌月1日までお待ちいただくか、有料プランをお申し込みください。

0025Calls to this api have exceeded the rate limit.

1秒間に2件のリクエスト上限がございます。

本エラーが出た場合は、1秒間に3件以上のリクエストとなったことが原因です。

1秒間に2件までにリクエストを調整いただくか、2件を超えるリクエストが必要な場合は営業担当まで1度ご相談ください。

0028Table detection disabled: Please activate the table extractor button.

テーブル認識がオフになっているため、表抽出が出来ませんでした。

General OCRドメインの「表抽出の有無」のトグルをオンにしてください。

0500サーバーが応答しませんでした複数のケースが考えられますが、一時的な問題の可能性もありますのでしばらく経って再度お試しください。
なお、Content-Typeに対してbodyの記述適切であるかなど、リクエストの記述が正しく出来ているか、これまでのガイドを参考にあらためてご確認ください。
0501OCRサーバーが応答しませんでした一時的な問題の可能性もありますのでしばらく経って再度お試しください。
1021APIの開発情報が見つかりませんでしたTemplateOCRでテンプレーートをリリースして公開していない事が
原因です。
テンプレートビルダー内の「リリース」から使用したいテンプレー
トの「リリース」をクリックしてください。
DEADLINE_EXCEEDED:
deadline exceeded after 14999954238ns

読み取り処理がタイムアウトしました。

1リクエストの処理は15秒でタイムアウトします。

処理時間は記載文字数に影響を大きく受けるため、画像を分割するなどの対応をご検討ください。

 

これで

CLOVA OCRで業務を効率化するための4ステップ全てが完了です!

お疲れさまでした!