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.