Asal mula masalahnya.
Belum lama ini, saya melakukan proyek kecil untuk menghasilkan laporan PDF melalui JSP, yang membuka mata. Beberapa informasi perusahaan berupa laporan Html melalui jaringan. Meskipun IE dapat langsung mencetak konten yang ditampilkan di dalamnya, dari sudut pandang antarmuka, jika hasil tampilan Html langsung dicetak, tampilannya tidak terlalu bagus. Jika Anda mengonversinya menjadi file PDF lalu mencetaknya, efek pencetakannya akan jauh lebih baik.
Pengenalan iText
iText adalah perpustakaan kelas Java open source yang dapat digunakan untuk menghasilkan file PDF dengan mudah. Anda dapat mengunduh perpustakaan kelas versi terbaru dengan mengunjungi http://sourceforge.net/project/showfiles.php?group_id=15255&release_id=167948. Setelah pengunduhan selesai, Anda akan mendapatkan paket .jar classpath JDK untuk menggunakannya. Jika karakter China, Jepang, dan Korea perlu muncul di file PDF yang dihasilkan, Anda juga perlu mengunduh paket iTextAsian.jar dengan mengunjungi http://itext.sourceforge.net/downloads/iTextAsian.jar .
Mengenai penggunaan perpustakaan kelas iText, http://www.lowagie.com/iText/tutorial/index.html memiliki tutorial yang lebih detail. Tutorial ini dimulai dari awal dan secara sistematis memperkenalkan metode dan teknik penempatan teks, gambar, tabel, dll dalam file PDF. Setelah membaca tutorial ini, Anda akan dapat membuat beberapa file PDF yang sederhana hingga yang rumit. Namun, mencoba menyelesaikan semua kesulitan yang dihadapi dalam proses menghasilkan file PDF melalui tutorial tidak diragukan lagi merupakan sebuah kemewahan. Oleh karena itu, sangat penting untuk membaca dokumentasi iText API. Saat pembaca mengunduh perpustakaan kelas, mereka juga bisa mengunduh dokumentasi perpustakaan kelas.
Cara menggunakan iText untuk menghasilkan laporan PDF dalam program java.
Berikut ini adalah contoh paling sederhana dalam tutorial di atas. Pembaca hanya perlu menambahkan konten yang ingin dimasukkan ke dalam file PDF di antara dua pernyataan document.open(); dan document.close();. Contoh ini hanya menambahkan sebaris teks "Hello World" ke file PDF.
Dokumen dokumen = Dokumen baru();
coba
{
PdfWriter.getInstance(dokumen, FileOutputStream baru ("Chap0101.pdf"));
dokumen.open
(
)
;
DocumentException de)
{
System.err.println(de.getMessage());
}
catch(IOException ioe)
{
System.err.println(ioe.getMessage()
}
document.close
();
contoh di atas, Kerangka programnya sangat jelas dan lugas. Namun, menentukan lokasi teks, gambar, dan tabel dalam PDF adalah tugas yang sangat merepotkan. Selain proses memodifikasi posisi dalam program secara terus-menerus, kemudian menjalankan program, menghasilkan file PDF, dan mengamati apakah posisi elemen dalam PDF masuk akal, sepertinya tidak ada cara lain yang lebih baik.
Cara menghasilkan laporan PDF melalui JSP
tidak tersedia di tutorial iText, dan informasi relevan di Internet relatif sedikit. Saya pernah melihat seseorang memposting di CSDN menanyakan detail implementasi, dan seseorang menjawab tentang prinsip implementasi: pertama buat file PDF di server, lalu pengguna memilih untuk mendownload atau membukanya dengan mengklik hyperlink yang menunjuk ke file PDF. Ini adalah sebuah ide, atau salah satu ide. Artikel ini mewujudkan ide tersebut dan memberikan ide lain serta mengimplementasikannya dalam dua cara.
1) Hasilkan file PDF langsung di server.
<%@ page import ="com.lowagie.text.*,com.lowagie.text.pdf.*, java.io.*"%>
<%
String filename = "PDF"+(new Random()).nextInt ()+".pdf" ;
Dokumen dokumen = Dokumen baru(PageSize.A4);
ServletOutputStream
out1 = respon.getOutputStream();
coba
{
Penulis PdfWriter = PdfWriter.getInstance(dokumen, FileOutputStream baru(nama file) );
);
document.add(Paragraf baru("Halo Dunia"));
dokumen.close();
}
catch(Pengecualian e){}%>
Program di atas menghasilkan file PDF statis di server. Jelasnya, nama file PDF yang diperoleh pada setiap proses harus unik dan tidak terduplikasi. Program ini menggunakan fungsi acak untuk memberi nama file PDF yang dihasilkan. Kekurangan dari program ini adalah setiap kali dijalankan, file PDF akan dihasilkan di server. Jika tidak dihapus tepat waktu, jumlahnya akan semakin besar. Hal ini jelas tidak diinginkan oleh pengelola situs melihat.
2) Transfer file PDF ke cache klien dalam bentuk stream. Keuntungannya adalah tidak meninggalkan "peninggalan" apa pun di server.
i) Hasilkan langsung melalui halaman JSP
<%@
halaman import="java.io.*,java.awt.Color,com.lowagie.text.*,com.lowagie.text.pdf.*"%>
<%
respon.setContentType( "application/pdf" );
Dokumen dokumen = Dokumen baru();
ByteArrayOutputStream
buffer
= ByteArrayOutputStream()
;
dokumen.close();
Keluaran DataOutput = DataOutputStream baru( respon.getOutputStream() );
byte[] byte = buffer.toByteArray();
respon.setContentLength
(bytes.length);
panjang; i++ )
{
keluaran.writeByte( byte[i]
)
;
ii) Dihasilkan melalui Servlet
impor java.io.*;
impor javax.servlet.*;
impor javax.servlet.http.*;
impor com.lowagie.text.*;
imporcom.lowagie.text.pdf
.*;
Respons HttpServletResponse)
menampilkan IOException,ServletException
{
Dokumen dokumen = Dokumen baru(PageSize.A4, 36,36,36,36);
ByteArrayOutputStream
ba = new ByteArrayOutputStream();
coba
{
Penulis PdfWriter = PdfWriter.getInstance(dokumen, ba);
.open();
document.add(Paragraf baru("Halo Dunia"));
}
catch(DocumentException de)
{
de.printStackTrace();
System.err.println("Kesalahan Dokumen:" +de.getMessage(); );
}
dokumen.close();
respon.setContentType("aplikasi/pdf");
respon.setContentLength(ba.size());
ServletOutputStreamkeluar
= respon.getOutputStream()
;
()
;
akhirnya
menggunakan pendekatan kedua dalam proyek saya. Kode sumber artikel ini telah di-debug di Tomcat4 saya. Semoga dapat memberikan kemudahan bagi semua orang.
Setiap orang boleh menggunakannya. Jika Anda perlu mencetak ulang, harap sebutkan sumbernya.