ITextsharp c#字段计算

时间:2013-10-09 10:39:45

标签: c# javascript pdf itextsharp field

有没有办法用iTextsharp自动计算字段?我试过用javascript做这个,但问题是字段值只在某些事件(例如mouseover,mouseup)中得到更新。如果我使用事件,则只有在移动鼠标光标时才会更新字段值。如果我将值写入字段,然后将鼠标光标移动到其他位置然后按回车键,则它们不会更新。当我将光标移回到字段时,它们会更新。 Afaik没有像“字段值改变”或类似事件的事件吗?

1 个答案:

答案 0 :(得分:1)

没有像HTML中那样的“on changed”事件,但是有“on focus”和“on blur”事件,所以你可以很容易地编写自己的事件。下面的代码显示了这一点。它首先创建一个全局JavaScript变量(不需要,您可以丢弃该行,它只是帮助我思考)。然后,它创建一个标准文本字段并设置两个操作,Fo(焦点)事件和Bl(模糊)事件。您可以在PDF标准第12.6.3节表194中找到这些事件和其他事件。

在焦点事件中,我只是存储当前文本字段的值。在模糊事件中,我将商店值与新值进行比较,然后仅警告它们是相同还是不同。如果你有一堆字段,你可能也想要使用全局数组而不是单个变量。有关更多信息,请参阅代码注释。这是针对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();
        }
    }
}