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)を使えばこの作業も自動化できます!

 

※2019/8/12 追記

スプレッドシートでの使い勝手を良くしたものを別途作成いたしましたのでよろしければそちらものご覧ください。

【GAS】お手軽なOCRの自動化をスプレッドシートで扱いやすくする

 

今回すること

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

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を使った画像の文字取得を自動化する

【GAS】お手軽なOCRの自動化をスプレッドシートで扱いやすくする

 

それでは!


この記事の作者

アバター
ヨシモト


総記事本数:18

この記事へのコメント

    • 佐藤雄太 さん
      2019年5月23日 9:03 PM
    • 返信

    上記のコードを使用したところ、どうしてもスプレッドシート上での配置順番がバラバラになってしまいます。そこで、上記のコードを応用して、A列に画像ファイル名、B列に画像から抽出した文字テキストを集計したいのですが、なかなか上手くいきません。何か良い手はありませんでしょうか。ご教授よろしくお願いいたします。

      • ヨシモト さん
        2019年8月8日 7:51 PM

      佐藤雄太 さん

      遅くなってしまいましたが、コメントありがとうございます。
      この内容ですと単に文字を抜き出すだけでしたので、もう少しスプレッドシートで扱いやすいコードに直してみました。
      別な記事にで解説しておりますのでよろしければご覧になってみてください。
      http://www.initialsite.com/g04/16371

コメントをどうぞ

知識の記事

  1. Young woman using a laptop computer. Graphic designer. UX design.
    仕事で大活躍のGoogle Chrome拡張機能を紹介
  2. 無題
    WordPressで出力内容が動的に変わる固定ページの<title>を変更
  3. ai_computer_sousa_robot
    【GAS】お手軽なOCRの自動化をスプレッドシートで扱いやすくする
  4. 無題
    暑い、暑いですね、会社(と紙)の話をします。

おすすめ記事

  1. 2vmuBJtYEC1oNxv1575967002_1575967016
    「波乱の幕開け」事業レポート(12/09~12/13)
  2. Qq6ekREW7NMriVV1575364443_1575364473
    「12月始まりました!」事業レポート(12/02~12/06)