EVO HTML to PDF Converter

Change Header and Footer per Page

EVO HTML to PDF Converter for .NET Documentation

EVO HTML to PDF Converter allows you to override the default document header or footer with a custom header or footer in one or many pages of the PDF document. The override is made in the handler of the HtmlToPdfElementPrepareRenderPdfPageEvent event of the EvoPdfHtmlToPdfElement class. The custom header and footer are created with the PdfPageAddHeaderTemplate(Single) and PdfPageAddFooterTemplate(Single) methods of the EvoPdfPdfPage object exposed by the event parameters.

Code Sample - Change Header and Footer per Page

protected void createPdfButton_Click(object sender, EventArgs e)
{
    // Create a PDF document
    Document pdfDocument = new Document();

    // Set license key received after purchase to use the converter in licensed mode
    // Leave it not set to use the converter in demo mode
    pdfDocument.LicenseKey = "4W9+bn19bn5ue2B+bn1/YH98YHd3d3c=";

    // Add a PDF page to PDF document
    PdfPage pdfPage = pdfDocument.AddPage();

    HtmlToPdfElement htmlToPdfElement = null;
    try
    {
        // Add a default document header
        AddHeader(pdfDocument, true);

        // Add a default document footer
        AddFooter(pdfDocument, true, true);

        // Create a HTML to PDF element to add to document
        htmlToPdfElement = new HtmlToPdfElement(0, 0, urlTextBox.Text);

        // Optionally set a delay before conversion to allow asynchonous scripts to finish
        htmlToPdfElement.ConversionDelay = 2;

        // Install a handler where to change the header and footer in pages generated by the HTML to PDF element
        htmlToPdfElement.PrepareRenderPdfPageEvent += new PrepareRenderPdfPageDelegate(htmlToPdfElement_PrepareRenderPdfPageEvent);

        // Add the HTML to PDF element to document
        // This will raise the PrepareRenderPdfPageEvent event where the header can be changed per page
        pdfPage.AddElement(htmlToPdfElement);

        // Save the PDF document in a memory buffer
        byte[] outPdfBuffer = pdfDocument.Save();

        // Send the PDF as response to browser

        // Set response content type
        Response.AddHeader("Content-Type", "application/pdf");

        // Instruct the browser to open the PDF file as an attachment or inline
        Response.AddHeader("Content-Disposition", String.Format("attachment; filename=Change_Header_Footer_Per_Page.pdf; size={0}", outPdfBuffer.Length.ToString()));

        // Write the PDF document buffer to HTTP response
        Response.BinaryWrite(outPdfBuffer);

        // End the HTTP response and stop the current page processing
        Response.End();
    }
    finally
    {
        // uninstall handler
        htmlToPdfElement.PrepareRenderPdfPageEvent -= new PrepareRenderPdfPageDelegate(htmlToPdfElement_PrepareRenderPdfPageEvent);

        // Close the PDF document
        pdfDocument.Close();
    }
}

/// <summary>
/// The handler for HtmlToPdfElement.PrepareRenderPdfPageEvent event where you can set the visibility of header and footer
/// in each page or you can add a custom header or footer in a page
/// </summary>
/// <param name="eventParams">The event parameter containin the PDF page to customize before rendering</param>
void htmlToPdfElement_PrepareRenderPdfPageEvent(PrepareRenderPdfPageParams eventParams)
{
    if ((eventParams.PageNumber == 1) && changeHeaderAndFooterCheckBox.Checked)
    {
        // Change the header and footer in first page with an alternative header and footer

        // The PDF page being rendered
        PdfPage pdfPage = eventParams.Page;

        // Add a custom header of 80 points in height to this page
        // The default document header will be replaced in this page
        pdfPage.AddHeaderTemplate(80);
        // Draw the page header elements
        DrawAlternativePageHeader(pdfPage.Header, true);

        // Add a custom footer of 80 points in height to this page
        // The default document footer will be replaced in this page
        pdfPage.AddFooterTemplate(80);
        // Draw the page header elements
        DrawAlternativePageFooter(pdfPage.Footer, true, true);
    }
}

/// <summary>
/// Add a header to document
/// </summary>
/// <param name="pdfDocument">The PDF document object</param>
/// <param name="drawHeaderLine">A flag indicating if a line should be drawn at the bottom of the header</param>
private void AddHeader(Document pdfDocument, bool drawHeaderLine)
{
    string headerHtmlUrl = Server.MapPath("~/DemoAppFiles/Input/HTML_Files/Header_HTML.html");

    // Create the document header template
    pdfDocument.AddHeaderTemplate(60);

    // Create a HTML element to be added in header
    HtmlToPdfElement headerHtml = new HtmlToPdfElement(headerHtmlUrl);

    // Set the HTML element to fit the container height
    headerHtml.FitHeight = true;

    // Add HTML element to header
    pdfDocument.Header.AddElement(headerHtml);

    if (drawHeaderLine)
    {
        float headerWidth = pdfDocument.Header.Width;
        float headerHeight = pdfDocument.Header.Height;

        // Create a line element for the bottom of the header
        LineElement headerLine = new LineElement(0, headerHeight - 1, headerWidth, headerHeight - 1);

        // Set line color
        headerLine.ForeColor = Color.Gray;

        // Add line element to the bottom of the header
        pdfDocument.Header.AddElement(headerLine);
    }
}

/// <summary>
/// Add a footer to document
/// </summary>
/// <param name="pdfDocument">The PDF document object</param>
/// <param name="addPageNumbers">A flag indicating if the page numbering is present in footer</param>
/// <param name="drawFooterLine">A flag indicating if a line should be drawn at the top of the footer</param>
private void AddFooter(Document pdfDocument, bool addPageNumbers, bool drawFooterLine)
{
    string footerHtmlUrl = Server.MapPath("~/DemoAppFiles/Input/HTML_Files/Footer_HTML.html");

    // Create the document footer template
    pdfDocument.AddFooterTemplate(60);

    // Set footer background color
    RectangleElement backColorRectangle = new RectangleElement(0, 0, pdfDocument.Footer.Width, pdfDocument.Footer.Height);
    backColorRectangle.BackColor = Color.WhiteSmoke;
    pdfDocument.Footer.AddElement(backColorRectangle);

    // Create a HTML element to be added in footer
    HtmlToPdfElement footerHtml = new HtmlToPdfElement(footerHtmlUrl);

    // Set the HTML element to fit the container height
    footerHtml.FitHeight = true;

    // Add HTML element to footer
    pdfDocument.Footer.AddElement(footerHtml);

    // Add page numbering
    if (addPageNumbers)
    {
        // Create a text element with page numbering place holders &p; and & P;
        TextElement footerText = new TextElement(0, 30, "Page &p; of &P;  ",
            new System.Drawing.Font(new System.Drawing.FontFamily("Times New Roman"), 10, System.Drawing.GraphicsUnit.Point));

        // Align the text at the right of the footer
        footerText.TextAlign = HorizontalTextAlign.Right;

        // Set page numbering text color
        footerText.ForeColor = Color.Navy;

        // Embed the text element font in PDF
        footerText.EmbedSysFont = true;

        // Add the text element to footer
        pdfDocument.Footer.AddElement(footerText);
    }

    if (drawFooterLine)
    {
        float footerWidth = pdfDocument.Footer.Width;

        // Create a line element for the top of the footer
        LineElement footerLine = new LineElement(0, 0, footerWidth, 0);

        // Set line color
        footerLine.ForeColor = Color.Gray;

        // Add line element to the bottom of the footer
        pdfDocument.Footer.AddElement(footerLine);
    }
}

/// <summary>
/// Draw the alternative page header elements
/// </summary>
/// <param name="headerTemplate">The page header template</param>
/// <param name="drawHeaderLine">A flag indicating if a line should be drawn at the bottom of the header</param>
private void DrawAlternativePageHeader(Template headerTemplate, bool drawHeaderLine)
{
    string headerHtmlUrl = Server.MapPath("~/DemoAppFiles/Input/HTML_Files/Header_Alt_HTML.html");

    // Create a HTML element to be added in header
    HtmlToPdfElement headerHtml = new HtmlToPdfElement(headerHtmlUrl);

    // Set the HTML element to fit the container height
    headerHtml.FitHeight = true;

    // Add HTML element to header
    headerTemplate.AddElement(headerHtml);

    if (drawHeaderLine)
    {
        float headerWidth = headerTemplate.Width;
        float headerHeight = headerTemplate.Height;

        // Create a line element for the bottom of the header
        LineElement headerLine = new LineElement(0, headerHeight - 1, headerWidth, headerHeight - 1);

        // Set line color
        headerLine.ForeColor = Color.Gray;

        // Add line element to the bottom of the header
        headerTemplate.AddElement(headerLine);
    }
}

/// <summary>
/// Draw the alternative page footer elements
/// </summary>
/// <param name="htmlToPdfConverter">The HTML to PDF Converter object</param>
/// <param name="addPageNumbers">A flag indicating if the page numbering is present in footer</param>
/// <param name="drawFooterLine">A flag indicating if a line should be drawn at the top of the footer</param>
private void DrawAlternativePageFooter(Template footerTemplate, bool addPageNumbers, bool drawFooterLine)
{
    string footerHtmlUrl = Server.MapPath("~/DemoAppFiles/Input/HTML_Files/Footer_Alt_HTML.html");

    // Create a HTML element to be added in footer
    HtmlToPdfElement footerHtml = new HtmlToPdfElement(footerHtmlUrl);

    // Set the HTML element to fit the container height
    footerHtml.FitHeight = true;

    // Add HTML element to footer
    footerTemplate.AddElement(footerHtml);

    // Add page numbering
    if (addPageNumbers)
    {
        // Create a text element with page numbering place holders &p; and & P;
        TextElement footerText = new TextElement(10, 30, "Page &p; of &P;",
            new System.Drawing.Font(new System.Drawing.FontFamily("Times New Roman"), 10, System.Drawing.GraphicsUnit.Point));

        // Align the text at the right of the footer
        footerText.TextAlign = HorizontalTextAlign.Left;

        // Set page numbering text color
        footerText.ForeColor = Color.Navy;

        // Embed the text element font in PDF
        footerText.EmbedSysFont = true;

        // Add the text element to footer
        footerTemplate.AddElement(footerText);
    }

    if (drawFooterLine)
    {
        float footerWidth = footerTemplate.Width;

        // Create a line element for the top of the footer
        LineElement footerLine = new LineElement(0, 0, footerWidth, 0);

        // Set line color
        footerLine.ForeColor = Color.Gray;

        // Add line element to the bottom of the footer
        footerTemplate.AddElement(footerLine);
    }
}