DR-C125の「他のアプリへ送る」が便利すぎる

DR-C125のCaptureOnTouchは出力方法に「他のアプリへ送る」を選ぶとスキャン後に起動する後続ジョブを指定することができます。
この機能を使用すればスキャン完了と同時に読取後の加工を自動で開始することができます。
ただし拡張子がexeのファイルしか指定できないので、exeファイルを作成する必要があります。


というわけでexeファイルを作ってみました。
次の機能があります。

  • 本の表紙画像からISBNのバーコードを読み取り、スキャンした画像をISBNと同じ名前のディレクトリに移動
  • 上記で作成したディレクトリをBatchLPに登録

このプログラムを使用するためには次の前提条件があります。

  • ZBarがインストールされていること
  • BatchLP(ChainLP)がインストールされていること


ここでexeを公開しても、自分ならこんなブログから落とした野良exeは怖くて実行できないので、ソースコードで公開します。
PCのことがちょっとはわかる人なら自力でexeにできるよう、コンパイルの手順も書いておきます。

ソースコード

postscan.js
import System.Windows.Forms
import System.Xml
import System.Diagnostics
import System.Text
import System.IO

try {
  //設定ファイルを読み込む
  var configXml = new XmlDocument()
  var exeFile = System.Reflection.Assembly.GetExecutingAssembly().Location
  var exeDir = Path.GetDirectoryName(exeFile)
  configXml.Load(exeDir + "\\" + '/config.xml')
  var pathes = configXml.SelectNodes("/postscan/config")
  var config = {}
  for (var i = 0; i < pathes.Count; i++) {
    var path = pathes[i]
    config[path.Attributes['name'].Value] = path.InnerText
  }
  
  //バーコードを読み取る
  var p = new Process()
  p.StartInfo.UseShellExecute = false
  p.StartInfo.RedirectStandardOutput = true
  p.StartInfo.RedirectStandardError = true
  p.StartInfo.FileName = config['ZBarimg']
  p.StartInfo.Arguments = "--xml " + config['SrcDir'] + "\\" + config['BarcodeImage']
  p.Start()
  var out = p.StandardOutput.ReadToEnd()
  var err = p.StandardError.ReadToEnd()
  p.WaitForExit()
  var exitCode = p.ExitCode
  
  //バーコードが正常に読み取れたかどうかをチェック
  if (exitCode != '0' || out.Trim.length == 0) {
    throw new Error('画像からバーコードを読み取れませんでした。' + "\n" + err + "\n")
  }
  
  //バーコードの読み取り結果からISBNコードを取得
  var barcodeXml = new XmlDocument()
  barcodeXml.LoadXml(out)
  var manager = new XmlNamespaceManager(barcodeXml.NameTable)
  manager.AddNamespace('zbar', 'http://zbar.sourceforge.net/2008/barcode')
  var barcodes = barcodeXml.SelectNodes('//zbar:symbol/zbar:data', manager)
  var isbn = barcodes[barcodes.Count - 1].InnerText
  
  //スキャンしたファイルの保存ディレクトリをISBNと同じ名前にリネーム
  var newDir = config['DestDir'] + "\\" + isbn
  Directory.Move(config['SrcDir'], newDir)
  //新規にスキャンしたファイルの保存ディレクトリを作成
  Directory.CreateDirectory(config['SrcDir'])
  
  //BatchLPにリネームしたディレクトリを登録
  Process.Start(config['BatchLP'], newDir)
  
} catch (e) {
  MessageBox.Show(e.toString())
}

以上の内容をメモ帳にコピペし、postscan.jsと名前をつけて保存してください。
ただし、保存ダイアログで文字コードにShift-JIS(なければSJIS、それもなければANSI)を選択して保存してください。

config.xml
<postscan>
  <!-- BatchLP.exeのフルパス -->
  <config name="BatchLP">E:\Software\ChainLP\BatchLP.exe</config>
  <!-- ZBarimg.exeのフルパス -->
  <config name="ZBarimg">C:\Program Files (x86)\ZBar\bin\zbarimg.exe</config>
  <!-- スキャンしたファイルが保存されるディレクトリのフルパス -->
  <config name="SrcDir">E:\自炊temp\scan</config>
  <!-- バーコードと同じ名前のディレクトリの作成先のフルパス -->
  <config name="DestDir">E:\自炊temp</config>
  <!-- バーコードを含む画像ファイルの名前 -->
  <config name="BarcodeImage">temp_000.bmp</config>
</postscan>

以上の内容をメモ帳にコピペし、各自の環境に合わせて設定を変更してください。
設定を変更したらpostscan.jsと名前をつけて保存してください。
ただし、保存ダイアログで文字コードUTF-8を選択して保存してください。

コンパイルと設定

コンパイル

コマンドプロンプトを起動します。

[スタートボタン]→[すべてのプログラム]→[アクセサリ]→[コマンドプロンプト]

コマンドプロンプトに次のコマンドを入力し、Enterキーを押下します。

C:\Windows\Microsoft.NET\Framework\v2.0.50727\jsc /out:C:\postscan.exe "postscan.jsのフルパス"

ただし次の点に注意が必要です。

  • postscan.jsのフルパスはダブルクォーテーションで囲うことを忘れないでください。
  • "v2.0.50727"の部分は人によっては異なるかもしれません。
    • その場合、C:\Windows\Microsoft.NET\Frameworkに"v2.0.〜"という名前のフォルダがあると思いますので、その名前に置き換えてコマンドを実行してください。
    • C:\Windows\Microsoft.NET\Framework自体がない場合はWindowsUpdateで.NET Frameworkをインストールしてください。
ファイルを移動

C:\にpostscan.exeというファイルができていますので、これを好きなディレクトリに移動します(任意。C:\に置いたままでもよい)。
また、config.xmlをpostscan.exeと同じディレクトリに移動します。

CaptureOnTouchに登録

CaptureOnTouchへ登録を行います。

  • 適当なジョブを作成し、「出力方法の選択」でpostscan.exeを選択します。
  • 「出力の設定」の「保存場所の選択」で、スキャンしたファイルがconfig.xmlで指定した場所に保存されるよう設定します。
  • 「出力の設定」の「ファイル名」で、バーコードを含む画像ファイルの名前がconfig.xmlで指定した名前になるように設定します。


以上です。