How to add HTML headers and footers to a page?

前端 未结 2 1938
暗喜
暗喜 2020-12-02 02:13

How to add header to pdf from an html source using itext?

Currently, we have extended PdfPageEventHelper and overriden these methods. Works fine but it throws a Runt

2条回答
  •  自闭症患者
    2020-12-02 03:06

    Bruno's anwser is correct but it didn't worked for me completely as XMLWorkerHelper.parsetoElementsList was not able to parse some system fonts on the other hand XMLWorkerHelper.getInstance().parseXHtml(writer, document, is); } was able to parse system fonts correctly so i have to go down the route of elements handler which worked a treat here's the code in C#

        /// 
        /// returns pdf in bytes.
        /// 
        /// contents.
        /// header contents.
        /// footer contents.
        /// 
        public Byte[] GetPDF(string contentsHtml, string headerHtml, string footerHtml)
        {
            // Create a byte array that will eventually hold our final PDF
            Byte[] bytes;
    
            // Boilerplate iTextSharp setup here
    
            // Create a stream that we can write to, in this case a MemoryStream
            using (var ms = new MemoryStream())
            {
                // Create an iTextSharp Document which is an abstraction of a PDF but **NOT** a PDF
                using (var document = new Document(PageSize.A4, 40, 40, 120, 120))
                {
                    // Create a writer that's bound to our PDF abstraction and our stream
                    using (var writer = PdfWriter.GetInstance(document, ms))
                    {
                        // Open the document for writing
                        document.Open();
    
                        var headerElements = new HtmlElementHandler();
                        var footerElements = new HtmlElementHandler();
    
                        XMLWorkerHelper.GetInstance().ParseXHtml(headerElements, new StringReader(headerHtml));
    
                        XMLWorkerHelper.GetInstance().ParseXHtml(footerElements, new StringReader(footerHtml));
    
                        writer.PageEvent = new HeaderFooter(headerElements.GetElements(), footerElements.GetElements());
    
                        // Read your html by database or file here and store it into finalHtml e.g. a string
                        // XMLWorker also reads from a TextReader and not directly from a string
                        using (var srHtml = new StringReader(contentsHtml))
                        {
                            // Parse the HTML
                            iTextSharp.tool.xml.XMLWorkerHelper.GetInstance().ParseXHtml(writer, document, srHtml);
                        }
    
                        document.Close();
                    }
                }
    
                // After all of the PDF "stuff" above is done and closed but **before** we
                // close the MemoryStream, grab all of the active bytes from the stream
                bytes = ms.ToArray();
            }
            return bytes;
        }
    }
    

    page events and elements handler code is here

    public partial class HeaderFooter : PdfPageEventHelper
    {
        private ElementList HeaderElements { get; set; }
        private ElementList FooterElements { get; set; }
    
        public HeaderFooter(ElementList headerElements, ElementList footerElements)
        {
            HeaderElements = headerElements;
            FooterElements = footerElements;
        }
    
        public override void OnEndPage(PdfWriter writer, Document document)
        {
            base.OnEndPage(writer, document);
            try
            {
                ColumnText headerText = new ColumnText(writer.DirectContent);
                foreach (IElement e in HeaderElements)
                {
                    headerText.AddElement(e);
                }
                headerText.SetSimpleColumn(document.Left, document.Top, document.Right, document.GetTop(-100), 10, Element.ALIGN_MIDDLE);
                headerText.Go();
    
                ColumnText footerText = new ColumnText(writer.DirectContent);
                foreach (IElement e in FooterElements)
                {
                    footerText.AddElement(e);
                }
                footerText.SetSimpleColumn(document.Left, document.GetBottom(-100), document.Right, document.GetBottom(-40), 10, Element.ALIGN_MIDDLE);
                footerText.Go();
            }
            catch (DocumentException de)
            {
                throw new Exception(de.Message);
            }
        }
    }
    
    public class HtmlElementHandler : IElementHandler
    {
        public ElementList Elements { get; set; }
    
        public HtmlElementHandler()
        {
            Elements = new ElementList();
        }
    
        public ElementList GetElements()
        {
            return Elements;
        }
    
        public void Add(IWritable w)
        {
            if (w is WritableElement)
            {
                foreach (IElement e in ((WritableElement)w).Elements())
                {
                    Elements.Add(e);
                }
            }
        }
    }
    

提交回复
热议问题