Initial Site

Initial Site

Initial Site

【GAS】OCRを使った画像の文字取得を自動化する

  • ヨシモト  2018/12/06 17:12
ai_search

営業部 ヨシモトです。

 

今回の記事は下記に当てはまる方向けの内容です。

  • ・OCRって便利
  • ・画像の文字を読み取りたいことがある
  • ・読み取った文字や数値を集計したい

 

Google ドライブに置いてある画像から文字を読み取ること自体は手動でカンタンにできます。

  1. 1. ドライブ内の画像を右クリック
  2. 2. アプリで開くを選択
  3. 3. Google ドキュメントを選択
  4. 4. 少し待つ
  5. 5. 完成!!

たったのこれだけです!

 

でも、読み取った文字や数値を集計したい場合はひとつひとつこの作業をすることになりとても大変です。

 

ところが、Google Apps Script(以下、GAS)を使えばこの作業も自動化できます!

 

今回すること

ざっくりとご紹介すると、

Google ドライブ内の画像から画像ファイルとは別にOCR用のファイル(ドキュメントのファイル)を作る

(このOCR用ファイルには読み取った文字列や数値がテキストとして入っている)

OCR用ファイルのテキストを集計しやすいようにスプレッドシートへ持っていく

こんな感じです。

 

※Google ドライブに対象の画像があることが前提です。

例えば、Gmailから画像ファイルをドライブへ自動で移動させることについては以下の記事を参照してください。

【GAS】Gmailの添付ファイルを一括でGoogleドライブへ保存する

 

手順

コードの手順としては、

  1. ①. ドライブ内対象フォルダにある画像ファイルからファイル名を取り出す。
  2. ②. 取り出したファイル名と画像と一緒に「OCRにして」というオプションを使ってOCR用ファイルを作る。
  3. ③. OCR用ファイルからテキストを取り出し、スプレッドシートに移行するために配列に入れておく。
  4. ④. これを画像ファイルの数だけ繰り返す。
  5. ⑤. テキストが入っている配列をスプレッドシートへ移す。

とします。

 

コード

function ocrSample() {
  var folder = DriveApp.getFoldersByName('対象フォルダ名').next();
  var images = folder.getFilesByType('image/png');
  while (images.hasNext()) {
    var image = images.next();
    var docName = image.getName().split("\.")[0];
    var Request_body = {
      title: docName, 
      mimeType: 'image/jpeg'
    }
    Drive.Files.insert(Request_body, image, { ocr: true });
    var newFile = DriveApp.getFilesByName(docName).next();
    folder.addFile(newFile);
    DriveApp.getRootFolder().removeFile(newFile);
  }  
  var docs = folder.getFilesByType('application/vnd.google-apps.document');
  var texts = [];
  while (docs.hasNext()) {
    var file = docs.next();
    var docId = file.getId();
    var doc = DocumentApp.openById(docId);
    var text = doc.getBody().getText().split('\n')[1];
    texts.push([text]);
  }
  var sheet = SpreadsheetApp.getActiveSheet();
  sheet.getRange(1, 1, texts.length, 1).setValues(texts);
}

解説

Drive API

今回はDrive APIというものを使います。

Drive APIを使うともともと用意されているGASのDrive Serviceよりも、もう少し高度なことができるようになります。

今回のOCR作業のためにDrive APIが必要になります。

Drive APIを有効にするにはこちらを参考にしてください。

1.GASのエディタ > リソース > Google の拡張サービスを開く
2.Drive APIをONにする
3.Google デベロッパー コンソールを開く
4.検索窓で「Drive API」を検索
5.Drive APIを有効にする

引用元: Google Apps Scriptで画像の文字列を抜き出す – Qiita

 

①. ドライブ内対象フォルダにある画像ファイルからファイル名を取り出す。

var folder = DriveApp.getFoldersByName('対象フォルダ名').next();
var images = folder.getFilesByType('image/png');
var image = images.next();
var docName = image.getName().split("\.")[0];

※手持ちの画像ファイルがpngだったのでimage/pngを指定してますが、対象のファイルがjpgならimage/jpegにしてください。

 

②. 取り出したファイル名と画像と一緒に「OCRにして」というオプションを使ってOCR用ファイルを作る。

var Request_body = {
      title: docName, 
      mimeType: 'image/jpeg'
  }
  Drive.Files.insert(Request_body, image, { ocr: true });
  var newFile = DriveApp.getFilesByName(docName).next();
  folder.addFile(newFile);
  DriveApp.getRootFolder().removeFile(newFile);

※addFileする時に対象フォルダだけでなく、ルートフォルダ(ドライブの根っ子のフォルダ)にも作られるので、removeFileで削除しておきます。

 

③. ④. OCR用ファイルからテキストを取り出し、スプレッドシートに移行するために配列に入れておく。
これを画像ファイルの数分だけ繰り返す。

var docs = folder.getFilesByType('application/vnd.google-apps.document');
var texts = [];
while (docs.hasNext()) {
  var file = docs.next();
  var docId = file.getId();
  var doc = DocumentApp.openById(docId);
  var text = doc.getBody().getText().split('\n')[1];
  texts.push([text]);
}

※application/vnd.google-apps.documentはGoogle ドキュメント形式のファイルタイプを指定しています。

ちなみにdoc.getBody().getText().split(‘\n’)[1]は[0]にすると空っぽになるのでこのようにしています。

 

⑤. テキストが入っている配列をスプレッドシートへ移す。

var sheet = SpreadsheetApp.getActiveSheet();
sheet.getRange(1, 1, texts.length, 1).setValues(texts);

※ここは二次元配列のtextsをセルへ書き込むだけです。

 

それでこれを動かしてみると、、、

capture

できました。

 

ちなみに読み込み元のファイルはこんな感じです。

stusample

 

このOCRサービスの現状の精度については、手書きや特殊なフォントでなければ概ね読み取ることができるようです。

 

今回は書いてあるものをとりあえず読み取る内容にしましたが、手順③のあたりで取得したテキストに対して正規表現でマッチさせるなどして使ってみましょう。

 

今回参考にさせていただいたページはこちらです。
ありがとうございました。

Files: insert | Drive REST API v2 | Google Developers

Drive Service | Apps Script | Google Developers

Google Apps script for performing OCR on all JPEGS found in the specified Drive folder. Extracts text to a Google sheet, where it’s mapped to the JPEG’s filename. · GitHub

Google Apps Scriptで画像の文字列を抜き出す – Qiita

 

 

その他、スプレッドシートやGASに関する記事はこちらからどうぞ。

GASを使ってGmailから本文の一部を抜き出す

スプレッドシート独自の便利な関数

QUERY関数の便利な使い方

スプレッドシートを使って簡単なスクレイピングをしてみよう

【GAS】正規表現を使ってGmailの本文から文章を抜き出す

【簡単】GASでスプレッドシートの送信リストからメールを送る

【GAS】正規表現を使って複数行の文章をGmailから抜き出す

【GAS】Gmailの添付ファイルを一括でGoogleドライブへ保存する

【難しくない】GASでwebスクレイピングして正規表現でデータを集める

【GAS】OCRを使った画像の文字取得を自動化する

 

それでは!


コメントをどうぞ

ツールの記事

  1. ai_search
    【GAS】OCRを使った画像の文字取得を自動化する
  2. dance_shoot_dance
    【難しくない】GASでwebスクレイピングして正規表現でデータを集める
  3. bg_kaitenzushi
    【GAS】Gmailの添付ファイルを自動でGoogleドライブへ保存する
  4. kid_job_boy_programmer
    【GAS】正規表現を使って複数行の文章をGmailから抜き出す