ค้นหาความแตกต่างระหว่างสองฟิลด์โดยใช้ 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;");                         

ฉันแยกการขึ้นบรรทัดใหม่ด้วยช่องว่างและเพิ่มอักขระหลีกที่ถูกต้อง

ฉันยังคิดที่จะใช้ตรรกะที่แตกต่างกันในการลบโดยใช้วิธี AF เช่นนี้

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

ในโค้ดด้านบนฉันพยายามเพิ่ม - (ค่าลบ) ให้กับผลรวม 2 เพื่อที่มันจะถูกลบออกจากผลรวม 1 แม้ว่าวิธี 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); }");

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;

คุณสามารถใส่บรรทัดเหล่านี้ไว้ในสตริงได้โดยใช้อักขระหลีกที่ถูกต้อง และแทนที่บรรทัดใหม่ด้วยช่องว่างหรืออักขระขึ้นบรรทัดใหม่

แน่นอนว่าคุณต้องเรียกใช้โค้ดนี้ที่ไหนสักแห่ง ด้านล่างนี้คุณจะพบตัวอย่างที่ใส่ค่าลบของเนื้อหาของฟิลด์ 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

person Bruno Lowagie    schedule 29.05.2013
comment
ขอบคุณโลวากี ฉันลองใช้วิธีที่คุณแนะนำแล้ว แต่ดูเหมือนว่าจะไม่ได้ผล ฉันเพิ่มการเปลี่ยนแปลงในคำถามเดิมของฉัน ฉันก็คิดว่าวิธีโฟกัสอัตโนมัติไม่มีการลบออกเช่นกัน - 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
ตกลง. ฉันจะพยายาม. แต่คุณช่วยบอกฉันหน่อยได้ไหมว่าจะลบล้างค่าบางอย่างโดยใช้ 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