【发布时间】:2015-11-20 14:26:49
【问题描述】:
我有一个模板分为 3 个文件(页眉、正文和页脚),所有这些文件都在 html 中。我需要使用
导出 pdf 文件itextsharp 库。
我使用以下代码来做到这一点。
导出文件的功能
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 时,页眉工作正常,但页脚不工作。我试图将页脚内容放在
的页脚上文件,但不成功。如果正文的内容太大而无法容纳一页,则设置页脚内容
在页眉下方和最后一页的内容下方。 下图说明了这个问题。
【问题讨论】:
-
请不要在
onStartPage()方法中添加任何内容。这可能导致各种不良副作用。这条评论并没有解决你的问题,但是你在onStartPage()方法中添加了header这一事实证明你忽略了文档。 -
请不要使用
document.Add()在onEndPage()中添加内容。传递给事件的document对象是一个特殊的PdfDocument对象,应该仅用于只读目的。这就是导致您的问题的原因。这也证明你忽略了文档。 -
不相关的旁注,
Document和PdfWriter都实现了IDisposable,因此您可以在它们上使用using范例而不是try/catch,并且您将得到保证@987654341 @ 在 dispose 期间会自动为您调用。 -
此外:您一遍又一遍地解析页眉和页脚的 HTML,浪费了大量的 CPU。为什么不创建一次页眉和页脚表,然后将相同的表对象作为 Form XObject 添加到每个页面。这将导致 PDF 文件的大小要小得多。
标签: c# pdf pdf-generation itextsharp