การจัดการเนื้อหาของการตอบกลับไม่สามารถตั้งค่าเป็นไฟล์แนบได้ในขณะที่ใช้ jfree และ itext ร่วมกัน

ความต้องการของฉันคือการใส่แผนภูมิที่สร้างโดย JFreeChart ลงในเอกสาร PDF ของฉัน

เพื่อแสดงรายการแผนภูมิ ฉันกำลังรับรายการวัตถุ BufferedImage

private BufferedImage generateChartForPDF (DefaultCategoryDataset dataset,String threadName) {
        String title = "Skill  : "+threadName ;

        JFreeChart chart = ChartFactory.createBarChart(title, "Work Completion",
                "Perce %", dataset, PlotOrientation.VERTICAL, true, true,
                false);

        return chart.createBufferedImage(500, 300) ;
    }

จากนี้ ฉันกรอกรายการรูปภาพที่บัฟเฟอร์ และกำลังกรอกแผนภูมิในรูปแบบ PDF ด้วยวิธีด้านล่าง

ByteArrayOutputStream baos = new ByteArrayOutputStream();
Document pdfDocument = new Document();
PdfWriter pdfWriter = PdfWriter.getInstance(pdfDocument, baos);
setGraphImagesInPDF(pdfDocument, buffImageList) ;
private void setGraphImagesInPDF (Document pdfDocument,List<BufferedImage> buffImageList) throws DocumentException, IOException {
        for (BufferedImage bufferedImage : buffImageList) {
            Image image = Image.getInstance(bufferedImage,Color.LIGHT_GRAY);
            pdfDocument.newPage();
            image.setAbsolutePosition(300, 300) ;
            pdfDocument.add(image);
        }
    }

นี่คือวิธีที่ฉันเติมแผนภูมิใน PDF ของฉัน ตอนนี้เมื่อฉันตั้งค่าการจัดการเนื้อหาเป็นไฟล์แนบ ฉันไม่ได้รับการตอบสนองเป็นไฟล์แนบใน UI ของฉัน แต่เบราว์เซอร์กำลังเปิด PDF ในหน้าอื่น

ServletOutputStream outputStream = response.getOutputStream();
baos.writeTo(outputStream);
setResponseHeaders(response,"Data");
outputStream.flush();
outputStream.close();

private void setResponseHeaders(HttpServletResponse response,String reportingType) {
        System.out.println("setting response headers .. ");
        response.setHeader("Content-Disposition",
                "attachment; filename=\""+reportingType+" Reports.pdf\"");
        response.setContentType("application/pdf");
    }

แม้ว่าฉันจะตั้งค่าประเภทการกำจัดเนื้อหาเป็นไฟล์แนบในส่วนหัวของการตอบกลับ แต่สิ่งนี้ไม่ได้เปิดเป็นไฟล์แนบ ใช้งานได้ดีเช่นเดียวกันหลังจากลบส่วนแผนภูมิของโค้ดออก โปรดช่วยฉันในเรื่องนี้ ขอบคุณ


person Arun    schedule 15.09.2012    source แหล่งที่มา
comment
(1) เหตุใดคำถามนี้จึงติดแท็ก itext/jfreechart คำถามนี้เกี่ยวกับส่วนหัวการตอบกลับใช่ไหม ไม่สำคัญว่าคุณจะใช้ iText หรือ JFreeChart (2) คุณสามารถสร้างปัญหาซ้ำบนเครื่องอื่นโดยใช้เบราว์เซอร์ที่แตกต่างกันได้หรือไม่? ฉันเดาว่าคุณมีปัญหาในการกำหนดค่าในเครื่องซึ่งไม่สามารถทำซ้ำได้ในเครื่องไคลเอนต์ทุกเครื่อง   -  person Bruno Lowagie    schedule 15.09.2012


คำตอบ (1)


ตามความคิดเห็นของ Bruno ไม่ใช่คำถาม iText/JFreechart แต่เป็นคำถาม servlet/http

คุณต้องตั้งค่าส่วนหัวการตอบกลับ ก่อน คุณจะได้รับสตรีมเอาต์พุต: นี่เป็นข้อบังคับ ฉันขอแนะนำให้คุณตั้งค่าส่วนหัว content-length ในเมธอด setResponseHeaders เช่นนี้

response.setContentLength(baos.size());

ดังนั้นรหัสของคุณควรเป็น:

setResponseHeaders(response, baos, "Data");
ServletOutputStream outputStream = response.getOutputStream();
baos.writeTo(outputStream);
outputStream.flush();
outputStream.close();
person Pier Luigi    schedule 17.09.2012
comment
สมบูรณ์แบบ !! มันได้ผล !! :-) ส่วนหัวก่อน เขียนถัดไป :-) - person Arun; 24.09.2012