ต้นกำเนิดของปัญหา
ไม่นานมานี้ ฉันได้ทำโปรเจ็กต์เล็กๆ เพื่อสร้างรายงาน PDF ผ่าน JSP ซึ่งช่วยเปิดหูเปิดตาได้ แบบฟอร์มข้อมูลของบริษัทบางส่วนรายงานผ่านเครือข่าย แม้ว่า IE จะสามารถพิมพ์เนื้อหาที่แสดงอยู่ในนั้นได้โดยตรง แต่จากมุมมองของอินเทอร์เฟซ หากผลลัพธ์ของการแสดงผล Html ถูกพิมพ์ออกมาโดยตรง แต่ก็ดูไม่สวยงามมากนัก หากคุณแปลงเป็นไฟล์ PDF แล้วพิมพ์ออกมา ผลการพิมพ์จะดีกว่ามาก
ข้อมูลเบื้องต้นเกี่ยวกับ iText
iText เป็นไลบรารีคลาส Java โอเพ่นซอร์สที่สามารถใช้สร้างไฟล์ PDF ได้อย่างง่ายดาย คุณสามารถดาวน์โหลดเวอร์ชันล่าสุดของไลบรารีคลาสได้โดยไปที่ http://sourceforge.net/project/showfiles.php?group_id=15255&release_id=167948 หลังจากการดาวน์โหลดเสร็จสิ้น คุณจะได้รับแพ็คเกจ .jar คลาสพาธ JDK ที่จะใช้ หากอักขระจีน ญี่ปุ่น และเกาหลีต้องปรากฏในไฟล์ PDF ที่สร้างขึ้น คุณจะต้องดาวน์โหลดแพ็คเกจ iTextAsian.jar โดยไปที่ http://itext.sourceforge.net/downloads/iTextAsian.jar
เกี่ยวกับการใช้ไลบรารีคลาส iText นั้น http://www.lowagie.com/iText/tutorial/index.html มีบทช่วยสอนที่ละเอียดมากขึ้น บทช่วยสอนนี้เริ่มต้นตั้งแต่ต้นและแนะนำวิธีการและเทคนิคในการวางข้อความ รูปภาพ ตาราง ฯลฯ อย่างเป็นระบบในไฟล์ PDF หลังจากอ่านบทช่วยสอนนี้แล้ว คุณจะสามารถสร้างไฟล์ PDF ที่เรียบง่ายถึงซับซ้อนได้ อย่างไรก็ตาม การพยายามแก้ไขปัญหาทั้งหมดที่พบในกระบวนการสร้างไฟล์ PDF ผ่านบทช่วยสอนถือเป็นเรื่องหรูหราอย่างไม่ต้องสงสัย ดังนั้นจึงเป็นเรื่องสำคัญมากที่จะต้องอ่านเอกสาร iText API เมื่อผู้อ่านดาวน์โหลดไลบรารีของชั้นเรียน พวกเขาก็จะสามารถดาวน์โหลดเอกสารประกอบของไลบรารีของชั้นเรียนได้เช่นกัน
วิธีใช้ iText เพื่อสร้างรายงาน PDF ในโปรแกรม Java
ต่อไปนี้เป็นตัวอย่างที่ง่ายที่สุดในบทช่วยสอนข้างต้น ตัวอย่างนี้แสดงให้เห็นกรอบงานโปรแกรมทั่วไปสำหรับการสร้างไฟล์ PDF ผ่าน iText ผู้อ่านจำเป็นต้องเพิ่มเนื้อหาที่ต้องการใส่ลงในไฟล์ PDF ระหว่างสองคำสั่ง document.open(); และ document.close(); ตัวอย่างนี้เพิ่มเฉพาะบรรทัดข้อความ "Hello World" ลงในไฟล์ PDF
เอกสารเอกสาร = เอกสารใหม่ ();
ลอง
{
PdfWriter.getInstance (เอกสาร, FileOutputStream ใหม่ ("Chap0101.pdf"));
document.open
();
document.add (ย่อหน้าใหม่ ("Hello World")
}
DocumentException de)
{
System.err.println(de.getMessage());
}
catch(IOException ioe)
{
System.err.println(ioe.getMessage());
}
document.close()
; ตัวอย่างข้างต้น กรอบการทำงานของโปรแกรมมีความชัดเจนและตรงไปตรงมามาก อย่างไรก็ตาม การระบุตำแหน่งของข้อความ รูปภาพ และตารางในรูปแบบ PDF ถือเป็นงานที่ยุ่งยากมาก นอกเหนือจากกระบวนการแก้ไขตำแหน่งในโปรแกรมอย่างต่อเนื่อง จากนั้นรันโปรแกรม สร้างไฟล์ PDF และการสังเกตตำแหน่งขององค์ประกอบใน PDF ว่าสมเหตุสมผลหรือไม่ ดูเหมือนจะไม่มีวิธีอื่นใดที่ดีไปกว่านี้แล้ว
วิธีสร้างรายงาน PDF ผ่าน JSP
ไม่มีอยู่ในบทช่วยสอน iText และมีข้อมูลที่เกี่ยวข้องค่อนข้างน้อยบนอินเทอร์เน็ต ครั้งหนึ่งฉันเคยเห็นมีคนโพสต์บน CSDN เพื่อขอรายละเอียดการใช้งาน และมีคนตอบกลับเกี่ยวกับหลักการนำไปใช้งาน โดยให้สร้างไฟล์ PDF บนเซิร์ฟเวอร์ก่อน จากนั้นผู้ใช้เลือกที่จะดาวน์โหลดหรือเปิดไฟล์โดยคลิกที่ไฮเปอร์ลิงก์ที่ชี้ไปที่ไฟล์ PDF นี่คือความคิดหรือความคิดอย่างใดอย่างหนึ่ง บทความนี้ตระหนักถึงแนวคิดนี้และให้แนวคิดอื่นและนำไปปฏิบัติในสองวิธี
1) สร้างไฟล์ PDF โดยตรงบนเซิร์ฟเวอร์
<%@ page import ="com.lowagie.text.*,com.lowagie.text.pdf.*, java.io.*"%>
< <%
ชื่อไฟล์สตริง = "PDF"+(new Random()).nextInt ()+".pdf" ;
เอกสารเอกสาร = เอกสารใหม่ (PageSize.A4);
ServletOutputStream
out1 = response.getOutputStream();
ลอง
{
PdfWriterwriter = PdfWriter.getInstance(document, new FileOutputStream(filename) );
);
document.add(ย่อหน้าใหม่ ("Hello World"));
document.close();
}
catch(ข้อยกเว้น e){}%>
โปรแกรมด้านบนสร้างไฟล์ PDF แบบคงที่บนเซิร์ฟเวอร์ แน่นอนว่าชื่อของไฟล์ PDF ที่ได้รับจากการรันแต่ละครั้งจะต้องไม่ซ้ำกันและไม่ซ้ำกัน โปรแกรมนี้ใช้ฟังก์ชันสุ่มเพื่อตั้งชื่อไฟล์ PDF ที่สร้างขึ้น ข้อเสียของโปรแกรมนี้คือทุกครั้งที่รัน ไฟล์ PDF จะถูกสร้างขึ้นบนเซิร์ฟเวอร์ หากไม่ถูกลบทันเวลา จำนวนจะมีมากขึ้นเรื่อยๆ ซึ่งเห็นได้ชัดว่าเป็นสิ่งที่ผู้ดูแลเว็บไซต์ไม่ต้องการ ดู.
2) ถ่ายโอนไฟล์ PDF ไปยังแคชของลูกค้าในรูปแบบสตรีม ข้อดีของสิ่งนี้คือจะไม่ทิ้ง "วัตถุโบราณ" ไว้บนเซิร์ฟเวอร์
i) สร้างโดยตรงผ่านหน้า JSP
<%@
page import="java.io.*,java.awt.Color,com.lowagie.text.*,com.lowagie.text.pdf.*"%>
<%
response.setContentType( "application/pdf"
เอกสารเอกสาร = เอกสารใหม่ ();
Document.open
(
);
document.add
(ย่อหน้าใหม่)
document.close();
DataOutput เอาท์พุท = ใหม่ DataOutputStream( response.getOutputStream() );
byte[] bytes = buffer.toByteArray();
response.setContentLength(bytes.length);
for(int i = 0; i < bytes.
ความ
ยาว; i++ )
{
output.writeByte( bytes[i] )
;
ii) สร้างผ่าน Servlet
นำเข้า java.io.*;
นำเข้า javax.servlet.*;
นำเข้า javax.servlet.http.*;
นำเข้า com.lowagie.text.
*
;
HttpServletResponse)
ส่ง IOException,ServletException
{
Document document = new Document(PageSize.A4, 36,36,36,36);
ByteArrayOutputStream
ba
= new ByteArrayOutputStream(
)
;
.open();
document.add(new Paragraph("Hello World"));
}
catch(DocumentException de)
{
de.printStackTrace();
System.err.println("ข้อผิดพลาดของเอกสาร:" +de.getMessage() }
document.close();
response.setContentType("application/pdf");
response.setContentLength(ba.size());
ServletOutputStream out = response.getOutputStream(
ออก
)
;
();
}
ลงเอย
ด้วยการใช้แนวทางที่สองในโครงการของฉัน ซอร์สโค้ดของบทความนี้ได้รับการดีบั๊กใน Tomcat4 ของฉันแล้ว หวังว่าคงจะนำความสะดวกสบายมาให้ทุกคนได้
ยินดีให้ทุกคนนำไปใช้ได้ หากต้องการพิมพ์ซ้ำ โปรดระบุแหล่งที่มา