Нахождение разницы между двумя полями с помощью JavaScript в iText

Я хотел бы найти разницу между двумя полями, используя JavaScript в iText.

Я могу найти их сумму, используя следующий код:

  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;");                         

Я разделил новые строки пробелами и добавил правые escape-символы.

Я также думал об использовании другой логики для вычитания с использованием методов AF: вот так

stamperResult.addJavaScript("var nameField = this.getField(\"total\");"+ "nameField.setAction(\"Calculate\",'AFSimple_Calculate(\"SUM\",\"total1\",  \"-total2\")')"); 

В приведенном выше коде я пытался добавить -(отрицательное значение) к итогу 2, чтобы он был вычтен из итога1, хотя метод AF по-прежнему «СУММ».

Но это не работает.

Приведенный ниже простой код работает:

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); }");

person javaAndBeyond    schedule 28.05.2013    source источник


Ответы (1)


Я обновил ваш вопрос, потому что он содержал много орфографических ошибок. Я не редактировал фрагмент кода, потому что не знаю, на что похож исходный фрагмент кода. В любом случае: я думаю, что что-то пошло не так во время процесса копирования/вставки, так как я не думаю, что ваш фрагмент кода компилируется в его текущем состоянии.

В любом случае: насколько я знаю, 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;

Вы можете поместить эти строки в строку, используя правильные escape-символы и заменив символы новой строки пробелами или символами новой строки.

Конечно, вам нужно где-то активировать этот код. Ниже вы найдете пример, который помещает отрицательное значение содержимого поля 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();
   }

Обратите внимание, что я использовал действие Blur. Это означает, что метод будет запущен, как только вы выберете другое поле после заполнения поля value1.

person Bruno Lowagie    schedule 29.05.2013
comment
Спасибо, Лоуаги. Я попробовал способ, который вы предложили, но, похоже, он не работает. Я добавил свои изменения в исходный вопрос. Я тоже думаю, что у AF-методов нет вычитания. - person javaAndBeyond; 29.05.2013
comment
Я думаю, ты близко. Главное отличие в том, что вы еще не задали действие. Таким образом, синтаксис для вычитания правильный, но он никогда не используется. - person Bruno Lowagie; 29.05.2013
comment
Да, я думаю, что мне этого не хватает. Не могли бы вы рассказать/записать, как установить действие. Я пробовал по-разному, например, setAction(MouseUp)... но не понимаю правильного синтаксиса. - person javaAndBeyond; 29.05.2013
comment
На первый взгляд, я бы сказал, что вам нужно определить действие /V для полей value1 и value2. В момент изменения значения одного из этих полей вам необходимо запустить метод (на уровне документа!), который вычисляет общее количество полей. Продолжайте пытаться; это единственный способ научиться ;-) - person Bruno Lowagie; 30.05.2013
comment
Ok. Я попытаюсь. Но не могли бы вы рассказать мне, как свести на нет определенное значение с помощью JS. Например, если пользователь вводит 2 в поле A, я хочу показать -2 в поле B. Если я получу это, я думаю, я смогу заставить работать вычитание. И доступных ресурсов по этой теме так мало, что мне очень тяжело, хотя я учусь чему-то новому. - person javaAndBeyond; 30.05.2013
comment
Да, я могу это сказать. Но нет, у меня нет времени. Я готовлю следующий выпуск iText, и это требует моего полного внимания. - person Bruno Lowagie; 31.05.2013
comment
Хотя это противоречит правилам SO (мы не должны делать домашнюю работу за людей вместо них), я написал небольшой пример, чтобы показать, насколько просто решение вашей проблемы. Не говорите своему учителю, что я написал это для вас! - person Bruno Lowagie; 31.05.2013
comment
Спасибо Лоуаги!! На самом деле я не студент, но у меня есть некоторая фобия, связанная с JS. Во всяком случае, я в основном искал действие «OnBlur». Я не знал, что крачка использовалась для этой акции, и мне пришлось нелегко. Удачи вашему следующему выпуску iText. - person javaAndBeyond; 31.05.2013
comment
А еще я не знал, что действие «Рассчитать» можно использовать для всех функций JS. Я думал, что это можно использовать только для методов AF. Мое решение было простым... Пожалуйста, посмотрите на него, если у вас есть время... Я обновляю его. - person javaAndBeyond; 31.05.2013
comment
Хороший пример! Я голосую за вопрос! - person Bruno Lowagie; 01.06.2013