日記

OCR自動化システム 試作

一枚二枚なら下記事のやり方で。

https://logzitsu.tlog.work/%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E6%99%82%E3%81%AB%E4%BE%BF%E5%88%A9%E3%80%82%E7%94%BB%E5%83%8F%E5%86%85%E6%96%87%E5%AD%97%E3%82%92%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%81%AB/

画像をテキストに変換する仕組み。
googleドキュメントでもだいぶ楽なんだけど、Gasで試作して見た。

試作版

function get_ocr() {
  
  var lastRow = SpreadsheetApp.getActiveSheet().getLastRow();
  for(var i = 3; i <= lastRow; i++) {
  
  //画像にアクセス
  
  //Basic認証
  var sheetID = i;
  var sheetID1 = "B" + sheetID;
  var sheetID2 = "D" + sheetID;
  var sheetID3 = "E" + sheetID;
  var domain = SpreadsheetApp.getActiveSheet().getRange("B1").getValue();//取得URL
  var fileURL = SpreadsheetApp.getActiveSheet().getRange(sheetID1).getValue();
    
  var user = "hoge";
  var pass = "huga";
  var options = {
    "headers" : {"Authorization" : " Basic " + Utilities.base64Encode(user + ":" + pass)},
    "muteHttpExceptions": true
  };

  var file = UrlFetchApp.fetch(fileURL, options);
  var blob = file.getBlob();
  var name = "【文字起こし】" + fileURL;

  var file = {
    title: name,
    mimeType: 'image/png',
    parents:  [{"id": "XXXXXXXXXX"}]//フォルダのIDを入れる
  };
  
  var option = {
    ocr: true
  }
  
  file = Drive.Files.insert(file, blob, option);
  var doc = DocumentApp.openByUrl(file.embedLink);
  var body = doc.getBody().getText();
  var docID = doc.getId();
  var docUrl = "https://docs.google.com/document/d/" + docID + "/edit";
  
  //docファイルの操作
  var docFile = DocumentApp.openById(docID); //ドキュメントを取得
  var docText = docFile.getBody().getText()
  Logger.log(docFile.getName()); //ドキュメントタイトルをログに表示
  Logger.log(docText); //ドキュメントの内容をログに表示
  Logger.log(docUrl);
  
  SpreadsheetApp.getActiveSheet().getRange(sheetID2).setValue(docText);
  }
  
}

ループで処理してるけど、ちょっと高性能すぎるというか・・・
もっと単純にまとめたいなーと思いました。

上記はネット上の画像を取得してくる仕組みにしたのだけれど、画像URLが画一的でなくてエラーがおおくなってしまった。

特定のgoogledriveフォルダに入れた画像を文字認識 & スプレッドシートにリストアップ
の方が使いやすいかな、とおもいました。
上のプラグラムで利用しているfetchはめちゃくそ便利ですが、
回数制限があるらしいので。

改善版(ドライブフォルダ参照)

function get_ocr2() {
  
  var folderID = "xxxxxxxxxxx"; //文字起こし元画像のを入れるドライブのID
  
  var files = DriveApp.getFolderById(folderID).getFiles();
  for(var i = 0; files.hasNext(); i++) {
    var file = files.next();
    
    Logger.log(file);
    
    var sheetID = i + 1;
    var sheetID1 = "A" + sheetID;
    var sheetID2 = "B" + sheetID;
    var sheetID3 = "C" + sheetID;
    
    var blob = file.getBlob();
    var name = file.getName();
    
    var file = {
      title: name,
      mimeType: 'image/png',
      parents:  [{"id": folderID}]
    };
    
    var option = {
      ocr: true
    }
    
    file = Drive.Files.insert(file, blob, option);
    var doc = DocumentApp.openByUrl(file.embedLink);
    var body = doc.getBody().getText();
    var docID = doc.getId();
    var docUrl = "https://docs.google.com/document/d/" + docID + "/edit";
    
    //docファイルの操作
    var docFile = DocumentApp.openById(docID); //ドキュメントを取得
    var docText = docFile.getBody().getText();
    
    SpreadsheetApp.getActiveSheet().getRange(sheetID1).setValue(name);
    SpreadsheetApp.getActiveSheet().getRange(sheetID2).setValue(docText);
    SpreadsheetApp.getActiveSheet().getRange(sheetID3).setValue(docUrl);
   
  }
  
}
  • フォルダに画像をがばっといれる
  • 上記スクリプトを実行
  • スプレッドシートに書き起こし文字と、ドキュメントファイルのURLが記載されていく

このほうが安定性高くていい感じです。
そういう業務が多い方は活用してみてください。
名刺の画像とかで試すと超いいかもです。

こちらの記事もおすすめ!