How to add header and footer using pdfstamper in itextpdf when servlet is database responsive?

390 views Asked by At

I have a servlet which is creating a PDF direct from mysql database. Everything works fine, but now I need to add header and footer in every page of that dynamically generated pdf. The header must show 'Page current_page_number of total_number_of_page' and footer must retrieve some data from mysql database and show in a table format. I really stuck in this problem for last couple of weeks.

I am using servlet 2.5 and itextpdf 5.5.4.

Here I am attaching my code:

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.net.URL;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
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.Font;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Font.FontFamily;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import com.itextpdf.text.Image;
import com.itextpdf.text.Element;
import com.itextpdf.text.Phrase;
import java.io.DataOutputStream;
import com.itextpdf.text.pdf.PdfContentByte;

/**
 * Servlet implementation class for Servlet: formPart11PDF
 *
 */
 public class formPart11PDF extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
   static final long serialVersionUID = 1L;
   private String dbURL = "jdbc:mysql://localhost:3306/test";
   private String dbUser = "root";
   private String dbPass = "admin";
    /* (non-Java-doc)
     * @see javax.servlet.http.HttpServlet#HttpServlet()
     */
    public formPart11PDF() {
        super();
    }       
    
    /* (non-Java-doc)
     * @see javax.servlet.http.HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          ServletOutputStream os = response.getOutputStream();
          response.setContentType("application/pdf");
          DataOutputStream output = new DataOutputStream(os);
          Document doc = new Document();
          
        
          Font bf12 = new Font(FontFamily.TIMES_ROMAN, 12);
          Font f = new Font(FontFamily.TIMES_ROMAN, 10, Font.NORMAL, BaseColor.GRAY);
         
          Connection conn4 = null; 
          PreparedStatement pst4 = null;
          String sql4 = null;
          Connection conn0 = null; 
          PreparedStatement pst0 = null;
          String sql0 = null;
          
try{
              PdfWriter writer = PdfWriter.getInstance(doc, output);
              doc.addAuthor("betterThanZero");
               doc.addCreationDate();
               doc.addProducer();
               doc.addCreator("MMG");
               doc.addTitle("DM-01");
               doc.setPageSize(PageSize.A4);
               doc.setMargins(65, 50, 70, 100);
               doc.open();
              PdfContentByte contentByte = writer.getDirectContent();
           
           String p_ides=request.getParameter("p_ides");
           String p_diofficer=request.getParameter("p_diofficer");
           
         
         float[] columnWidths4 = {10f, 30f, 60f};
           //create PDF table with the given widths
           PdfPTable table4 = new PdfPTable(columnWidths4);
           // set table width a percentage of the page width
           table4.setWidthPercentage(100f);
           
           DriverManager.registerDriver(new com.mysql.jdbc.Driver());
           conn4 = DriverManager.getConnection(dbURL, dbUser, dbPass);
           
           sql4="select mmg_no,i_des,tg_dir " +
                "from dm_011 where i_des=? and di_officer=?";
           
           pst4 = conn4.prepareStatement(sql4);
           pst4.setString(1, p_ides);
           pst4.setString(2, p_diofficer);
           
           ResultSet rs4 = pst4.executeQuery();
           while(rs4.next()){
               PdfPCell cell9 = new PdfPCell(new Phrase("1", bf12));
               cell9.setRowspan(2);
               table4.addCell(cell9);
               PdfPCell cell10 = new PdfPCell(new Phrase("a) MMG Demand Control No:\n[to be entered by MMG only]", bf12));
               table4.addCell(cell10);
               PdfPCell cell11 = new PdfPCell(new Phrase(rs4.getString("mmg_no"), bf12));
               table4.addCell(cell11);
               PdfPCell cell12 = new PdfPCell(new Phrase("b) Brief description of\nStores/Services:\n[Title of File to be given by\nDemanding Officer]", bf12));
               table4.addCell(cell12);
               PdfPCell cell13 = new PdfPCell(new Phrase(rs4.getString("i_des"), bf12));
               table4.addCell(cell13);
               PdfPCell cell14 = new PdfPCell(new Phrase("2", bf12));
               table4.addCell(cell14);
               PdfPCell cell15 = new PdfPCell(new Phrase("a) Tech Dir / Group:", bf12));
               table4.addCell(cell15);
               PdfPCell cell16 = new PdfPCell(new Phrase(rs4.getString("tg_dir"), bf12));
               table4.addCell(cell16);
               } 
           rs4.close();                                                                
           pst4.close();                                                              
           pst4 = null;                                                               
           conn4.close();                                                              
           conn4 = null;
           doc.add(table4);
           
           doc.close();
           
           int pageCount = writer.getPageNumber()-1;
           writer.close();
           String output1 = os.toString();
           PdfReader reader = new PdfReader(output1);
           //reset the output
           os = response.getOutputStream();
           output = new DataOutputStream(os);
           doc = new Document();
           writer = PdfWriter.getInstance(doc, output);
           doc.open();
           PdfStamper stamper = new PdfStamper(reader, os);
          
           for (int i = 1; i <= pageCount; i++)
           {
               contentByte = stamper.getOverContent(i);
               //header
               float[] columnWidths9 = {10f, 10f};
               PdfPTable table9 = new PdfPTable(columnWidths9);
               table9.setHorizontalAlignment(Element.ALIGN_RIGHT);
               table9.setWidthPercentage(160 / 5.23f);
               PdfPCell cell127 = new PdfPCell(new Phrase(" DM-01 ", f));
               cell127.setVerticalAlignment(Element.ALIGN_CENTER);
               cell127.setHorizontalAlignment(Element.ALIGN_CENTER);
               table9.addCell(cell127);
               PdfPCell cell128 = new PdfPCell(new Phrase(String.format("Page "+ i + " of " + pageCount), f));
               cell128.setVerticalAlignment(Element.ALIGN_CENTER);
               cell128.setHorizontalAlignment(Element.ALIGN_CENTER);
               table9.addCell(cell128);
               doc.add(table9);
    
               //footer
               Connection conn0 = null; 
               PreparedStatement pst0 = null;
               String sql0 = null;
               float[] columnWidths0 = {70f, 30f};
               PdfPTable table0 = new PdfPTable(columnWidths0);
               table0.setWidthPercentage(100f);
               DriverManager.registerDriver(new com.mysql.jdbc.Driver());
               conn0 = DriverManager.getConnection(dbURL, dbUser, dbPass);
               sql0="select i_des,di_officer " +
                    "from dm_011 where i_des=? and di_officer=?";
               pst0 = conn0.prepareStatement(sql0);
               pst0.setString(1, p_ides);
               pst0.setString(2, p_diofficer);
               ResultSet rs0 = pst0.executeQuery();
               while(rs0.next()){
                   PdfPCell cell48 = new PdfPCell(new Phrase("Demand for " + rs0.getString("i_des"), bf12));
                   cell48.setRowspan(2);
                   table0.addCell(cell48);
                   PdfPCell cell49 = new PdfPCell(new Phrase(Chunk.NEWLINE));
                   cell49.setPaddingBottom(15);
                   cell49.setPaddingTop(15);
                   table0.addCell(cell49);
                   PdfPCell cell50 = new PdfPCell(new Phrase("Sign of Demanding Officer\n(" + rs0.getString("di_officer") + ")", bf12));
                   table0.addCell(cell50);
               }
               rs0.close();                                                                
               pst0.close();                                                              
               pst0 = null;                                                               
               conn0.close();                                                              
               conn0 = null;
               PdfPTable outertable = new PdfPTable(1);
              outertable.setWidthPercentage(100f);
              PdfPCell cellO1 = new PdfPCell();
              cellO1.setMinimumHeight(doc.getPageSize().getHeight() - 
                   (170f + table9.getTotalHeight()));
              cellO1.setVerticalAlignment(Element.ALIGN_BOTTOM);
              cellO1.setBorderColor(BaseColor.WHITE);
              cellO1.addElement(table0);
              outertable1.addCell(cellO1);
              doc.add(outertable);
        }
           stamper.close();
           doc.close();
           
          }catch(DocumentException e){
           e.printStackTrace();
          }
          catch(Exception e){
           e.printStackTrace();
          }
    } 
    /* (non-Java-doc)
     * @see javax.servlet.http.HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }               
}

The above code gives me the below error:

java.io.IOException: org.apache.catalina.connector.CoyoteOutputStream@10e18ba not found as file or resource.
    at com.itextpdf.text.io.RandomAccessSourceFactory.createByReadingToMemory(RandomAccessSourceFactory.java:263)
    at com.itextpdf.text.io.RandomAccessSourceFactory.createBestSource(RandomAccessSourceFactory.java:173)
    at com.itextpdf.text.pdf.PdfReader.<init>(PdfReader.java:219)
    at com.itextpdf.text.pdf.PdfReader.<init>(PdfReader.java:207)
    at com.itextpdf.text.pdf.PdfReader.<init>(PdfReader.java:197)
    at servlet_for_demand.formPart11PDF.doGet(formPart11PDF.java:737)
    at servlet_for_demand.formPart11PDF.doPost(formPart11PDF.java:810)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    at java.lang.Thread.run(Unknown Source)

Here I am attaching my database table creation code for developer to make solution easy.

create database test;
use test;
create table dm_011(mmg_no varchar(40),i_des varchar(40),tg_dir varchar(40));
insert into dm_011 values ('1','abcd','abcd1');
insert into dm_011 values ('2','efgh','efgh1');

Please help me, I can't find any solution.

0

There are 0 answers