/* * $Id$ * * This code is part of the 'iText Tutorial'. * You can find the complete tutorial at the following address: * http://itextdocs.lowagie.com/tutorial/ * * This code is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * itext-questions@lists.sourceforge.net */ package com.lowagie.examples.general.webapp; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.Date; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import com.lowagie.text.Document; import com.lowagie.text.DocumentException; import com.lowagie.text.Paragraph; import com.lowagie.text.pdf.PdfWriter; /** * If you want to avoid that your Servlet times out, you should use this ProgressServlet. * * @author blowagie */ public class ProgressServlet extends HttpServlet { private static final long serialVersionUID = 6272312661092621179L; /** * This class will keep a Pdf file * @author blowagie */ public class MyPdf implements Runnable { /** the ByteArrayOutputStream that holds the PDF data. */ ByteArrayOutputStream baos = new ByteArrayOutputStream(); /** the percentage of the PDF file that is finished */ int p = 0; /** * @see java.lang.Runnable#run() */ public void run() { // step 1 Document doc = new Document(); try { // step 2 PdfWriter.getInstance(doc, baos); // step 3 doc.open(); // step 4 while (p < 99) { doc.add(new Paragraph(new Date().toString())); // we slow the process down deliberately Thread.sleep(500); p++; } } catch (DocumentException e) { p = -1; e.printStackTrace(); } catch (InterruptedException e) { p = -1; e.printStackTrace(); } // step 5 doc.close(); p = 100; } /** * Gets the complete PDF data * @return the PDF as an array of bytes * @throws DocumentException when the document isn't ready yet */ public ByteArrayOutputStream getPdf() throws DocumentException { if (p < 100) { throw new DocumentException("The document isn't finished yet!"); } return baos; } /** * Gets the current percentage of the file that is done. * @return a percentage or -1 if something went wrong. */ public int getPercentage() { return p; } } /** * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) * @param request * @param response * @throws IOException * @throws ServletException */ public void doGet (HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { // We get a Session object HttpSession session = request.getSession(true); Object o = session.getAttribute("myPdf"); MyPdf pdf; if (o == null) { pdf = new MyPdf(); session.setAttribute("myPdf", pdf); Thread t = new Thread(pdf); t.start(); } else { pdf = (MyPdf)o; } response.setContentType("text/html"); switch (pdf.getPercentage()) { case -1: isError(response.getOutputStream()); return; case 100: isFinished(response.getOutputStream()); return; default: isBusy(pdf, response.getOutputStream()); return; } } /** * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) * @param request * @param response * @throws IOException * @throws ServletException */ public void doPost (HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { // We get a Session object HttpSession session = request.getSession(false); try { MyPdf pdf = (MyPdf) session.getAttribute("myPdf"); session.removeAttribute("myPdf"); ByteArrayOutputStream baos = pdf.getPdf(); //setting some response headers response.setHeader("Expires", "0"); response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0"); response.setHeader("Pragma", "public"); //setting the content type response.setContentType("application/pdf"); // the contentlength is needed for MSIE!!! response.setContentLength(baos.size()); // write ByteArrayOutputStream to the ServletOutputStream ServletOutputStream out = response.getOutputStream(); baos.writeTo(out); out.flush(); } catch(Exception e) { isError(response.getOutputStream()); } } /** * Sends an HTML page to the browser saying how many percent of the document is finished. * @param pdf the class that holds the PDF * @param stream the outputstream of the servlet * @throws IOException */ private void isBusy(MyPdf pdf, ServletOutputStream stream) throws IOException { stream.print("<html>\n\t<head>\n\t\t<title>Please wait...</title>\n\t\t<meta http-equiv=\"Refresh\" content=\"5\">\n\t</head>\n\t<body>"); stream.print(String.valueOf(pdf.getPercentage())); stream.print("% of the document is done.<br>\nPlease Wait while this page refreshes automatically (every 5 seconds)\n\t</body>\n</html>"); } /** * Sends an HTML form to the browser to get the PDF * @param stream the outputstream of the servlet * @throws IOException */ private void isFinished(ServletOutputStream stream) throws IOException { stream.print("<html>\n\t<head>\n\t\t<title>Finished!</title>\n\t</head>\n\t<body>"); stream.print("The document is finished:<form method=\"POST\"><input type=\"Submit\" value=\"Get PDF\"></form>\n\t</body>\n</html>"); } /** * Sends an error message in HTML to the browser * @param stream the outputstream of the servlet * @throws IOException */ private void isError(ServletOutputStream stream) throws IOException { stream.print("<html>\n\t<head>\n\t\t<title>Error</title>\n\t</head>\n\t<body>"); stream.print("An error occured.\n\t</body>\n</html>"); } }