Pdf.js: Dukungan bentuk interaktif (AcroForm)

Dibuat pada 7 Sep 2016  ·  28Komentar  ·  Sumber: mozilla/pdf.js

_Ini hanya masalah pelacakan, jadi ini bukan tempat untuk pertanyaan atau diskusi lain. Buka edisi baru untuk itu._

Ini adalah masalah meta untuk dukungan bentuk interaktif (AcroForm) menurut Bab 12.7 dari referensi PDF (http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/PDF32000_2008.pdf#G11 .2110737). Ini mencakup semua elemen formulir kecuali untuk bidang tanda tangan, yang dilacak di #1076. Tujuannya adalah untuk mendapatkan https://github.com/mozilla/pdf.js/blob/master/test/pdfs/f1040.pdf.link untuk merender sepenuhnya, tetapi juga untuk menyelesaikan masalah terbuka dan PR lainnya.

Umum

  • [x] Siapkan lapisan inti dan tampilan untuk mengimplementasikan elemen formulir (#7596)
  • [x] Pengujian referensi (#7602)
  • [x] Preferensi (#7602)
  • [x] Hapus penggunaan global PDFJS.renderInteractiveForms (#7640)
  • [x] Refactor kode konstruksi nama bidang di WidgetAnnotation (#7775)
  • [x] Memfaktorkan ulang atau mengklarifikasi di mana anotasi diberikan

    • Sebagian besar di lapisan tampilan, tetapi anotasi widget teks dengan aliran tampilan ditampilkan di lapisan inti, yang menyebabkan kebingungan...

  • [x] Penampilan
  • [x] Menyimpan nilai yang dimasukkan saat halaman dihancurkan saat tidak terlihat
  • [x] Mencetak nilai yang dimasukkan

    • Cetak elemen HTML atau render konten ke kanvas (gunakan appendToOperatorList )

  • [x] Aktifkan secara default
  • [x] Perbarui contoh (#8030)
  • [x] Tambahkan preferensi Firefox untuk mengaktifkan/menonaktifkan formulir (https://bugzilla.mozilla.org/show_bug.cgi?id=1652145)

Widget teks

  • [x] Rendering bidang satu baris (#7602)
  • [x] Menangani panjang maksimum (#7622)
  • [x] Menangani flag: multiline dan read-only (#7633)
  • [x] Menangani bendera: sisir (#7649)
  • [x] Menangani justifikasi (#7622)
  • [x] Sanitasi maxLen dan textAlignment di lapisan inti dan pengujian unit untuk ini (#7629)

Widget pilihan

  • [x] Rendering kotak kombo (#7671)
  • [x] Rendering kotak daftar (#7671)

Widget tombol

  • [x] Rendering tombol tekan (#9191)
  • [x] Rendering kotak centang (#7898)
  • [x] Rendering tombol radio (#7898)
4-annotations 4-form-acroform

Komentar yang paling membantu

Ini adalah masalah pelacakan (lihat https://github.com/mozilla/pdf.js/issues/7613#issuecomment-251895091), jadi ini bukan tempat untuk diskusi atau pertanyaan. Hubungi kami di IRC jika ada pertanyaan atau ajukan masalah terpisah jika Anda menemukan bug. Terima kasih.

_(Saya membuka percakapan agar pengguna dapat menggunakan tombol reaksi untuk mengukur minat terhadap fitur ini, tetapi komentar yang tidak relevan akan dihapus.)_

Semua 28 komentar

Ini adalah masalah meta untuk melacak dukungan formulir interaktif (AcroForm) menurut Bab 8.6 dari referensi PDF (https://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/pdf_reference_1-7. pdf#page=671&zoom=auto,-246.244).

Mungkin ide yang baik untuk mendasarkan pekerjaan pada versi terbaru dari spesifikasi PDF, untuk berjaga-jaga jika ada perbedaan: http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/ pdfs/PDF32000_2008.pdf#G11.2110737.

Juga, mungkin ide yang baik untuk menambahkan item TODO "Umum" tentang memastikan cakupan pengujian yang tepat?

Kedua item telah ditangani. Terima kasih!

Saya pikir kita juga harus benar-benar mengurai isi dari kamus AcroForm , karena jika tidak, kita tidak dapat, misalnya, memuat semua sumber daya font yang diperlukan.
Jelas, kita tidak dapat menggunakan font khusus di lapisan tampilan, tetapi setidaknya kita harus dapat menyimpulkan keluarga font yang benar (dan hal-hal seperti misalnya tebal/miring) yang harus digunakan dan meneruskan info itu ke lapisan tampilan.

Juga, untuk mencetak formulir, kita mungkin dapat menggunakan (atau membangun) fungsionalitas appendToOperatorList sudah ada, tetapi itu pasti akan membutuhkan sumber daya font yang ada di kamus AcroForm telah dimuat.

Hal lain yang mungkin harus kita dukung, adalah menggunakan warna teks yang benar di lapisan tampilan (perhatikan bagaimana di Adobe Reader teks dalam bidang formulir f1040.pdf berwarna biru). Ini mungkin terkait dengan dukungan streaming Appearance lebih baik dan lebih lengkap.

Akhirnya, pertanyaan umum: Apakah kami benar-benar dapat mendukung formulir dengan cara yang berarti, tanpa dukungan skrip parsial (dan disanitasi dengan baik)?

Poin bagus. Saya baru saja menambahkannya ke daftar item di atas. Saya tidak berpikir kami benar-benar membutuhkan dukungan skrip karena AcroForms umumnya hanya membutuhkan pengisian dan pencetakan. Skrip AFAIK hanya digunakan untuk interaksi antar elemen, tetapi kami dapat mengimplementasikan sendiri fungsi yang paling sering digunakan (seperti menyetel ulang formulir atau tindakan tombol untuk mencetaknya). Kita harus melihat seberapa banyak fungsi skrip semacam itu digunakan.

Menangani flag: multiline dan read-only

Ada flag lain yang mungkin perlu kita coba dan dukung juga, salah satu contohnya adalah comb yang mengontrol jarak antar karakter dalam bidang input. Yang itu sebenarnya digunakan pada halaman kedua f1040.pdf , lihat bidang "Nomor identifikasi pribadi (PIN)".

Kedengarannya seperti ide yang bagus. Saya telah menambahkannya ke daftar.

Mungkin juga merupakan ide yang baik untuk melihat apakah kode WidgetAnnotation yang membangun properti fullName dapat dibersihkan atau diperbaiki, lihat https://github.com/mozilla/pdf.js /blob/6c263c19946af23b723f148d9f05118971e18b36/src/core/annotation.js#L640 -L670.

Juga, mengenai WidgetAnnotation s tampaknya jenis yang berbeda dapat memiliki persyaratan yang berbeda untuk entri V dalam kamus anotasi, jadi mungkin lebih baik untuk mengambil dan memvalidasi data.fieldValue di _each_ subkelas WidgetAnnotation .

Poin pertama sekarang ada dalam daftar, yang saya punya beberapa ide. Saya mengetahui tentang poin kedua di tambalan yang saat ini saya selesaikan untuk anotasi widget pilihan, sehingga akan dibahas di sana.

Hai @timvandermeij
Kapan fungsi ini akan tersedia? Bagaimana saya bisa membantu?

Saat ini kami sedang dalam proses menerapkan ini, tetapi ini adalah sebagian besar fungsi yang akan memakan waktu sebelum selesai. Kotak yang dicentang di atas menunjukkan elemen mana yang sudah diterapkan dan untuk kotak lain sudah ada permintaan tarik yang sedang dikerjakan, jadi kami berada di jalur yang tepat dengan fungsi ini. Jangan ragu untuk mengujinya dengan menggunakan cabang master dan menyetel parameter renderInteractiveForms ke true . Ini dinonaktifkan secara default karena belum siap.

Terima kasih tim, apa yang bisa Anda ceritakan tentang tanda tangan digital? Ada kemajuan menurut utas diskusi ini https://github.com/mozilla/pdf.js/issues/1076

Ini dilaporkan oleh pengguna: soa-x membuka masalah ini pada 13 Jan 2012

Hampir 5 tahun telah berlalu sejak dilaporkan.

Bahkan seseorang telah melakukan banyak implementasi

viveksjain berkomentar pada 22 Februari
@complience Hai, saya punya bukti konsep yang berfungsi di https://github.com/viveksjain/pdf.js/tree/sig-verify-support. Anda dapat mencobanya dengan menggunakan git clone --recursive https://github.com/viveksjain/pdf.js.git. Dengan sedikit lebih banyak pekerjaan, itu Harus siap untuk permintaan tarik ke esta repo, tapi saya belum punya waktu.

Tahukah Anda jika pekerjaan ini ditambahkan ke pdf.js versi terbaru?

Re: https://github.com/mozilla/pdf.js/issues/7613#issuecomment -251692825

Tanda tangan dalam file PDF adalah topik yang besar dan kompleks, topik yang agak ortogonal dengan penerapan dukungan AcroForm dasar (yang merupakan masalah _ini_ yang dilacak).

Masalah saat ini hanyalah masalah pelacakan untuk implementasi fitur dasar AcroForm, tanda tangan sudah dilacak di tempat lain (di #1076, di situlah fitur itu harus dibahas).

@lexcorp Harap jangan memposting informasi yang tidak terkait dan/atau mengajukan pertanyaan di sini, karena hal itu mengurangi tujuan masalah ini (yaitu melacak dukungan untuk fitur dasar AcroForm).
Selain itu, sekarang Anda pada dasarnya telah memposting informasi yang sama dalam _tiga_ masalah yang berbeda, mohon jangan mengirim spam ke pelacak masalah dengan cara ini!

Halo @timvandermeij @Snuffleupagus ,
Kami sangat menyukai solusi Anda untuk menambahkan dukungan untuk bidang AcroForm. Kami berencana untuk menggunakan fitur ini dalam aplikasi yang sedang kami kembangkan. Kami sangat menghargai jika Anda dapat memberi kami tanggal tentatif di mana Anda dapat menambahkan dukungan untuk semua jenis bidang formulir seperti kotak centang, dll. dan mengekspor data yang diisi ke file XFDF atau format lainnya. Terima kasih.

@anujgeek Seperti yang telah saya sebutkan di https://github.com/mozilla/pdf.js/issues/7613#issuecomment -251699579 , ini adalah masalah _tracking_ dan bukan tempat yang baik untuk diskusi umum semacam ini dan/ atau bertanya!

Ada beberapa TODO yang cukup sulit untuk diterapkan, lihat daftar yang mungkin tidak lengkap di atas, oleh karena itu _tidak_ mungkin untuk memberikan perkiraan kapan, atau bahkan jika, fitur ini akan diimplementasikan sepenuhnya.

Juga, perhatikan bahwa sejauh ini semua pekerjaan telah dilakukan oleh kontributor, dan mengingat Mozilla mengganti PDF.js di Firefox (lihat https://wiki.mozilla.org/Mortar_Project) dukungan formulir kemungkinan besar akan memakan waktu cukup lama untuk diselesaikan.

Ini adalah masalah pelacakan (lihat https://github.com/mozilla/pdf.js/issues/7613#issuecomment-251895091), jadi ini bukan tempat untuk diskusi atau pertanyaan. Hubungi kami di IRC jika ada pertanyaan atau ajukan masalah terpisah jika Anda menemukan bug. Terima kasih.

_(Saya membuka percakapan agar pengguna dapat menggunakan tombol reaksi untuk mengukur minat terhadap fitur ini, tetapi komentar yang tidak relevan akan dihapus.)_

Halo bersama!

Bagaimana perkembangan pengisian AcroForm?
Contoh yang digunakan https://www.irs.gov/pub/irs-pdf/f1040.pdf (dan lainnya) masih tidak berfungsi. Atau tidak dikonfigurasi secara default?
Beberapa JavaScript dasar seperti bidang setel, bidang kosong, dukungan tombol kirim disebutkan?

Terima kasih.

@Alex-DE-74 Harap baca komentar di atas dengan cermat, khususnya https://github.com/mozilla/pdf.js/issues/7613#issuecomment -251895091 dan https://github.com/mozilla/pdf. js/issues/7613#issuecomment -287907674 relevan.
Selanjutnya, Anda telah menanyakan pertanyaan-pertanyaan ini di #9261 (di mana jawaban disediakan); tolong mari kita coba dan menjaga masalah pelacakan ini bebas dari diskusi umum semacam itu.

@Snuffleupagus

Maaf, tapi bagi saya itu tidak benar-benar dapat dilacak melalui banyak topik, item mana yang memiliki tahap mana. Dan referensi siklik tidak membantu sama sekali. Dari sudut https://github.com/mozilla/pdf.js/projects/1 jelas bagi saya, gambar AcroForms apa yang didukung sekarang (sepenuhnya) dan apa yang ada dalam rencana. Selain itu, banyak topik membahas renering/viewing, tetapi tidak ada kata-kata tentang fitur interaktif fill/check/select/submitt dll. Jadi, dengan contoh, bagian "Widget teks" di atas tidak memiliki apa pun tentang "Pengetikan teks". Daripada, jika "Kamus AcroForm" saat ini tidak diuraikan sama sekali, bagaimana cara kerjanya dengan sangat baik?
Mungkin jika akan membantu "pengguna" untuk melihat tabel sederhana di mana fitur AcroForm dengan propertinya dan status dukungan keseluruhan/khusus/direncanakan terdaftar. (mengapa ini menunjukkan bold=?!)

PS Ini menyakitkan bagi saya, saya bukan ahli JS/HTML5, tetapi melakukan banyak hal di situs lain (membuat PDF dengan C#) dan juga akrab dengan bahasa pemrograman lain. Apakah layak bagi saya untuk mencoba memahami kode saat ini untuk memberikan dukungan dan bantuan yang lebih interaktif untuk mengembangkan proyek ini? Atau apakah ini akan memakan banyak waktu hanya untuk memahami arsitektur saat ini?

Saya telah menghapus gaya berani untuk Anda. Saya ingin menekankan lagi bahwa ini bukan tempat untuk diskusi seperti itu; saluran seperti IRC akan lebih tepat sehingga kami dapat memberikan beberapa informasi latar belakang. Pengisian/pengiriman/pencetakan formulir sebenarnya sudah ada di checkbox list di atas, hanya saja belum dilaksanakan. Bagian "widget teks" adalah tentang merender widget teks, yang berarti bidang input yang dapat Anda ketik. Selesai; bagian yang tersisa adalah menyimpan nilai yang dimasukkan. Siapapun dipersilakan untuk membantu dengan menerapkan ini.

BTW: Chrome juga tidak dapat menyimpan PDF dengan formulir, tetapi ada solusinya. Formulir dirender secara default dan seseorang dapat mencetaknya dan bahkan dapat mencetaknya sebagai PDF secara default, termasuk input formulir.

Mungkin ini juga berlaku untuk pdf.js dan kita bisa memanfaatkan penyimpanan FF yang ada sebagai PDF ( https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/tabs/saveAsPDF )?

Saya bermain-main dengan pdf.js mencoba mencetak nilai bidang teks formulir yang dimasukkan. Saya memiliki bukti konsep kerja yang belum sempurna di mana saya dapat membuat nilai yang dimasukkan ke PDF pencetakan. Sekarang saya ingin mendiskusikan pendekatan saya dan melihat apakah seseorang datang dengan pendekatan yang lebih baik atau lebih sederhana.

Dalam pendekatan saya, saya meneruskan nilai yang dimasukkan ke tugas pekerja dengan menambahkan peta ke tugas. Peta ini saat ini diisi pada acara 'sebelum cetak'.
Dalam metode 'getOperatorList' dari 'TextWidgetAnnotation' saya membaca aliran objek dan mengganti nilai teks lama dari operator 'Tj' dengan yang baru. Ini berhasil, tetapi memiliki banyak masalah yang datang. Yang pertama adalah, gagal, jika aliran tidak memiliki operator 'Tj' karena bidang tidak memiliki nilai. Yang kedua, penempatan untuk alignment selain 'kiri' akan salah.
Jadi ide selanjutnya adalah membuat aliran baru yang menghitung semua nilai sendiri. Ini akan banyak pekerjaan, jadi saya ingin membahas pendekatan ini terlebih dahulu.
Saya sudah dapat membuat aliran baru dan menampilkan nilainya, tetapi sekali lagi, ada masalah dengan nilai offset dari operasi 'Td'. Saya menggali sedikit ke dalam kode dan saya pikir saya perlu menghitung posisi X dan Y offset dengan memperhitungkan lebar dan tinggi String dengan Font yang diberikan. Saya menemukan FontDescriptor untuk satu font yang disematkan, tetapi tidak untuk font sistem. Dengan deskriptor font saya memiliki nilai naik dan turun dari font, yang dengannya saya pikir saya dapat menghitung offset y X offset akan diperbaiki untuk teks rata kiri, tetapi perlu dihitung untuk teks rata tengah, atau rata kanan . Saya pikir saya dapat melakukan ini dengan array lebar dari Font xRef, tetapi sekali lagi, tidak ada yang seperti itu untuk font sistem. Jadi saya pikir saya harus menggunakan kanvas dan metode measureText.

Jadi seperti yang Anda lihat, ada banyak 'pemikiran'. Tetapi sebelum saya mencoba menerapkan dan menguji pendekatan saya, saya ingin tahu apa yang dipikirkan orang lain tentangnya.

Beberapa waktu lalu kami berdiskusi tentang bagaimana kami bisa mendekati ini. Lihat https://mozilla.logbot.info/pdfjs/20161219. Idenya adalah memiliki dua daftar operator yang berbeda: satu untuk UI dan satu untuk pencetakan. Dalam satu untuk pencetakan, kami akan mengganti operasi berdasarkan nilai yang dimasukkan/dipilih di widget.

Saya pikir ini agak lebih mudah daripada yang Anda gambarkan karena kami membiarkan logika yang tersisa melakukan pekerjaan berat untuk kami; kita hanya perlu memberikan daftar operator yang benar.

Ini adalah masalah yang harus kita selesaikan dalam beberapa langkah kecil. Langkah pertama adalah membuat kode anotasi menjadi asinkron, yang dilakukan oleh @dmitryskey di #9822. Langkah selanjutnya adalah mengurai kamus AcroForm misalnya, font dan mengurai entri tampilan default dalam kamus anotasi untuk semua informasi tampilan. Untuk ini kita mungkin dapat menggunakan evaluator untuk mendapatkan informasi sebagai daftar operator, yang memerlukan kode anotasi menjadi asinkron. Kemudian, kita dapat membuat daftar operator pencetakan untuk setiap jenis anotasi.

Saya juga berpikir untuk membuat daftar operasi sendiri, tetapi ini akan lebih rumit bagi saya daripada pendekatan saya. Saya baru saja membuat aliran objek pdf dengan 'BMC ... EMC' dan meneruskan aliran ke evaluator, yang menghasilkan daftar operasi.
Jika saya membuat larik daftar operasi sendiri, saya akan memiliki masalah yang sama dengan menghasilkan aliran objek baru. Tapi imho lebih rumit untuk membuat oplist daripada membuat string dan mengubahnya menjadi objectstream. Ini sudah berfungsi di bukti konsep saya.

Saya pikir Opera/Chrome juga menggunakan pdf.js, tetapi Opera dapat mencetak & menggunakan data formular. Mungkin ada st. kita dapat menggunakan kembali?

Mereka menggunakan PDFium, yang sebagian besar merupakan kode C++.

Hai semua, perusahaan tempat saya bekerja mulai memanfaatkan PDFJS dan saya telah diberi tahu bahwa saya perlu mendapatkan "Menyimpan nilai yang dimasukkan ketika halaman dihancurkan ketika tidak terlihat" berfungsi. Saya tidak yakin apakah utas ini adalah tempat yang tepat untuk membahasnya. @timvandermeij , sepertinya Anda adalah pendorong utama proyek ini. Apakah ada cara kami dapat menghubungi Anda atau seseorang dari komunitas yang mungkin dapat membantu. Saya memiliki strategi untuk mengimplementasikan fitur ini, tetapi saya ingin memastikan bahwa apa yang saya lakukan juga dapat digarisbawahi kembali ke dalam repo ini. Kami juga bersedia mensponsori atau membuat beberapa fitur bounty juga, jika itu akan membantu menyelesaikan masalah lebih cepat.

Jika Anda memiliki ide tentang bagaimana hal ini harus dilakukan, yang terbaik adalah membuka masalah terpisah untuk mendiskusikannya. Pertanyaan utamanya adalah apa yang harus dilakukan dengan data yang dimasukkan. Render ke kanvas saat mencetak? Berikan opsi untuk mengunduh nilai dalam format FDF? Render file PDF baru dengan nilai yang diisi? dan lain-lain. Itu tergantung pada apa yang diharapkan pengguna dan apa yang dilakukan pembaca PDF lainnya.

Menutup karena dukungan AcroForm sekarang telah selesai dan diaktifkan. Masalah yang tersisa sekarang diajukan dalam masalah individu dan dikumpulkan dengan tag 4-form-acroform ; lihat https://github.com/mozilla/pdf.js/labels/4-form-acroform.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat