Saya berjuang dengan sedikit Proyek Java: Saya membuat Program yang mengisi otomatis PDF Formular. Sebagian besar semuanya berfungsi dengan baik untuk saya, tetapi ada Masalah: Dalam Formular PDF ini (yang diberikan dari perusahaan saya, jadi saya harus berurusan dengan dokumen ini) adalah Bidang equotion, yang digunakan untuk menghitung Biaya dari Jumlah Item dan harga tunggal. Ketika saya memasukkan Harga satu Item sebagai String ke PDF saya

    public void setEinzelpreis(String Einzelpreis)
{
    try {
        fieldList.get(30).setValue(Einzelpreis);
...

enter image description here

Harus ada Harga tunggal pada bidang kosong di baris pertama. Sel terakhir dari baris dihitung secara otomatis oleh pdf. Ketika Saya Mengklik PDF di Bidang "kosong", Nilai muncul: masukkan deskripsi gambar di sinihttps://1drv.ms/b/s!Av6exjPNXlgOioouAuXL6QV4eUGkqg? >

Dan ini adalah file yang saya buat: https://1drv.ms/b/s!Av6exjPNXlgOioovK-HuRuXW2aRy_w? D1ZCA8

Yang aneh adalah: ketika saya mengubah nilai dalam dokumen dengan tangan, semuanya berjalan normal, bahkan dengan Penampil Dokumen yang berbeda.

0
Bastian 19 November 2020, 16:27

1 menjawab

Jawaban Terbaik

Pertama-tama, struktur formulir AcroForm di PDF Anda aneh. Sepertinya seseorang menggunakan alat pembuat bentuk grafis yang dia tidak mengerti dan mengklik, menyeret, menjatuhkan, menyalin, ... sampai formulir di pemirsa melakukan apa yang dia inginkan, tidak peduli tentang itu menjadi sulit untuk dipertahankan.

Khususnya bidang Einzelpreis memiliki struktur bidang menengah dan akhir yang sama sekali tidak diperlukan, mis.

screen shot

Jadi, bidang Einzelpreis in € exkl USt1 ('€' tidak ada di pohon di atas) bukan yang harus diisi, itu hanya bidang perantara. Bidang formulir yang sebenarnya untuk diisi adalah Einzelpreis in € exkl USt1.0.0.0.0.

Sayangnya Anda dalam kode Anda cukup mengambil bidang ke-30 dalam daftar bidang yang dikembalikan oleh PDAcroForm, dan bidang ini merupakan bidang perantara Einzelpreis in € exkl USt1; sebagai bidang perantara, ia tidak memiliki widget sendiri yang terlihat, jadi panggilan setValue Anda tidak mengubah Einzelpreis yang terlihat.

Instruksi JavaScript yang menghitung Gesamtpreis juga menggunakan nilai dari bidang terakhir:

AFSimple_Calculate("PRD", new Array ("Anzahl1", "Einzelpreis in € exkl USt1.0.0.0.0"));

Namun karena nilai bidang dapat diwariskan dan tidak ada bidang .0 yang memiliki nilai sendiri, penghitungan melihat nilai 100 setelah penghitungan formulir dipicu dan menggunakannya.

Jadi, Anda harus mengisi bidang Einzelpreis in € exkl USt1.0.0.0.0 sebagai gantinya. Dan cara yang lebih aman untuk mengambilnya bukan dengan indeks dalam daftar bidang tetapi dengan nama:

PDField fieldByName = acroForm.getField("Einzelpreis in € exkl USt1.0.0.0.0");

(kutipan dari FillInForm tes testFill2020_04BeschaffungsantragEinzelpreis)

Setelah mengisi bidang itu, "100" akan terlihat di formulir Anda.

Masalah yang tersisa bahwa nilai Gesamtpreis tidak dihitung adalah karena fakta yang telah disebutkan oleh @Tilman dalam komentar untuk pertanyaan: PDFBox tidak menggunakan javascript. Dengan demikian, Anda harus menghitung sendiri nilai-nilai itu dan memperbarui bidang yang bersangkutan.

Jika Anda perlu mengetahui nama bidang formulir yang benar, Anda dapat melakukan seperti yang diusulkan Tilman dan menggunakan PDFBox PDFDebugger. Jika Anda mengarahkan kursor ke bidang di sana, itu akan menampilkan nama di bilah status di bagian bawah.

Omong-omong, metode AcroForm getFields tidak akan mengembalikan bidang yang diperlukan di sini. Seperti yang didokumentasikan dalam JavaDocs-nya, metode ini akan mengembalikan semua bidang akar dokumen, tidak ada bidang yang lebih rendah dalam hierarki, setidaknya tidak segera. (Dari perspektif pengguna, nama metode getFields adalah keliru. Namun, akurat, dari perspektif spesifikasi PDF karena entri yang sesuai dalam objek AcroForms memiliki kunci Fields .)

Namun, berhati-hatilah, Anda mungkin harus memperbarui versi PDFBox Anda. Di versi sebelumnya, PDFBox tidak memperbarui tampilan bidang dengan tindakan JavaScript (yakin beberapa JavaScript akan mengisinya). Saya menggunakan 3.0.0-SNAPSHOT saat ini di mana perilaku itu telah diubah.

1
mkl 20 November 2020, 14:54