Habrahabr, rekan-rekan yang terkasih!
Masalah mencetak data dalam dokumen PDF bukanlah hal baru, saya bukan yang pertama dan saya bukan yang terakhir yang menemukannya, jadi saya memutuskan untuk membagikan pengalaman saya dalam memecahkan dan pada saat yang sama mempersembahkan perhatian Anda pada web kecil aplikasi tentang topik ini.
1. Format PDF bagus karena tidak dapat diedit. Bagaimanapun, pengguna biasa tidak mungkin terlibat dalam mengedit dokumen PDF. Artinya, format PDF sangat sesuai untuk pertukaran dokumen penting secara hukum.
2. Format PDF buruk karena tidak dapat diedit). membuat template, mengisi kumpulan data formulir dokumen PDF dalam mode otomatis itu sulit, dan mode manual memerlukan pemasangan aplikasi berbayar dan berat.
Sebagai seorang programmer, saya sangat memperhatikan poin ke-2. Bagaimana cara mencetak kumpulan data yang diperlukan ke dalam dokumen PDF di aplikasi perangkat lunak?
Googling lain tentang topik ini tidak membawa hasil apa pun.
Aku hanya berhasil google bahwa segala sesuatu yang buruk dengan mengetik ( Mengapa begitu sulit untuk mengambil teks dari PDF? , PDF dari sudut pandang programmer ) dan ada pilihan untuk template file docx pertama, ini tidak sulit untuk melakukan ( Mengisi dokumen di Microsoft Word ... ), dan kemudian mengonversi file docx konsol libreoffice (librewrite) ke PDF. Semua ini dapat dilakukan secara otomatis dari aplikasi.
Tetapi pertama-tama, keputusan seperti itu berarti bahwa proyek tersebut akan memiliki ketergantungan yang besar pada libreoffice.
Dan kedua, saat mengonversi docx ke PDF di libreoffice, dokumen terlihat sedikit berbeda dari tampilannya di word, dan / atau PDF yang dihasilkan dalam kata dari file docx.
Akhirnya, mari beralih ke inti dari solusi yang sedang dipertimbangkan. Tentu saja, "templating" dalam hal ini adalah kata yang keras, tetapi solusi yang diusulkan cukup cocok dan berguna.
Di python (dan php) ada beberapa perpustakaan (tidak sulit untuk google) yang memungkinkan Anda untuk mencetak string dan gambar ke dalam file PDF, kami menggunakan pdfrw + reportlab.Canvas. Artinya, pada prinsipnya, tidak ada masalah untuk mengetik data, masalah dengan pustaka ini adalah untuk setiap bidang Anda perlu menetapkan koordinat persisnya dalam dokumen, yang berarti
1.Kami membutuhkan semacam fungsionalitas terpadu yang akan menyimpan koordinat bidang tidak di dalam kode sumber, tetapi dalam file terpisah. Saya akan segera mengklarifikasi bahwa dari pengalaman saya sarankan untuk menyimpan koordinat ini dalam file dan di bawah kendali versi, mis. komit koordinat bersama dengan formulir dan metode PDF yang sesuai yang menghasilkan sekumpulan dokumen tertentu. Dan jangan memasukkan koordinat ini ke dalam database, karena ini akan menyulitkan untuk melakukan rollback ke versi (koordinat) dokumen sebelumnya, jika diperlukan. Semuanya tampak jelas di sini.
2. Koordinat ini harus dihitung entah bagaimana, dan ini adalah tugas yang menyedihkan jika Anda melakukannya secara manual.
Ide utamanya di sini adalah membuat elemen div yang dapat dipindahkan di browser, gunakan mouse untuk menyesuaikan posisinya ke tempat yang diinginkan di dokumen dan simpan koordinat elemen yang diperoleh di browser ke file di backend. Sebenarnya kedua poin ini diimplementasikan dalam aplikasi.
Mode aplikasi
Sepertinya aplikasi web kecil dengan front-end dan back-end, mis. menerbitkannya sebagai paket python, mungkin, tidak akan berfungsi.
1. Unduh sumber dari gita
2. Instal dependensi
3. Baca README.md (instal dan konfigurasi nginx untuk file statis)
4. Di folder dokumen, buat subfolder dengan nama dokumen yang perlu dibuat dan di dalamnya subfolder ini membuat dua file dan (jika perlu) satu direktori dengan gambar:
- form.pdf # form dokumen tempat Anda perlu
mencetak data - field.json # parameter bidang yang perlu dicetak
- gambar # adalah opsional, serangkaian gambar yang perlu diketik. Saya
sarankan Anda juga menyimpan file docx asli (jika ada), yang tidak terlibat dalam pembuatan dokumen, tetapi akan berguna jika Anda perlu buat perubahan dan buat ulang formulir dokumen PDF
- form.docx # tidak diperlukan, nama apa pun
File fields.json memiliki struktur berikut, misalnya:
{ "0": [ [32.25, 710.25, "fio", "DejaVuSans", 12, 420], [425.25, 681.75, "gender", "DejaVuSans", 12, 18], [206.25, 681.75, "birth_date", "DejaVuSans", 12, 173], [462.75, 681.53, "foto.jpg", "DejaVuSans", 12, 92], [146.25, 665.25, "birth_place", "DejaVuSans", 12, 418], [228.0, 634.5, "registration", "DejaVuSans", 12, 340] ], "1": [ [132.0, 720.76, "1_work", "DejaVuSans", 10, 260], [132.0, 697.51, "2_work", "DejaVuSans", 10, 260], [132.0, 673.51, "3_work", "DejaVuSans", 10, 141] ] }
Menambahkan / menghapus baris ke file ini menambah / menghapus bidang yang dicetak ke dalam formulir
5. Buka halaman untuk bidang pengaturan (http://127.0.0.1/tpdf/positioning?pdf_name=ZayavlenieNaZagranpasport&page_num=1)
6. Sesuaikan posisi kolom dengan mouse di browser dan simpan posisi ini
7. Mouse tidak selalu dapat secara akurat mengatur posisi kolom yang diinginkan, untuk menyesuaikan posisi kolom, Anda dapat membuka file fieldd.json dan mengoreksi koordinat secara manual. Data dalam file diurutkan berdasarkan koordinat Y dan setiap bidang disimpan pada barisnya sendiri di file. Itu. file dengan koordinat bidang diformat dengan rapi, yang memungkinkan Anda untuk secara manual, dengan mudah membuat penyesuaian yang diperlukan.
delapan.Kami membuat metode lain untuk mencetak jenis dokumen ini (jika Anda perlu menyiapkan data awal dan / atau mengambilnya bukan dari depan, tetapi dari backend).
9. Jika semuanya sudah beres, maka komit field dataset yang dihasilkan. Json dan file (tidak hanya ke git saya, tetapi ke git lokal Anda, meskipun jika dokumen tersebut dapat berguna untuk orang lain, maka Anda dapat mengumpulkan bank dokumen publik , itu ide).
File yang dihasilkan dengan koordinat dapat digunakan di proyek lain, dalam bahasa pemrograman lain, misalnya php, karena koordinat di file tersebut ditulis dalam satuan ukuran (titik) yang digunakan dalam file PDF.
Jika Anda memiliki proyek python, maka kode sumber aplikasi ini dapat dengan mudah disematkan ke dalam proyek dan, melalui penggunaan kelas Tpdf utama, buat PDF di tempat yang nyaman dalam kode.
Seringkali perlu untuk menghasilkan tidak hanya satu dokumen dari beberapa halaman, tetapi untuk mengumpulkan beberapa dokumen menjadi satu file PDF, yang masing-masing harus dicetak dalam urutan yang benar dan beberapa di antaranya lebih dari satu kali. Kelas utama aplikasi ini memiliki metode khusus untuk kebutuhan ini yang menghasilkan sekumpulan dokumen, lihat metode pemrosesan / tpdf / example /.
Data harus diteruskan ke kelas utama saat membuat instance. Kelas utama dapat diperpanjang dengan properti (@property), yang akan dihitung berdasarkan data masukan dan dimasukkan ke dalam PDF dengan nama properti = nama bidang. Jadi dalam contoh, bidang fio ditampilkan, dan data ditransmisikan last_name, first_name, middle_name. Anda
dapat menerapkan aplikasi kecil ini sebagai layanan independen, dan semua aplikasi lain di lingkungan akan mengaksesnya untuk dokumen yang diperlukan melalui jaringan , tetapi kemudian akan ada biaya transmisi melalui jaringan, file PDF tidak terlalu "ringan", pembuatan dokumen itu sendiri cepat.
Daripada ratusan kata, terkadang lebih baik menonton instruksi video (saya tidak merekam suara).
Pengalaman implementasi (rake).
- PyPDF2, 28 3 , - . , , , , , , , - . , — . , pdfrw , , . .. 28 0.3 . : , , , .
- ajax, , .
- PDF. , , 3/4, PDF. , , .
(TODO)
- .
, / / / () fields.json - , , .
- , PDF-.
- Metode umum yang mengambil set data sebagai masukan dan mengembalikan kumpulan dokumen.