我有一個模板分成3個文件(標題,正文和頁腳),所有這些都在html中。我需要使用Itextsharp在頁面末尾插入頁腳
itextsharp庫導出pdf文件。
我使用下面的代碼來做到這一點。
功能將文件
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()'方法中添加頭部的事實證明你忽略了文檔。 –
請**不要**使用'document.Add()'在'onEndPage()'中添加內容。傳遞給事件的'document'對象是一個特殊的'PdfDocument'對象,應該只用於*只讀*目的。這是導致你的問題的原因。它也證明你忽略了文檔。 –
無關的注意事項,'Document'和'PdfWriter'都實現了'IDisposable',所以你可以使用''using'範例而不是'try/catch',並保證'Close()'被調用爲您在處置期間自動處理。 –