我有一个模板分为3个文件(页眉,正文和页脚),所有这些都在html中。我需要使用
导出pdf文件itextsharp lib。
我使用下面的代码来做到这一点。
导出文件的功能
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;
}
和页面事件
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();
}
}
当我导出到pdf时,标题工作正常,但页脚不起作用。我试图将页脚内容放在
的页脚上该文件,但未成功。如果正文的内容很大以适合一页,则设置页脚内容
标题下方和最后一页上的内容下方。 以下图片说明了这个问题。
答案 0 :(得分:1)
要更详细地解释一下Bruno在评论中所说的内容,如果您在页面事件中Add()
内容,您可能会导致文档生成一个新页面,导致您的页面事件触发再次。更有趣的是,如果您的页面事件添加了太多内容,您实际上可能会遇到无限循环的添加,溢出,新页面,重复。
如果您想要一个真正的页眉和页脚,请将Document
页边距设置为两者的高度,正常Document.Add()
代码会尊重它。如果您每次尝试使用this code to calculate the height时都不知道页眉和/或页脚的高度。
然后,您可以使用页面事件或两遍来只使用DirectContent
或ColumnText
添加页眉和页脚以及已知的固定位置。您的内容看起来相当简单,因此您可以将其转换为普通的iTextSharp命令,但如果您希望保留HTML以获取页眉和页脚,请参阅this post以将HTML解析为元素列表并将其添加到{{1 }}