0

iTextsharpで自動計算フィールドを作成する方法はありますか? JavaScript でこれを実行しようとしましたが、問題は、フィールド値が特定のイベント (マウスオーバー、マウスアップなど) 中にのみ更新されることです。イベントを使用すると、マウス カーソルを移動したときにのみフィールド値が更新されます。フィールドに値を書き込み、マウスカーソルを別の場所に移動してEnterキーを押しても、更新されません。カーソルをフィールドに戻すと更新されます。「フィールド値が変更されました」などのイベントはありませんか?

4

1 に答える 1

1

HTML のような「on changed」イベントはありませんが、「on focus」イベントと「on blur」イベントがあるため、独自のイベントを簡単に作成できます。以下のコードはこれを示しています。最初にグローバルな JavaScript 変数を作成します (これは必要ありません。その行は破棄できます。考えるのに役立ちます)。次に、標準のテキスト フィールドを作成し、Fo(フォーカス) イベントとBl(ブラー) イベントの 2 つのアクションを設定します。これらのイベントやその他のイベントは、PDF 標準セクション 12.6.3 の表 194 で見つけることができます。

focus イベントでは、現在のテキスト フィールドの値を格納しているだけです。ぼかしイベントでは、ストアの値と新しい値を比較し、それらが同じか異なるかを警告しています。フィールドがたくさんある場合は、個々の変数の代わりにグローバル配列を使用することもできます。詳細については、コードのコメントを参照してください。これは、iTextSharp 5.4.2.0 に対してテストされました。

//Our test file
var testFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Test.pdf");

//Standard PDF creation, nothing special
using (var fs = new FileStream(testFile, FileMode.Create, FileAccess.Write, FileShare.None)) {
    using (var doc = new Document()) {
        using (var writer = PdfWriter.GetInstance(doc, fs)) {
            doc.Open();

            //Add a global variable. This line is 100% not needed but it helps me think more clearly
            writer.AddJavaScript(PdfAction.JavaScript("var first_name = '';", writer));

            //Create a text field
            var tf = new TextField(writer, new iTextSharp.text.Rectangle(50, 50, 300, 100), "first_name");
            //Give it some style and default text
            tf.BorderStyle = PdfBorderDictionary.STYLE_INSET;
            tf.BorderColor = BaseColor.BLACK;
            tf.Text = "First Name";

            //Get the underlying form field object
            var tfa = tf.GetTextField();

            //On focus (Fo) store the value in our global variable
            tfa.SetAdditionalActions(PdfName.FO, PdfAction.JavaScript("first_name = this.getField('first_name').value;", writer));

            //On blur (Bl) compare the old value with the entered value and do something if they are the same/different
            tfa.SetAdditionalActions(PdfName.BL, PdfAction.JavaScript("var old_value = first_name; var new_value = this.getField('first_name').value; if(old_value != new_value){app.alert('Different');}else{app.alert('Same');}", writer));

            //Add our form field to the document
            writer.AddAnnotation(tfa);

            doc.Close();
        }
    }
}
于 2013-10-09T14:06:15.933 に答える