I have a template split into 3 files(header, body and footer), all of them in html. I need to export a pdf file using
itextsharp lib.
I use the folowing code to do that.
Function to export the file
public string GeneratePDF(Dictionary<string, object> fieldValues, string pdfPath, string templatePath)
{
//Inicializes a New Document
Document document = new Document(PageSize.A4,0,0,0,0);
try
{
PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(pdfPath, FileMode.Create));
PdfPageEvents events = new PdfPageEvents();
//Initializes page events
writer.PageEvent = events;
//Open Document
document.Open();
//Gerar efetivamente o html
TemplateHelper objTemplate = new TemplateHelper();
//This function is not important, only replaces the content by a dictionary
string htmlContent = objTemplate.GenerateHTML(fieldValues, templatePath);
//Gerar o PD
StringReader reader = new StringReader(htmlContent);
XMLWorkerHelper.GetInstance().ParseXHtml(writer, document, reader);
}
catch (Exception ex)
{
throw;
}
finally
{
document.Close();
}
return pdfPath;
}
and the page events
public class PdfPageEvents : PdfPageEventHelper
{
public override void OnStartPage(PdfWriter writer, Document document)
{
StreamReader template = new StreamReader(@"d:\Header.html");
string htmlContent = template.ReadToEnd();
StringReader reader = new StringReader(htmlContent);
ElementList e = XMLWorkerHelper.ParseToElementList(htmlContent, "");
PdfDiv div = (PdfDiv)e.First();
document.Add(div.Content.First());
template.Close();
template = new StreamReader(@"d:\Footer.html");
htmlContent = template.ReadToEnd();
reader = new StringReader(htmlContent);
}
//começa com o cabeçalho
public override void OnEndPage(PdfWriter writer, Document document)
{
StreamReader template = new StreamReader(@"d:\Footer.html");
string htmlContent = template.ReadToEnd();
StringReader reader = new StringReader(htmlContent);
ElementList elementListFooter = XMLWorkerHelper.ParseToElementList(htmlContent, "");
PdfDiv div = (PdfDiv)elementListFooter.First();
PdfPTable t = (PdfPTable)div.Content.First();
document.Add(t);
template.Close();
}
}
When I export to pdf, the header works fine, but the footer don't work. I tried to put the footer content on the footer of
the document, but unsuccessfully. If the content of the body is to large to fit in one page, the footer content is set
below the header and below the content on the last page. The follow image illustrates this problem.