FileMaker2024 - GetLiveTextAsJSONを使って請求書の金額を取得してみた
FileMaker2024リリース
2024年06月05日 FileMaker2024がリリースされました。
新機能としてGetLiveTextAsJSONが登場!
類似機能としてGetLiveTextがありましたが、GetLiveTextAsJSONでは位置情報が取得できるようになりました。
参考サイト
GetLiveTextAsJSONを使いたい
画像→文字起こしは使える機会があるため色々と試したい!!
ということで請求書から会社名・金額を取得しようと思います。
GetLiveTextAsJSONとは?
実行するとJSON形式のテキストを取得できます。(ヘルプページから引用)
この座標を元に請求書から会社名と金額を取得していきます。
[
{
"x": 113,
"y": 230,
"text": "Erickson's Water Garden"
},
{
"x": 288,
"y": 230,
"text": "Alea Marks"
},
{
"x": 421,
"y": 230,
"text": "2053 Lorem Rd."
},
{
"x": 493,
"y": 230,
"text": "12/22/2019"
}
]
準備
①請求書の画像を挿入するためのオブジェクトフィールド
②GetLiveTextAsJSONの戻り値を入力するフィールド
③取得した会社名を入力するフィールド
④取得した金額を入力するフィールド
⑤スクリプト実行ボタン
動作手順
1.請求書画像を挿入
2.実行ボタンクリック
取得方法
どのように会社名・金額を取得するべきか…
座標を固定して取得することも考えましたが、商品数が多い場合ずれる可能性があり汎用性に欠ける…
そのため、以下方法で取得するようにしました。
・会社名
請求書などの書類には基本的に会社名には株式会社がついている。
そのため、株式会社が含まれる文字を取得した場合、会社名とする。
※自社名を取得する場合があるため自社名は除く
・金額
今回は小計の金額を取得する。
小計 XXX円と記載される請求書が多いため、
小計と同じY座標の数字を小計の金額として取得する。
※後述で記載するがY座標は完全一致しない…
上記、取得方法にて会社名と金額を取得していきます。
JSONの値を取得する
詳しくはヘルプページで確認してください。
//sample
[
{
"x": 113,
"y": 230,
"text": "Erickson's Water Garden"
},
{
"x": 288,
"y": 230,
"text": "Alea Marks"
},
{
"x": 421,
"y": 230,
"text": "2053 Lorem Rd."
},
{
"x": 493,
"y": 230,
"text": "12/22/2019"
}
]
JSONGetElementを使用し、座標情報・テキスト情報を取得します。
//X座標を取得
JSONGetElement ( 画像オブジェクト ; ".[0].x")
→113
//y座標を取得
JSONGetElement ( 画像オブジェクト ; ".[0].y")
→230
//テキスト情報を取得
JSONGetElement ( 画像オブジェクト ; ".[0].text")
→Erickson's Water Garden
スクリプト作成
・会社名
PatternCountを使用し、株式会社が含まれる文字を会社名とする。
※自社名を取得する場合もあるため、自社名を含まない&株式会社が含まれるを条件にすれば取引先会社名を取得可能
・金額
・小計のy座標を取得
・小計のy座標±10のテキストを小計額として取得
# 画像→文字起こし
フィールド設定 [ OCR検証::JSON1 OCR検証::JSON1 ; GetLiveTextAsJSON ( OCR検証::画像1 ; "ja-JP" ) GetLiveTextAsJSON ( OCR検証::画像1 ; "ja-JP" ) ]
#
# 会社名・金額を取得
変数を設定 [ $i ; 値: 0 ]
変数を設定 [ $j ; 値: 0 ]
変数を設定 [ $小計y座標 ]
変数を設定 [ $小計額 ]
変数を設定 [ $会社名 ]
Loop [ フラッシュ: 常に ]
# 小計y座標取得
If [ IsEmpty ( $小計y座標 ) ]
Loop [ フラッシュ: 常に ]
If [ PatternCount ( JSONGetElement ( OCR検証::JSON1 ; ".[" & $j &"].text") ; "小計" ) = 1 ]
変数を設定 [ $小計y座標 ; 値: JSONGetElement ( OCR検証::JSON1 ; ".[" & $j &"].y") ]
End If
Exit Loop If [ not IsEmpty ( $小計y座標 ) or $j > 100 ]
変数を設定 [ $j ; 値: $j + 1 ]
End Loop
End If
#
# 小計額→小計と同列の金額を取得(許容値±10)
If [ IsEmpty ( $小計額 ) ]
If [ JSONGetElement ( OCR検証::JSON1 ; ".[" & $i &"].y")-10 < $小計y座標 and JSONGetElement ( OCR検証::JSON1 ; ".[" & $i &"].y")+10 > $小計y座標 and JSONGetElement ( OCR検証::JSON1 ; ".[" & $i &"].text") ≠ "小計" ]
変数を設定 [ $小計額 ; 値: JSONGetElement ( OCR検証::JSON1 ; ".[" & $i &"].text") ]
End If
End If
#
# 会社名→対象:株式会社
If [ IsEmpty ( $会社名 ) ]
If [ PatternCount ( JSONGetElement ( OCR検証::JSON1 ; ".[" & $i &"].text") ; "株式会社" ) = 1 ]
変数を設定 [ $会社名 ; 値: JSONGetElement ( OCR検証::JSON1 ; ".[" & $i &"].text") ]
End If
End If
#
Exit Loop If [ not IsEmpty ( $会社名 ) and not IsEmpty ( $小計額 ) or $i > 100 ]
変数を設定 [ $i ; 値: $i + 1 ]
End Loop
#
フィールド設定 [ OCR検証::会社名 OCR検証::会社名 ; $会社名 $会社名 ]
フィールド設定 [ OCR検証::金額 OCR検証::金額 ; $小計額 $小計額 ]
実行結果
会社名が少し異なるが、金額は取得可能
請求書の会社名記載場所に会社押印があるため完全に取得できていないもよう…
まとめ
・GetLiveTextAsJSON関数を使用して請求書から会社名・金額を抽出
・請求書によっては会社名・金額の記載場所が異なるため、以下条件で会社名,金額を取得
会社名→株式会社が入っている文字列。
金額 →小計のY座標と同じ数字
書類によっては[小 計| XXX円]など小計と言う文字列が取得できない場合は金額取得は厳しい。
感想
まだまだ、改善の余地はありそうですが、面白い関数が出てきたな〜と言う印象でした。
ご一読いただき、ありがとうございます。
おまけ
実用性を考えるのであれば、カスタムダイアログに取得値を表示させ、
手入力で修正できるようにしたほうがいいかも…