質問
Script: スクリプトはどこから記述しますか。どのように使い分けますか。
回答
FlexiCapture でスクリプトを記述でき、頻繁に使われる箇所は大きく下記です。
- 「文書定義 の 『1 フィールド』 に対して」の スクリプト(プログラミング) を行うスコープ: 『1 フィールド』
- 「文書定義 の 『Document Section 配下の 1~複数のフィールド』を使った」スクリプトを記述したい。スコープ: 『Document Section 配下の 1~複数のフィールド』
- 1文書定義上のパラメータ、Table: 表・RepeatingGroup: 繰り返しグループの各列、各行 、そして、もちろんフィールドなど「1文書定義にある全ての要素」を使って、スクリプト(プログラミング)を行う。スコープ:『1文書定義にある全ての要素』
- 1文書定義 で何度も使う「共通のスクリプト」(プログラミング)、メンバ≒変数を用意して使用する。スコープ:『同一の文書定義であれば、どこからでも参照可能な「共通のスクリプト」』
- 「1プロジェクト 上のパラメータ、Batch、Batch 内の各文書 など 『プロジェクトにある全ての要素』を使って」、スクリプト(プログラミング)を行う。スコープ: 『プロジェクトにある全ての要素』
以下、詳細を説明します。
「文書定義 の 「1 フィールド]」に対して」のスクリプト(プログラミング)を行う
文書定義 > フィールド > プロパティ の...
「データ」タブ > オートコレクション: [編集] > 「スクリプトの編集」を有効にして、[編集]
実際の記述例 (C#):
下図では、言語にC#を選択しています。その場合、既に IValue というクラス≒型 で オブジェクト≒変数 が 定義済みなので、そのまま使用できます。
C#では、 IValue というクラスで "Value"という値が定義済み:
// 上図のスクリプトのテキスト
string str = Value.Text;
// フィールドのテキストデータ を受け取った "str" のスペースを全て空文字で置換する。
str = str.Replace( " ", "" );
// フィールドに編集した値を戻す。
Value.Text = str;
「文書定義 の 『Document Section 配下の 1~複数のフィールド』を使った」スクリプトを記述したい
文書定義 > フィールド > プロパティ の...
「ルール」タブ > [新規編集]
表示されるダイアログで「スクリプト」を選択します。
以降の画面では、
- 任意のスクリプト名
- スクリプトの処理が何らかの理由で失敗した場合の扱いを「エラー」(処理をエラーが発生次第中止)とするか、「警告」(ログと結果にメッセージを出すが、処理を継続する)とするか
- どのような状態の時スクリプトを実行するかの簡単な条件設定
などを設定します。
実際の画面:
「ルールを適用」を選択した場合、文書定義の「いずれ1フィールド」が...
どのような状態の時スクリプトを実行するかの簡単な条件設定ができます。
条件設定が設定できたら、[次へ]進みます。
下図のような画面が表示されます。
図のように 「Document Section 」配下にある複数のフィールドを使ってのScript: プログラミングが可能です。
【注意】フィールドの「読み取り」専用の☑チェックを有効にすると、そのフィールドの値を変更できませんので注意してください。
フィールドの値の操作を行いたい場合は、「読み取り」専用の☑チェックを無効にしてください。
下図はルールのスクリプトエディタ画面。例はC#.Netのもの。
ルールのスクリプトでは、上図の「別名」がフィールドの参照用の名前として使用できます。
("Document Section1\Group\Field01"のようなパス指定の参照方法では長すぎるので、短い参照名が使用できます。)
// 上記の実際のスクリプト例:
using System;
using System.Globalization;
// 文字列の値を得る
string dateStr = Context.Field("Date").Text;
// Japanese Culendar
System.Globalization.CultureInfo ci = new System.Globalization.CultureInfo("ja-JP");
try{
// 日本語表記の日付変換
DateTime date = DateTime.Parse( dateStr, ci, System.Globalization.DateTimeStyles.AssumeLocal );
// 値を指定した文字列のフォーマットで格納する
Context.Field("Date_yyyyMMdd_hhmm").Text = date.ToString("yyyy/MM/dd HH:mm");
}
catch( Exception e )
{
}
1文書定義上のパラメータ、Table: 表・RepeatingGroup: 繰り返しグループの各列、各行 、そして、もちろんフィールドなど「1文書定義にある全ての要素」を使って、スクリプト(プログラミング)を行う
「文書定義」 > 「文書定義プロパティ」の...
「イベントハンドラ」タブから 「ハンドラ」の一覧にある、イベントにチェックを入れて有効にし、
[スクリプトの編集]をクリック。
【注意】[スクリプトの編集] ボタンは「ハンドラ」のイベントを選択しないと、ボタンは有効になりませんのでご注意ください。
スクリプトの編集画面 (言語はC#. Net の場合):
上図では、言語にC# .Net を選択しています。画面上には、既に定義済みの
型 (上図では IDocument ) とオブジェクトのインスタンス名 (上図では Document )
型 (上図では IScriptBinaryAttributtes ) とオブジェクトのインスタンス名 (上図では ChangedStates )
が定義済みなので、そのまま使用できます。
例: Table: 表 または Repeating Group: 繰り返し の 行数を取得する。
// 記述形式:
int rowCount = Document.Field( <Table: 表 または Repeating Group: 繰り返しへのフルパス> ).Items.Count;
記述例:
下図のような文書構造である場合:
// Table: 表の行数を得る例。
IFiled("<文書セクション名からのフルパスを記述>").Items.Count;
int rowCount = Document.Field( "Document Section 1\\LineItem" ).Items.Count;
// また、パスを何度も記述することが大変である場合、このように記述することもできます。
string docSec01 = "Document Section 1";
IField lineItem = Document.Field( docSec01 + "\\LineItem" );
int rowCount = lineItem.Items.Count;
// クラス: IField は 文書定義のフィールド の インスタンス を格納する FlexiCapture 独自のクラスです。
インスタンスには仕様に沿った様々な操作を行うことができます。詳しくは Help をご覧ください。
Table: 表 または Repeating Group: 繰り返し グループの要素の各行、列にアクセスしたい場合は、
例えば文書構造が下図のような形の場合、次の例をご参考ください。
// スクリプト例。例はC#。
string productName = "";
string qty = "";
string unit = "";
string unitPrice = "";
string amount = "";
// Table: 表 または Repeating Group: 繰り返し グループ の 要素 でない場合の要素の値へのアクセス方法
string totalAmount = Document.Field("Document Section 1\\TotalAmount").Text;
// Table: 表 または Repeating Group: 繰り返し グループ の 要素 へのアクセス方法
IField table = Document.Field("Document Section 1\\TransactionTable");
// 行数を取得
int rowCount = table.Items.Count;
// Table: 表 または Repeating Group: 繰り返し グループ の 各行の列要素の文字列の値へのアクセス方法
for( int i=0 ; i<rowCount ; i++ )
{
productName = table.Items[i].Field("ProductName").Text;
qty = table.Items[i].Field("Qty").Text;
unit = table.Items[i].Field("Unit").Text;
unitPrice = table.Items[i].Field("UnitPrice").Text;
amount = table.Items[i].Field("Amount").Text;
}
1文書定義 で何度も使う「共通のスクリプト」(プログラミング)、メンバ≒変数を用意して使用する。
グローバルなスコープを持つため、上で示した各スクリプト記述箇所で呼び出すことができる、共通のスクリプトを用意して、使用することが可能です。
「文書定義」 > 「スクリプトモジュール」 > 「ルールスクリプト」から開きます。
選択した言語の文法に従って、共通で使う、クラス、関数などを定義する。例はC# .Net
// 上記の実際のスクリプト。
// 入力した文字列を値段のような形式 (例: 100,000 )の文字列に変換するサンプル
using System;
namespace CommonUtilNameSpace
{
public class Util
{
public static string convertIntoPriceString( string str )
{
try{
int istr = int.Parse(str);
str = String.Format( "{0:#,0}", istr );
return str;
}catch(SystemException e ){
}
//Debug
//System.Windows.Forms.MessageBox.Show( "Collection str: " + str );
return str;
}
}
}
グローバルのスコープで定義したスクリプトは、同一プロジェクト内でスクリプトが記述できる、どこからでも呼び出せる。下は、文書定義のフィールドのスクリプトでの呼出し例:
// 上記の呼出し時の実際のスクリプト
string str = Value.Text;
str = CommonUtilNameSpace.Util.convertIntoPriceString(str);
Value.Text = str;
「1プロジェクト 上のパラメータ、Batch、Batch 内の各文書 など 『プロジェクトにある全ての要素』を使って」、スクリプト(プログラミング)を行う。
プロジェクト の メニューの 「プロジェクトプロパティ」の ...
「イベントハンドラ」タブ において、「ハンドラ」の中のイベントで、イベント後に動かしたいプログラミングを記述します。
【注意】[スクリプトの編集] ボタンは「ハンドラ」のイベントを選択しないと、ボタンは有効になりませんのでご注意ください。
スクリプトエディタが開いた状態:
上図では、言語にC# .Net を選択しています。画面上には、既に定義済みの型 (上図では IDocument ) とオブジェクトのインスタンス名 (上図では Document ) 、また定義済みの型 (上図では IScriptBinaryAttributes ) インスタンス: ChangedStates が定義済みなので、そのまま使用できます。
スクリプト例
「ページ追加後」イベントでの例
メニューの「プロジェクト」> 「プロジェクトプロパティ」から
「イベントハンドラ」の「ページ追加後」を選択して[スクリプトの編集]。
ここで使えるのは、FlexiCapture の 独自 クラス: IBatch、IPage の定義済みインスタンス、Batch、Page。イベントによって、定義済みの型、インスタンスは異なります。
C# .NET での画面例:
Batch に自動的に意図した名前をつける例:
スクリプトでディタでは、Page のAsBatchItem プロパティ で IPage を これもFlexiCapture の 独自 クラス: IBatchItem に変換する。
IBatchItem クラス 配下には、これもFlexiCapture の 独自 クラス: IBatch がある。
このクラスのプロパティ: Name が Batch の 名前を格納するので、この値を「ページを追加後」のタイミングで変える。
// コード例:
// 例では、Batch名に入力する画像ファイルの名前を付け、重複しないよう、Batchのインデックスを付与している。
// ----------------------------------------------------------------------------
//
using System;
string imageSourceFileSubPath = Page.ImageSourceFileSubPath;
int index = imageSourceFileSubPath.LastIndexOf(".");
string inputFileName = imageSourceFileSubPath;
if( index!=-1 )
{
try
{
inputFileName = imageSourceFileSubPath.Substring( 0, index );
Page.AsBatchItem.Batch.Name = inputFileName + Page.AsBatchItem.Batch.Id;
}
catch( Exception e )
{
// Unexpected Error
}
コメント
0件のコメント
サインインしてコメントを残してください。