จะแทรกรูปภาพใน PDF โดยใช้ iText และดาวน์โหลดไปยังเครื่องไคลเอนต์ได้อย่างไร

ฉันใช้ jdbc เพื่อดึงข้อมูลจากฐานข้อมูล จากนั้นใช้ iText ฉันสร้างไฟล์ PDF ซึ่งสามารถดาวน์โหลดได้บนเครื่องไคลเอนต์ แอปพลิเคชันถูกเข้ารหัสใน html/jsp และทำงานบน Apache Tomcat

ฉันใช้ response.getOutputStream เพื่อสร้างไฟล์ PDF เอาต์พุตทันที

ปัญหาคือตอนนี้ฉันไม่สามารถแทรกรูปภาพในเอกสารนี้ได้เนื่องจากมันทำให้ฉันเกิดข้อผิดพลาด

getOutputStream() ถูกเรียกสำหรับการตอบกลับนี้แล้ว

ฉันเข้าใจว่าฉันกำลังโทร Outputstream อีกครั้งขณะแทรกรูปภาพ และทำให้เกิดข้อผิดพลาด

ฉันจะแทรกรูปภาพในเอกสารและยังคงสร้างไฟล์ PDF แบบไดนามิกซึ่งสามารถดาวน์โหลดโดยเครื่องไคลเอนต์ได้อย่างไร

รหัสที่เกี่ยวข้อง:

response.setContentType("application/pdf");
response.setHeader("Content-Disposition","attachment; filename=\"LicenseInfo.pdf\""); // Code 1
Document document = new Document();

PdfWriter.getInstance(document, response.getOutputStream()); // Code 2

Image image = Image.getInstance("logo.jpg");

document.open();

document.add(image);

person Sahil Sharma    schedule 13.06.2013    source แหล่งที่มา


คำตอบ (1)


ขออภัย คุณไม่ได้แสดงโค้ดที่เกี่ยวข้องใดๆ เนื่องจากโค้ดที่คุณคัดลอก/วางจะไม่รับผิดชอบต่อข้อยกเว้นที่คุณกล่าวถึง

ส่วนที่เกี่ยวข้องคือคุณกำลังใช้ JSP และคุณไม่ได้อ่านคำเตือนที่สำคัญเกี่ยวกับ JSP ที่ระบุไว้ในบทที่ 9 ของ my หนังสือ.

เมื่อคุณเขียน JSP คุณอาจชอบช่องว่างและการเยื้อง เช่น:

<% //a line of code %>
<%
   // some more code
%>
<% // another line of code %>
<%
   response.getOutputStream();
%>

สิ่งนี้จะทำให้เกิดข้อยกเว้น "getOutputStream() has already been called for this response" เสมอ ไม่ว่าคุณจะใช้ iText หรือไม่ก็ตาม เมธอด getOutputStream() ถูกเรียกทันทีที่คุณแนะนำอักขระช่องว่างตัวแรกในสคริปต์ JSP ของคุณ

เพื่อแก้ไขปัญหานี้ คุณจะต้องลบช่องว่างทั้งหมดออก:

<% //a line of code %><%
   // some more code
%><% // another line of code %><%
   response.getOutputStream();
%>

ไม่อนุญาตให้ใช้อักขระตัวเดียวนอกเครื่องหมาย <% และ %> ตามที่อธิบายไว้ในคู่มือ JSP ที่ดีกว่า คุณไม่ควรใช้ JSP เพื่อสร้างไฟล์ไบนารี ทำไมจะไม่ล่ะ? เนื่องจาก JSP แนะนำอักขระช่องว่างในตำแหน่งที่ต้องการในไฟล์ไบนารีของคุณ ส่งผลให้ไฟล์เสียหาย ใช้ Servlets แทน!

person Bruno Lowagie    schedule 13.06.2013
comment
ขอบคุณสำหรับคำแนะนำของคุณบรูโน แต่ฉันต้องใช้ JSP (ไม่มีทางเลือก) ประการที่สองฉันพยายามลบช่องว่างสีขาว เมื่อฉันทำเช่นนั้น ไฟล์ pdf ของฉันถูกสร้างขึ้น แต่ฉันไม่สามารถเปิดมันได้ เนื่องจากมีข้อความแจ้งว่าข้อมูลเสียหาย - person Sahil Sharma; 13.06.2013
comment
ฉันใช้สิ่งต่อไปนี้เพื่อลบช่องว่างสีขาว ‹%@ page trimDirectiveWhitespaces=true %› - person Sahil Sharma; 13.06.2013
comment
เอ่อ... นั่นผิดอย่างสิ้นเชิง; คุณต้องลบช่องว่างออกจากไฟล์ JSP ของคุณด้วยตนเอง! - person Bruno Lowagie; 13.06.2013