Solusi open source untuk melaporkan otomatisasi

Pengembang situs dan aplikasi seluler seringkali perlu mengontrol persiapan halaman PDF untuk dicetak atau dikirim ke pelanggan melalui pos.

File PDF memiliki kendali penuh atas tampilan teks dan gambar pada halaman. Sayangnya, pustaka untuk menghasilkan file PDF yang populasinya dinamis tidak termasuk dalam alat standar PHP, JS (Web), Java atau Swift (masing-masing untuk Android dan iOS). Pada artikel ini saya ingin memberi tahu Anda tentang solusi open source untuk menghasilkan file PDF.



JasperReports adalah pustaka Java open source untuk menghasilkan file yang diisi secara dinamis. Ini memiliki banyak alat untuk membuat formulir pelaporan yang kompleks, termasuk dalam format PDF, tetapi format lain juga tersedia: RTF, DOCX, HTML, XLS, XLS, CSV dan XML. Dengan kata lain, cukup membuat satu formulir, membuat satu tata letak - dan dimungkinkan untuk mengekspornya ke salah satu format di atas.

Ada juga perpustakaan yang baik, seperti PDFLib (versi komersial) untuk PHP dan versi open source dari PDFLib-Lite. Benar, pustaka cukup mahal, dan versi lite didistribusikan hanya dalam kode sumber, dan ketika diinstal di lingkungan pengembangan, batasan ini dapat menjadi masalah.

PDFbox adalah perpustakaan Java open source lain untuk bekerja dengan dokumen PDF. Ini memungkinkan Anda untuk membuat dokumen PDF baru, mengelola dokumen yang ada dengan kemampuan untuk mengekstrak konten darinya. Tetapi tidak memiliki UI (User Interface), tidak seperti JasperReports.

Saya pikir JasperReports sangat berguna dalam proyek-proyek besar yang terkait dengan pelaporan dan tidak hanya dalam format PDF. Ini memiliki semua yang Anda butuhkan untuk mengimplementasikannya dalam proyek Anda: pembuatan sederhana formulir pelaporan yang kompleks, UI untuk tata letak yang nyaman, aplikasi server dan integrasi sederhana dengan bagian depan.

Dalam artikel ini saya akan membahas topik-topik berikut:

  • Instal lingkungan pengembangan dan aplikasi server.
  • Buat file PDF yang secara otomatis terisi dari basis data.
  • Integrasi aplikasi server dengan front-end untuk mendapatkan PDF yang dibuat.

Untuk mulai menggunakan JasperReports dalam proyek Anda, Anda perlu mengunduh dua aplikasi: JaspersoftStudio - selanjutnya kami akan menyebutnya lingkungan kerja - dan JasperServer - kami akan memanggil aplikasi server .

JaspersoftStudio adalah lingkungan pengembangan berbasis Eclipse dengan pustaka JasperReports Java bawaan di mana file PDF dinamis atau statis dikembangkan: misalnya, tiket, kwitansi, kontrak, bagan analitik, dan lainnya.

JasperServer adalah aplikasi server tempat file digunakan dan disimpan dari JaspersoftStudio. Mereka dapat diakses dari aplikasi seluler atau web. JasperServer memiliki UI, dengan itu Anda dapat melihat laporan, membuat akun untuk pengguna yang berbeda dan memberi mereka akses yang sesuai. Anda juga dapat mengkonfigurasi milis ke email (Penjadwal).

Atur lingkungan kerja dan aplikasi server


Anda dapat mengunduh dan menginstal aplikasi menggunakan tautan di atas. Setelah pengaturan dua aplikasi, perlu untuk membuat koneksi dari lingkungan kerja ke aplikasi server.

Server → Buat Koneksi Server JasperReports → Tetapkan nama server, URL , nama pengguna, dan kata sandi yang diinginkan. Klik Uji Koneksi untuk memverifikasi bahwa koneksi ke server dibuat. Jika Anda melihat Sukses - melangkah lebih jauh.



Buat PDF yang populasinya dinamis dan publikasikan


Kami memasang lingkungan pengembangan, server dan membuat koneksi di antara mereka. Sekarang mari kita membuat file PDF primitif yang dinamis, yang ketika diluncurkan (dihasilkan) akan mengambil data dari PostgreSQL, dan menginstalnya pada aplikasi server.

Pertama-tama, Anda harus mengencangkan sumber data (dalam kasus kami, PostgreSQL) ke lingkungan kerja, dari mana PDF akan mengambil data. Kemudian mari kita mulai mengembangkan file PDF pertama kita.

Adaptor Data → Buat Adaptor Data → Basis Data Koneksi JDBS dan tentukan data koneksi:

  1. JDBC Driver - PostgreSQL (org.postgresql.Driver). Jika tidak ada driver untuk DBMS Anda, Anda dapat menginstal driver yang diperlukan di tab Driver Classpath.
  2. URL JDBC - itu terdiri dari host, port dan nama database mereka.
  3. Nama pengguna dan kata sandi - izin masuk dari akun DBMS Anda.



Kami mengklik tombol Tes yang sudah akrab bagi kami dan setelah koneksi berhasil (Berhasil) dengan database - Selesai .

Dari basis data ini, PDF akan diisi di lingkungan produksi. Karena kami berencana untuk menyebarkan file PDF pertama kami ke server, mari kita abaikan sumber data yang sama ke aplikasi server:

Sumber Data → Tambahkan Sumber Daya → Sumber Data dan ulangi semuanya dari titik di atas.

Sekarang Anda siap membuat PDF. Sumber di JasperReports disimpan dalam format JRXML - ini adalah XML dengan tag berkabel dan atribut yang bekerja dengan API JasperReports.

Klik File → Baru → Laporan Jasper → Kosong A4 → Tetapkan nama file JRXML → Selesai .



Setelah membuat proyek baru, Anda akan melihat gambar berikut:



Tujuh blok berbeda - masing-masing blok memiliki perilaku sendiri yang berbeda dari yang lain. Anda dapat membaca lebih lanjut tentang ini di dokumentasi . Dengan mengeklik Sumber, Anda dapat melihat struktur blok ini:

<?xml version="1.0" encoding="UTF-8"?> <jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="Example" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="ae9517f6-ff0b-41bb-a8dc-82196190e940"> <queryString> <![CDATA[]]> </queryString> <background> <band splitType="Stretch"/> </background> <title> <band height="79" splitType="Stretch"/> </title> <pageHeader> <band height="35" splitType="Stretch"/> </pageHeader> <columnHeader> <band height="61" splitType="Stretch"/> </columnHeader> <detail> <band height="125" splitType="Stretch"/> </detail> <columnFooter> <band height="45" splitType="Stretch"/> </columnFooter> <pageFooter> <band height="54" splitType="Stretch"/> </pageFooter> <summary> <band height="42" splitType="Stretch"/> </summary> </jasperReport> 

Jadi, mari kita hapus lima blok tambahan dan hanya menyisakan dua: Judul dan Detail. Tombol Hapus (Windows) atau Backspace (OS X) akan membantu kami dalam hal ini.

Sekarang tambahkan dua elemen. Anda dapat menambahkan elemen baru dengan dua cara: daftarkan wadah dalam struktur XML (tombol Sumber ) atau seret elemen yang diinginkan dari jendela Pallette kanan atas - Teks Statis, di mana akan ada nama bidang dan Bidang Teks, di dalamnya kita akan mengisi bidang variabel yang ditarik dari database:

 <?xml version="1.0" encoding="UTF-8"?> <jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="Example" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="ae9517f6-ff0b-41bb-a8dc-82196190e940"> <queryString> <![CDATA[]]> </queryString> <background> <band splitType="Stretch"/> </background> <title> <band height="30" splitType="Stretch"> <staticText> <reportElement x="0" y="0" width="100" height="30" uuid="7b697ed9-f52a-483c-965e-f0b2dc6130c1"/> <text> <![CDATA[Static Text]]> </text> </staticText> </band> </title> <detail> <band height="169" splitType="Stretch"> <textField> <reportElement x="0" y="0" width="100" height="20" uuid="41002e0b-ddb2-4e4b-a049-10810ab51208"/> <textFieldExpression> <![CDATA["Text Field"]]> </textFieldExpression> </textField> </band> </detail> </jasperReport> 

Permintaan dalam database dapat ditulis dalam tag queryString atau klik pada tombol dialog editor DataSet dan Query . Setelah itu, sebuah jendela baru akan terbuka di mana Anda perlu memilih sumber data (1), menulis kueri (2) dan mendeklarasikan variabel lapangan. Tombol Baca Bidang (3) akan membaca semua bidang secara otomatis berdasarkan permintaan yang valid . Untuk melihat data, klik pada Pratinjau data (4).



Hebat! Kami memiliki empat bidang tipe String, sekarang kami dapat melakukan hampir semua manipulasi dengan mereka. Sebagai contoh, kami cukup daftar mereka dan menulis sedikit logika.

Kami mencetak nama-nama bidang yang diperlukan dalam elemen Teks Statis dan menempatkannya dalam wadah Judul. Kami akan menunjukkan bidang variabel dalam elemen Bidang Teks dalam wadah Detail, karena akan berlipat ganda. PDF kami akan menampilkan nama, kota, dan alamat email. Agar tidak bosan sepenuhnya, mari kita menulis logika sederhana dalam elemen Bidang Teks, menggunakan bidang keempat - jenis kelamin klien, Jenis Kelamin.

Kami melakukan hal berikut: jika klien adalah seorang wanita, maka Mrs. akan ditambahkan di depan nama, jika pria itu adalah Mr. Untuk melakukan ini, gunakan operator ternary Java:

 <textFieldExpression> <![CDATA[$F{sex}.equals( "male" )?"Mr. "+$F{name}:"Mrs. "+$F{name}]]> </textFieldExpression> 

Dengan mengklik Pratinjau di sebelah tombol Sumber , Anda dapat melihat hasilnya:



Seperti yang dapat Anda lihat di tangkapan layar, PDF berhasil dikumpulkan: mengambil semua nilai dan menerapkan logika, dengan benar meletakkan Ny. dan Bp.

Kami juga akan mendapatkan parameter input Kota sehingga dimungkinkan untuk memfilter data berdasarkan kota. Ini dapat dilakukan dengan mengklik Parameter → Buat Parameter di jendela Garis Besar, atau dengan menambahkan tag parameter baru dengan atribut nama dan kelas :

 <parameter name="City" class="java.lang.String"/> 

Tinggal menambahkan parameter ke query SQL:

 SELECT Id, name, sex, city, email FROM users WHERE city = $P{City} 

Kami meneruskan nilai San Francisco ke parameter City (saya akan memberi tahu Anda di paragraf selanjutnya bagaimana melakukan ini) dan klik Pratinjau Data untuk melihat hasilnya.



PDF dikumpulkan dengan berhasil memfilter data. Kami melangkah lebih jauh

Karena kami sudah memiliki file PDF yang diisi secara dinamis, kami dapat mengunggahnya ke server untuk integrasi lebih lanjut dengan aplikasi front-end kami. Untuk melakukan ini, klik tombol Publikasikan Laporan ke JasperReports Server → klik dua kali untuk membuka server → Pilih folder server tempat untuk mengunduh PDF (dalam kasus kami, laporan ) → Selanjutnya → Sumber Data dari Repositori → pilih sumber data yang dibuat sebelumnya pada aplikasi server → Selesai .

Integrasi Frontend


API JasperReports mencakup implementasi RESTful-nya sendiri untuk interaksi client-server - REST v2 . Jika tidak cocok untuk Anda, Anda dapat menggunakan protokol akses objek sederhana - SOAP .

Kami akan mempertimbangkan REST v2.

Empat metode utama untuk tindakan CRUD (Buat-Baca-Perbarui-Hapus) tersedia: GET (dapatkan), POST (tambah, ubah, hapus), PUT (tambah, ganti), HAPUS (hapus). Semua informasi terperinci tersedia dalam dokumentasi di tautan di atas.

Kami akan mempertimbangkan metode GET yang lebih umum dan relevan untuk artikel ini.

 http://<host>:<port>/jasperserver[pro]/rest_v2/reports/path/to/report.<format>?<arguments> 

Di atas adalah permintaan sinkron , yang dengannya Anda bisa mendapatkan output file (selesai PDF) dalam satu permintaan-respons (Anda dapat menemukan panggilan asinkron di sini ).

Saya pikir semuanya jelas dengan host dan port, dan / reports / path / to / report adalah URI dari file yang dipanggil. Karena kami menyebarkan sumber file PDF (Example.jrxml) ke folder server laporan, versi URI yang diselesaikan adalah: / laporan / laporan / Contoh.

format adalah format (dalam kasus kami, PDF).
argumen adalah parameter.

Di atas, kami menambahkan parameter Kota, dan kami akan meneruskannya dalam permintaan dengan nilai San Francisco untuk memfilter data untuk kota ini.

Jika panggilan itu bukan dari zona yang diotorisasi, Anda perlu menambahkan dua parameter / atribut lagi: j_username dan j_password (log pass untuk otorisasi). Secara default, nama pengguna dan kata sandi di server adalah jasperadmin .

Jadi, kami mendapatkan URL berikut:

 http://localhost:8080/jasperserver/rest_v2/reports/reports/Example.PDF?city=San Francisco&j_username=jasperadmin&j_password=jasperadmin 

Jadi kita mendapatkan PDF yang sudah dibuat. Misalnya, ketika Anda memanggil URL ini melalui bilah alamat browser, file tersebut akan diunduh secara otomatis.

Anda mungkin perlu menampilkan gambar PDF. Misalnya, jika klien hanya ingin melihat file, Anda dapat menunjukkan dokumen dalam format PNG, jika Anda ingin mengunduhnya, maka dalam PDF.

Menggunakan Java sebagai contoh menggunakan perpustakaan PDFbox, kita akan melihat bagaimana Anda dapat membuat dan memilih file PDF dari aplikasi eksternal, dan kemudian mengonversinya menjadi PNG.

Di bawah ini adalah kelas PullPDF dengan satu metode yang menggunakan URL sebagai argumen.

 import java.awt.image.BufferedImage; import java.io.BufferedInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.net.URL; import java.util.Base64; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.rendering.ImageType; import org.apache.pdfbox.rendering.PDFRenderer; import org.apache.pdfbox.tools.imageio.ImageIOUtil; public class PullPDF { public String ConvertPDF2PNG(String valuefromParam) throws IOException { BufferedInputStream input_file = new BufferedInputStream(new URL(valuefromParam).openStream()); ByteArrayOutputStream baos = new ByteArrayOutputStream(); try { PDDocument document = PDDocument.load(input_file); PDFRenderer pdfRenderer = new PDFRenderer(document); for (int page = 0; page < document.getNumberOfPages(); ++page) { BufferedImage bim = pdfRenderer.renderImageWithDPI(page, 300, ImageType.RGB); ImageIOUtil.writeImage(bim, "png", baos); baos.flush(); byte[] encodedBytes = Base64.getEncoder().encode(baos.toByteArray()); valuefromParam = new String(encodedBytes); } } catch (Exception e) { } return valuefromParam; } } 

Anda bisa mendapatkan hasil yang sama menggunakan, misalnya, Kerangka Kerja Musim Semi. Tetapi saya mencoba menunjukkan cara universal yang dapat diterapkan pada Android dan web saat bekerja dengan Java.

Kesimpulan


Jika Anda ingin mengotomatiskan pembuatan cek sederhana untuk toko online dan Anda memiliki waktu terbatas untuk membuatnya, maka saya sarankan menggunakan alat asli proyek Anda atau kerangka kerja yang sudah dikenal. Karena waktu yang dihabiskan untuk menginstal JasperReports, pengenalan dokumen untuk pengembangan formulir pelaporan yang lebih kompleks mungkin tidak dapat dibenarkan. Dalam kasus lain, JasperReports adalah solusi open source yang bagus untuk melaporkan otomatisasi.

Source: https://habr.com/ru/post/id461719/


All Articles