0

我正在使用 Spring Boot 中的 itext 设置 PDF 样式。当我将它保存在我的系统中时,它工作得非常好,但现在我想直接在我正在通过的浏览器中打开ByteArrayOutputStream。这是我到目前为止所做的代码-

@Controller
public class InvoiceController {

    @GetMapping(value = { "/", "/index" })
    public String displayPage(ModelMap model, HttpServletResponse response) throws IOException
    {               
        byte[] pdf = InvoicePdfGenerator.getInvoice(response);
        System.out.println("Done--------");
        model.addAttribute("invoice", pdf);
        return "index";     
    }
}

通过控制器调用的方法定义如下 -

package com.marriage.controllers;

import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.util.Iterator;

import javax.servlet.http.HttpServletResponse;

import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Chunk;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.ExceptionConverter;
import com.itextpdf.text.Font;
import com.itextpdf.text.FontFactory;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.TabSettings;
import com.itextpdf.text.pdf.ColumnText;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPRow;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfPageEventHelper;
import com.itextpdf.text.pdf.PdfWriter;

public class InvoicePdfGenerator extends PdfPageEventHelper{    

    Font footerFont = FontFactory.getFont("G:\\Calibri Regular.ttf", 9, Font.BOLD);
    static Font namefont = FontFactory.getFont("G:\\Calibri Regular.ttf", 12, Font.BOLD);
    static Font rupeesfont = FontFactory.getFont("G:\\Calibri Regular.ttf", 22, Font.BOLD);
    static Font fontStyle = FontFactory.getFont("G:\\Calibri Regular.ttf", 12);
    static Font datefont = FontFactory.getFont("G:\\Calibri Regular.ttf", 12, Font.BOLD);
    static Font amountfont = FontFactory.getFont("G:\\Calibri Regular.ttf", 12, Font.BOLD, new BaseColor(128, 128, 128));
    static Font projectfont = FontFactory.getFont("G:\\Calibri Regular.ttf", 16, Font.BOLD, new BaseColor(0, 250, 154));
    static Font termsfont = FontFactory.getFont("G:\\Calibri Regular.ttf", 12, new BaseColor(128, 128, 128));

    public void onEndPage(PdfWriter writer, Document document) {
        addHeader(writer);
        addFooter(writer, document);
    }

    private void addFooter(PdfWriter writer, Document document) {
        PdfContentByte canvas = writer.getDirectContent();
        ColumnText.showTextAligned(canvas, Element.ALIGN_LEFT, new Phrase("Boolment Software Development Pvt Ltd",footerFont), 
                document.left() , document.bottom()-30, 0);
        ColumnText.showTextAligned(canvas, Element.ALIGN_LEFT, new Phrase("E-26, Block -E, Sector 3, Noida, Uttar Pradesh, 201301, India 7290006646",footerFont), 
                document.left() , document.bottom()-40, 0);
    }

    private void addHeader(PdfWriter writer) {  
        PdfPTable header = new PdfPTable(1);
        try {
            header.setWidths(new int[]{10});
            header.setTotalWidth(527);            
            header.setLockedWidth(true);                        

            // add image                    
            Image logo = Image.getInstance(this.getClass().getResource("/static/images/boolment-logo.png"));                         
            PdfPCell img = new PdfPCell(logo);
            img.setBorder(0);
            logo.scaleAbsolute(90, 100);
            img.setHorizontalAlignment(Element.ALIGN_CENTER);
            img.setVerticalAlignment(Element.ALIGN_MIDDLE);
            header.addCell(img);

            // write content
            header.writeSelectedRows(0, -1, 34, 810, writer.getDirectContent());
        }catch(DocumentException de) {
            throw new ExceptionConverter(de);
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public static byte[] getInvoice(HttpServletResponse response) throws IOException {      
        Document document = new Document(PageSize.A4, 36, 36, 140, 100);        

        ByteArrayOutputStream baos = new ByteArrayOutputStream();

        PdfWriter writer = null;
        try {
            response.setContentType("application/pdf");
            writer = PdfWriter.getInstance(document, baos);                     
        } catch (DocumentException e) {         
            e.printStackTrace();
        } 

        InvoicePdfGenerator event = new InvoicePdfGenerator();
        writer.setPageEvent(event);

        document.open();
        try {
            //Add Table 1
            PdfPTable invoiceTable = new PdfPTable(2);
            invoiceTable.setWidths(new int[]{40, 20});

            invoiceTable.setWidthPercentage(100); 
            invoiceTable.addCell(new PdfPCell(new Phrase("Vinex Enterprises Pvt. Ltd", namefont)));
            invoiceTable.addCell(new PdfPCell(new Phrase("Amount due", amountfont)));
            invoiceTable.addCell(new PdfPCell(new Phrase("C-35, Udyogpuram Industrial Estate, Partapur\r\n" + 
                    "Meerut, Uttar Pradesh 250103\r\n" + 
                    "India", fontStyle)));
            invoiceTable.addCell(new PdfPCell(new Phrase("Rs 32,450.0", rupeesfont)));
            invoiceTable.addCell(new PdfPCell(new Phrase(" ", fontStyle)));
            invoiceTable.addCell(new PdfPCell(new Phrase("INR", datefont)));

            PdfPRow invoicerow;
            for (Iterator<PdfPRow> i = invoiceTable.getRows().iterator(); i.hasNext();) {
                invoicerow = (PdfPRow) i.next();
              PdfPCell[] invoicecell = invoicerow.getCells();
              for(int k=0; k<invoicecell.length; k++) {
                  invoicecell[k].setBorder(0);
              }
            }
            invoiceTable.setSpacingAfter(10f);
            document.add(invoiceTable);

            //Add Table 2
            PdfPTable dateTable = new PdfPTable(2);
            dateTable.setWidths(new float[]{2, 2});

            dateTable.setWidthPercentage(33); 
            dateTable.addCell(new PdfPCell(new Phrase("Due", amountfont)));
            dateTable.addCell(new PdfPCell(new Phrase("Issued", amountfont)));
            dateTable.addCell(new PdfPCell(new Phrase("8/17/19", datefont)));
            dateTable.addCell(new PdfPCell(new Phrase("8/10/19", datefont)));

            dateTable.setHorizontalAlignment(Element.ALIGN_RIGHT);
            PdfPRow daterow;
            for (Iterator<PdfPRow> i = dateTable.getRows().iterator(); i.hasNext();) {
                daterow = (PdfPRow) i.next();
              PdfPCell[] datecell = daterow.getCells();
              for(int k=0; k<datecell.length; k++) {
                  datecell[k].setBorder(0);
              }
            }
            dateTable.setSpacingAfter(20f);
            document.add(dateTable);

            Paragraph projectname = new Paragraph(); 
            projectname.add(new Chunk("Vinex Android Mobile App Development", rupeesfont));
            projectname.setTabSettings(new TabSettings(10f));           
            projectname.add(Chunk.TABBING);
            projectname.add(new Chunk("No", amountfont));
            document.add(projectname);

            Paragraph projectno = new Paragraph("BSD00CN0511",amountfont);
            projectno.setSpacingAfter(10f);
            document.add(projectno);

            Paragraph project = new Paragraph("Vinex Android Mobile App Development",projectfont);
            project.setSpacingAfter(10f);
            document.add(project);

            //Add Table 3
            PdfPTable projectdescTable = new PdfPTable(4);
            projectdescTable.setWidths(new float[]{90, 10, 20, 20});

            projectdescTable.setWidthPercentage(100); 
            projectdescTable.addCell(new PdfPCell(new Phrase("Description", datefont)));
            projectdescTable.addCell(new PdfPCell(new Phrase("Qty", datefont)));
            projectdescTable.addCell(new PdfPCell(new Phrase("Price", datefont)));
            projectdescTable.addCell(new PdfPCell(new Phrase("Amount", datefont)));

            projectdescTable.addCell(new PdfPCell(new Phrase("Android Mobile App Development", fontStyle)));
            projectdescTable.addCell(new PdfPCell(new Phrase("1", fontStyle)));
            projectdescTable.addCell(new PdfPCell(new Phrase("Rs 27,500.00", fontStyle)));
            projectdescTable.addCell(new PdfPCell(new Phrase("Rs 27,500.00", fontStyle)));

            PdfPRow projectdescrow;
            for (Iterator<PdfPRow> i = projectdescTable.getRows().iterator(); i.hasNext();) {
                projectdescrow = (PdfPRow) i.next();
              PdfPCell[] projectdesccell = projectdescrow.getCells();
              for(int k=0; k<projectdesccell.length; k++) {
                  projectdesccell[k].setBorder(Rectangle.BOTTOM);
                  projectdesccell[k].setBorderColor(new BaseColor(128, 128, 128));
                  projectdesccell[k].setPaddingBottom(10);
                  projectdesccell[k].setPaddingTop(5);
              }
            }  
            projectdescTable.setSpacingAfter(20f);
            document.add(projectdescTable);

            //Add Table 4
            PdfPTable projectsubTable = new PdfPTable(2);
            projectsubTable.setWidths(new float[]{40, 40});

            projectsubTable.setWidthPercentage(33);
            projectsubTable.addCell(new PdfPCell(new Phrase("SubTotal", datefont)));
            projectsubTable.addCell(new PdfPCell(new Phrase("Rs 27,500", fontStyle)));
            projectsubTable.addCell(new PdfPCell(new Phrase("Tax (18%)", datefont)));
            projectsubTable.addCell(new PdfPCell(new Phrase("Rs 4,950", fontStyle)));
            projectsubTable.addCell(new PdfPCell(new Phrase("Total", datefont)));
            projectsubTable.addCell(new PdfPCell(new Phrase("Rs 32,450", fontStyle)));
            projectsubTable.addCell(new PdfPCell(new Phrase("Amount Due", datefont)));
            projectsubTable.addCell(new PdfPCell(new Phrase("Rs 32,450", fontStyle)));

            projectsubTable.setHorizontalAlignment(Element.ALIGN_RIGHT);
            PdfPRow projectsubrow;
            for (Iterator<PdfPRow> i = projectsubTable.getRows().iterator(); i.hasNext();) {
                projectsubrow = (PdfPRow) i.next();
              PdfPCell[] projectsubcell = projectsubrow.getCells();
              for(int k=0; k<projectsubcell.length; k++) {
                  projectsubcell[k].setBorder(0);
              }
            }
            projectsubTable.setSpacingAfter(20f);
            document.add(projectsubTable);

            Paragraph notes = new Paragraph("Notes:",datefont);
            notes.setSpacingAfter(10f);
            document.add(notes);

            Paragraph terms = new Paragraph("Terms & Conditions\r\n"
                    + "1) This is computer generated performa invoice and dosen't require signature or company seal.\r\n"
                    + "2) More details about terms & conditions read out at http://www.boolment.com/privacy.\r\n"
                    + "3) Boolment Software Development Private Limited GST No 09AAHCB0776G1ZL",termsfont);         
            document.add(terms);
        }catch (DocumentException e) {          
            e.printStackTrace();
        }
        OutputStream os = response.getOutputStream();
        baos.writeTo(os);
        os.flush();
        os.close();
        document.close();
        writer.close();     
        baos.close();        
        return baos.toByteArray();
    }

}

错误如下 -

java.lang.IllegalStateException: Cannot create a session after the response has been committed
    at org.apache.catalina.connector.Request.doGetSession(Request.java:3007) ~[catalina.jar:9.0.22]
    at org.apache.catalina.connector.Request.getSession(Request.java:2442) ~[catalina.jar:9.0.22]
    at org.apache.catalina.connector.RequestFacade.getSession(RequestFacade.java:908) ~[catalina.jar:9.0.22]
    at javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:241) ~[servlet-api.jar:na]
    at org.apache.catalina.core.ApplicationHttpRequest.getSession(ApplicationHttpRequest.java:582) ~[catalina.jar:9.0.22]
    at org.apache.catalina.core.ApplicationHttpRequest.getSession(ApplicationHttpRequest.java:527) ~[catalina.jar:9.0.22]
    at org.apache.jasper.runtime.PageContextImpl.initialize(PageContextImpl.java:133) ~[jasper.jar:9.0.22]
    at org.apache.jasper.runtime.JspFactoryImpl.internalGetPageContext(JspFactoryImpl.java:109) ~[jasper.jar:9.0.22]
    at org.apache.jasper.runtime.JspFactoryImpl.getPageContext(JspFactoryImpl.java:60) ~[jasper.jar:9.0.22]
    at org.apache.jsp.index_jsp._jspService(index_jsp.java:117) ~[na:na]
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) ~[jasper.jar:9.0.22]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) [servlet-api.jar:na]
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:476) ~[jasper.jar:9.0.22]
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:385) ~[jasper.jar:9.0.22]
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:329) ~[jasper.jar:9.0.22]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) [servlet-api.jar:na]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) [catalina.jar:9.0.22]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:9.0.22]
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:712) [catalina.jar:9.0.22]
    at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:580) [catalina.jar:9.0.22]
    at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:516) [catalina.jar:9.0.22]
    at org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:162) [spring-webmvc-5.2.0.M3.jar:5.2.0.M3]
    at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:316) [spring-webmvc-5.2.0.M3.jar:5.2.0.M3]
    at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1371) [spring-webmvc-5.2.0.M3.jar:5.2.0.M3]
    at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1117) [spring-webmvc-5.2.0.M3.jar:5.2.0.M3]
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1056) [spring-webmvc-5.2.0.M3.jar:5.2.0.M3]
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942) [spring-webmvc-5.2.0.M3.jar:5.2.0.M3]
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005) [spring-webmvc-5.2.0.M3.jar:5.2.0.M3]
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:897) [spring-webmvc-5.2.0.M3.jar:5.2.0.M3]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:634) [servlet-api.jar:na]
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882) [spring-webmvc-5.2.0.M3.jar:5.2.0.M3]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) [servlet-api.jar:na]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) [catalina.jar:9.0.22]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:9.0.22]
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) [tomcat-websocket.jar:9.0.22]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:9.0.22]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:9.0.22]
    at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) [spring-web-5.2.0.M3.jar:5.2.0.M3]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:109) [spring-web-5.2.0.M3.jar:5.2.0.M3]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:9.0.22]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:9.0.22]
    at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:92) [spring-web-5.2.0.M3.jar:5.2.0.M3]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:109) [spring-web-5.2.0.M3.jar:5.2.0.M3]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:9.0.22]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:9.0.22]
    at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:93) [spring-web-5.2.0.M3.jar:5.2.0.M3]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:109) [spring-web-5.2.0.M3.jar:5.2.0.M3]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:9.0.22]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:9.0.22]
    at org.springframework.boot.web.servlet.support.ErrorPageFilter.doFilter(ErrorPageFilter.java:128) [spring-boot-2.2.0.M4.jar:2.2.0.M4]
    at org.springframework.boot.web.servlet.support.ErrorPageFilter.access$000(ErrorPageFilter.java:66) [spring-boot-2.2.0.M4.jar:2.2.0.M4]
    at org.springframework.boot.web.servlet.support.ErrorPageFilter$1.doFilterInternal(ErrorPageFilter.java:103) [spring-boot-2.2.0.M4.jar:2.2.0.M4]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:109) [spring-web-5.2.0.M3.jar:5.2.0.M3]
    at org.springframework.boot.web.servlet.support.ErrorPageFilter.doFilter(ErrorPageFilter.java:121) [spring-boot-2.2.0.M4.jar:2.2.0.M4]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:9.0.22]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:9.0.22]
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200) [spring-web-5.2.0.M3.jar:5.2.0.M3]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:109) [spring-web-5.2.0.M3.jar:5.2.0.M3]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:9.0.22]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:9.0.22]
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) [catalina.jar:9.0.22]
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [catalina.jar:9.0.22]
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490) [catalina.jar:9.0.22]
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) [catalina.jar:9.0.22]
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) [catalina.jar:9.0.22]
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:678) [catalina.jar:9.0.22]
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) [catalina.jar:9.0.22]
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) [catalina.jar:9.0.22]
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408) [tomcat-coyote.jar:9.0.22]
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-coyote.jar:9.0.22]
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:853) [tomcat-coyote.jar:9.0.22]
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1587) [tomcat-coyote.jar:9.0.22]
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-coyote.jar:9.0.22]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) [na:1.8.0_201]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [na:1.8.0_201]
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-util.jar:9.0.22]
    at java.lang.Thread.run(Unknown Source) [na:1.8.0_201]

在 Jsp 页面中,我没有做任何事情,因为我只需要设置 PDF 的样式并在浏览器中打开它

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
Hello World
</body>
</html>

我现在不知道这种方法出了什么问题。希望任何人都可以帮助我。

4

0 回答 0