Menemukan perbedaan antara dua bidang menggunakan JavaScript di iText

Saya ingin menemukan perbedaan antara dua bidang menggunakan JavaScript di iText.

Saya dapat menemukan jumlahnya menggunakan kode di bawah ini:

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

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

Apakah ada cara untuk menemukan perbedaan menggunakan 'AFSimple_Calculate' seperti yang saya lakukan pada cuplikan kode di atas?

Terima kasih telah mengedit! Saya mencoba saran Anda tetapi sepertinya tidak berhasil karena alasan tertentu.

stamperResult.addJavaScript(" var total1 = this.getField(\"value1\"); var total2 = this.getField      (\"value2\"); var subtr = this.getField(\"total\"); subtr.value = total1.value - total2.value;");                         

Saya memisahkan baris baru dengan spasi dan menambahkan karakter escape kanan.

Saya juga berpikir untuk menggunakan logika berbeda untuk pengurangan menggunakan metode AF : seperti ini

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

Pada kode di atas saya mencoba menambahkan -(nilai negatif) ke total 2 agar dikurangi total1 meskipun metode AF masih 'SUM'.

Tapi itu tidak berhasil.

Kode sederhana di bawah ini sepertinya berfungsi:

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 sumber


Jawaban (1)


Saya memperbarui pertanyaan Anda karena mengandung banyak kesalahan ejaan. Saya tidak mengedit cuplikan kode tersebut karena saya tidak tahu cuplikan kode aslinya seperti apa. Bagaimanapun: Saya rasa ada yang tidak beres selama proses salin/tempel, karena menurut saya cuplikan kode Anda tidak dapat dikompilasi dalam kondisi saat ini.

Bagaimanapun: sejauh yang saya tahu metode AF (AF adalah singkatan dari Adobe Forms) mungkin tidak ada di setiap penampil, dan sejauh yang saya tahu Adobe tidak menerapkan cara untuk mengurangi nilai satu sama lain di Metode AFSimple_Calculate.

Karena dua alasan ini, Anda mungkin lebih memilih JavaScript biasa daripada menggunakan fungsi siap pakai yang mungkin sudah siap pakai atau belum.

JavaScript biasa ini mungkin terlihat seperti ini:

var total1 = this.getField("total1");
var total2 = this.getField("total2");
var subtr = this.getField("difference");
subtr.value = total1.value - total2.value;

Saya tidak yakin apakah itu menjawab pertanyaan Anda. Mungkin Anda hanya ingin:

var total1 = this.getField("total1");
var total2 = this.getField("total2");
var namefield = total1.value - total2.value;

Anda dapat meletakkan baris-baris ini di dalam sebuah String menggunakan karakter escape yang tepat dan mengganti baris baru dengan spasi atau karakter baris baru.

Tentu saja, Anda perlu memicu kode ini di suatu tempat. Di bawah ini Anda akan menemukan contoh yang menempatkan nilai negatif dari konten bidang value1 ke dalam bidang 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();
   }

Perhatikan bahwa saya menggunakan tindakan Blur. Ini berarti metode ini akan terpicu segera setelah Anda memilih kolom lain setelah mengisi kolom value1.

person Bruno Lowagie    schedule 29.05.2013
comment
Terima kasih Lowagie. Saya mencoba cara yang Anda sarankan tetapi sepertinya tidak berhasil. Saya menambahkan perubahan pada pertanyaan awal saya. Saya juga berpikir metode AF tidak memiliki pengurangan. - person javaAndBeyond; 29.05.2013
comment
Menurutku kamu sudah dekat. Perbedaan utamanya adalah Anda belum menetapkan tindakan. Jadi sintaks pengurangan sudah benar, tetapi tidak pernah digunakan. - person Bruno Lowagie; 29.05.2013
comment
Ya, saya pikir saya melewatkannya. Tolong jelaskan/tuliskan cara mengatur suatu tindakan. Saya mencobanya dengan berbagai cara seperti setAction(MouseUp)...tetapi saya tidak mendapatkan sintaks yang tepat. - person javaAndBeyond; 29.05.2013
comment
Dari atas kepala saya, menurut saya Anda perlu mendefinisikan tindakan /V untuk bidang value1 dan value2. Saat nilai salah satu bidang ini berubah, Anda perlu memicu metode (tingkat dokumen!) yang menghitung total bidang. Terus mencoba; itu satu-satunya cara untuk belajar ;-) - person Bruno Lowagie; 30.05.2013
comment
Oke. Saya akan mencoba. Tapi bisakah Anda memberi tahu saya cara meniadakan nilai tertentu menggunakan JS. Misalnya jika pengguna memasukkan 2 di bidang A, saya ingin menampilkan -2 di bidang B. Jika saya mendapatkan ini, saya kira pengurangannya bisa berfungsi. Dan sumber daya yang tersedia untuk topik ini sangat sedikit, saya mengalami kesulitan meskipun saya sedang mempelajari banyak hal. - person javaAndBeyond; 30.05.2013
comment
Ya, saya tahu itu. Tapi tidak, aku tidak punya waktu. Saya sedang mempersiapkan rilis iText berikutnya dan itu memerlukan perhatian penuh saya. - person Bruno Lowagie; 31.05.2013
comment
Meskipun ini melanggar aturan SO (kita tidak seharusnya mengerjakan pekerjaan rumah orang lain di tempat mereka), saya telah menulis sebuah contoh kecil untuk menunjukkan betapa sederhananya solusi untuk masalah Anda. Jangan bilang pada gurumu aku menulis ini untukmu! - person Bruno Lowagie; 31.05.2013
comment
Terima kasih Lowagie!! Sebenarnya saya bukan pelajar tetapi saya memiliki beberapa fobia terkait JS. Pokoknya saya terutama mencari aksi 'OnBlur'. Saya tidak tahu barang itu digunakan untuk tindakan itu dan mengalami masa-masa sulit. Semoga beruntung untuk rilis iText Anda berikutnya. - person javaAndBeyond; 31.05.2013
comment
Dan saya juga tidak tahu bahwa tindakan 'Hitung' dapat digunakan untuk semua fungsi JS. Saya pikir ini hanya bisa digunakan untuk metode AF. Solusi saya sederhana....Silakan lihat jika Anda punya waktu..Saya memperbaruinya. - person javaAndBeyond; 31.05.2013
comment
Contoh yang baik! Saya membatalkan pertanyaan itu! - person Bruno Lowagie; 01.06.2013