在iText中使用JavaScript查找两个字段之间的差异

在iText中使用JavaScript查找两个字段之间的差异,javascript,adobe,itext,Javascript,Adobe,Itext,我想找出在iText中使用JavaScript的两个字段之间的区别 我可以使用以下代码找到它们的总和: PdfStamper stamperResult = new PdfStamper(readersectionResult, new FileOutputStream(RESULT_NEW)); stamperResult .addJavaScript("var nameField = this.getField(\"total\");"+ "nameField.setAction

我想找出在iText中使用JavaScript的两个字段之间的区别

我可以使用以下代码找到它们的总和:

  PdfStamper stamperResult = new PdfStamper(readersectionResult, new FileOutputStream(RESULT_NEW));

   stamperResult .addJavaScript("var nameField = this.getField(\"total\");"+ "nameField.setAction(\"Calculate\",'AFSimple_Calculate(\"SUM\",\"total1\",  \"total2\")')");
使用类似于我在上述代码片段中所做的“AFSimple_Calculate”是否有任何方法可以找到差异

谢谢你的编辑!我试过你的建议,但不知什么原因,它似乎不起作用

stamperResult.addJavaScript(" var total1 = this.getField(\"value1\"); var total2 = this.getField      (\"value2\"); var subtr = this.getField(\"total\"); subtr.value = total1.value - total2.value;");                         
我用空格分隔新行,并添加右转义字符

我也在考虑使用一种不同的逻辑来使用AF方法进行减法:像这样

stamperResult.addJavaScript("var nameField = this.getField(\"total\");"+ "nameField.setAction(\"Calculate\",'AFSimple_Calculate(\"SUM\",\"total1\",  \"-total2\")')"); 
在上面的代码中,我试图将-(负值)加到total2,这样就可以从total1中减去它,尽管AF方法仍然是“SUM”

但这是行不通的

下面的简单代码似乎有效:

stamperResult.addJavaScript("var nameField = this.getField('total');" +
        "nameField.setAction('Calculate'," +
        "'subtract()');" +
        "" +"function subtract(){this.getField('total').value        
                            = (this.getField('total_1').value -this.getField('total_2').value); }");

我更新了你的问题,因为它包含许多拼写错误。我没有编辑代码段,因为我不知道原始代码段是什么样的。在任何情况下:我认为在复制/粘贴过程中出现了一些问题,因为我不认为您的代码片段在其当前状态下编译

在任何情况下:据我所知,AF方法(AF代表Adobe Forms)可能不会出现在每个查看器中,而且据我所知,Adobe没有在AFSimple_Calculate方法中实现相互减去值的方法

出于这两个原因,您可能更喜欢使用常规JavaScript,而不是使用预封装的函数,该函数可能是预封装的,也可能不是预封装的

此常规JavaScript可能如下所示:

var total1 = this.getField("total1");
var total2 = this.getField("total2");
var subtr = this.getField("difference");
subtr.value = total1.value - total2.value;
我不确定这是否回答了你的问题。也许你只是想:

var total1 = this.getField("total1");
var total2 = this.getField("total2");
var namefield = total1.value - total2.value;
您可以使用正确的转义字符将这些行放在字符串中,并用空格或换行符替换换行符

当然,您需要在某个地方触发此代码。下面的示例将
value1
字段内容的负值放入
value2
字段

   public static void main(String[] args) throws IOException, DocumentException {
        Document document = new Document();
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("js.pdf"));
        document.open();
        writer.addJavaScript("function makeNegative() { this.getField('value2').value = -(this.getField('value1').value); } ");
        Rectangle rect1 = new Rectangle(40, 740, 200, 756);
        TextField value = new TextField(writer, rect1, "value1");
        value.setBorderColor(GrayColor.GRAYBLACK);
        value.setBorderWidth(0.5f);
        PdfFormField field = value.getTextField();
        field.setAdditionalActions(PdfName.BL, PdfAction.javaScript("makeNegative();", writer));
        writer.addAnnotation(field);
        Rectangle rect2 = new Rectangle(40, 710, 200, 726);
        TextField neg = new TextField(writer, rect2, "value2");
        neg.setBorderColor(GrayColor.GRAYBLACK);
        neg.setBorderWidth(0.5f);
        writer.addAnnotation(neg.getTextField());
        document.close();
   }

注意,我使用了模糊动作。这意味着在填写
value1
字段后,只要选择另一个字段,就会触发该方法。

谢谢Lowagie。我试过你建议的方法,但似乎不起作用。我在原来的问题中添加了我的更改。我也认为AF方法没有减法。我认为你们很接近。主要的区别是你还没有设定行动。所以减法的语法是正确的,但它从未被使用过。是的,我想我错过了它。请你写下如何采取行动好吗。我尝试了不同的方法,比如setAction(“MouseUp”)……但是我没有得到正确的语法。从我的头脑中,我想说您需要为value1和value2字段定义/V操作。当其中一个字段的值发生更改时,您需要触发(文档级别!)方法来计算字段总数。继续努力;这是唯一的学习方法;-)好啊我试试看。但是你能告诉我如何用JS来否定某个值吗。例如,如果用户在字段A中输入2,我想在字段B中显示-2。如果我得到这个值,我想我可以让副词工作。在这个话题上,可用的资源太少了,虽然我在学习东西,但我的日子真的很难过。
   public static void main(String[] args) throws IOException, DocumentException {
        Document document = new Document();
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("js.pdf"));
        document.open();
        writer.addJavaScript("function makeNegative() { this.getField('value2').value = -(this.getField('value1').value); } ");
        Rectangle rect1 = new Rectangle(40, 740, 200, 756);
        TextField value = new TextField(writer, rect1, "value1");
        value.setBorderColor(GrayColor.GRAYBLACK);
        value.setBorderWidth(0.5f);
        PdfFormField field = value.getTextField();
        field.setAdditionalActions(PdfName.BL, PdfAction.javaScript("makeNegative();", writer));
        writer.addAnnotation(field);
        Rectangle rect2 = new Rectangle(40, 710, 200, 726);
        TextField neg = new TextField(writer, rect2, "value2");
        neg.setBorderColor(GrayColor.GRAYBLACK);
        neg.setBorderWidth(0.5f);
        writer.addAnnotation(neg.getTextField());
        document.close();
   }