我正在使用 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>
我现在不知道这种方法出了什么问题。希望任何人都可以帮助我。