Itextsharp在页面末尾插入页脚

时间:2015-11-20 14:26:49

标签: c# pdf pdf-generation itextsharp

我有一个模板分为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时,标题工作正常,但页脚不起作用。我试图将页脚内容放在

的页脚上

该文件,但未成功。如果正文的内容很大以适合一页,则设置页脚内容

标题下方和最后一页上的内容下方。 以下图片说明了这个问题。

PDF with one page. The footer is below of the content, but not positioned on the bottom of the page

Footer on the top of the first page and before body content

enter image description here

1 个答案:

答案 0 :(得分:1)

要更详细地解释一下Bruno在评论中所说的内容,如果您在页面事件中Add()内容,您可能会导致文档生成一个新页面,导致您的页面事件触发再次。更有趣的是,如果您的页面事件添加了太多内容,您实际上可能会遇到无限循环的添加,溢出,新页面,重复。

如果您想要一个真正的页眉和页脚,请将Document页边距设置为两者的高度,正常Document.Add()代码会尊重它。如果您每次尝试使用this code to calculate the height时都不知道页眉和/或页脚的高度。

然后,您可以使用页面事件或两遍来只使用DirectContentColumnText添加页眉和页脚以及已知的固定位置。您的内容看起来相当简单,因此您可以将其转换为普通的iTextSharp命令,但如果您希望保留HTML以获取页眉和页脚,请参阅this post以将HTML解析为元素列表并将其添加到{{1 }}