Winnovative, Pdf Converter 动态设置页眉和页脚高度

Winnovative, PdfConverter Setting the Header and Footer height dynamicaly

我正在使用 Winnovative 的 PdfConverter 将我的 HTML 页面转换为 PDF,我能够获得带有页眉页脚和所有内容的 PDF。但是我有一个要求,我需要根据需要添加的文本内容动态设置页眉和页脚的高度。以下是我尝试实现此目的但未成功的代码。请你帮忙解决我在这里遗漏的问题,或者我需要遵循的任何其他方法。 PdfFooterOptions.FooterHeight 最初设置为默认 40px。

                PdfConverter pdfConverter = new PdfConverter();

                // set the converter options
                pdfConverter.PdfDocumentOptions.PdfPageSize = PdfPageSize.A4;
                pdfConverter.PdfDocumentOptions.PdfCompressionLevel = PdfCompressionLevel.Normal;
                pdfConverter.PdfDocumentOptions.PdfPageOrientation = PdfPageOrientation.Portrait;

                // set header and footer
                pdfConverter.PdfDocumentOptions.ShowHeader = true;
                pdfConverter.PdfDocumentOptions.ShowFooter = true;

                //Add header and footer text

                AddHeaderElements(pdfConverter, text);
                AddFooterElements(pdfConverter, text);
                // set the HTML content
                pdfConverter.PdfDocumentOptions.FitWidth = true;
                // set the embedded fonts option
                pdfConverter.PdfDocumentOptions.EmbedFonts = true;
                // set the live HTTP links option
                pdfConverter.PdfDocumentOptions.LiveUrlsEnabled = true;
                // set the JavaScript
                pdfConverter.JavaScriptEnabled = true;
                // set the images in PDF are compressed with JPEG to reduce the PDF document size
                pdfConverter.PdfDocumentOptions.JpegCompressionEnabled = true;
                // enable auto-generated bookmarks for a specified list of tags (e.g. H1 and H2)
                pdfConverter.PdfBookmarkOptions.HtmlElementSelectors = new string[] { "H1", "H2" };
                // Performs the conversion and get the pdf document bytes that can be further 
                // saved to a file or sent as response to browser
                // The baseURL parameter helps the converter to get the CSS files and images
                // referenced by a relative URL in the HTML string.  
                byte[] pdfValue = null;
                pdfValue = pdfConverter.GetPdfBytesFromHtmlString(htmlCodeToConvert);



    private void AddFooterElements(PdfConverter pdfConverter, string title)
    {
        //write the page number
        TextElement footerText = new TextElement(550, pdfConverter.PdfFooterOptions.FooterHeight - 20,
                    string.Format(uiContentController.GetText("Aanvarag_Page"), "&p;", "&P;"),
                    new System.Drawing.Font(new System.Drawing.FontFamily("Tahoma"),
                    7, System.Drawing.GraphicsUnit.Point));
        footerText.EmbedSysFont = true;
        footerText.TextAlign = HorizontalTextAlign.Left;
        pdfConverter.PdfFooterOptions.AddElement(footerText);

        // set the footer HTML area
        HtmlToPdfElement footerHtml = new HtmlToPdfElement(10, 0, 0,
                    0,
                    title, null, 1024, 0);

        footerHtml.NavigationCompletedEvent += OnFooterHtmlNavigationCompleted;

        pdfConverter.PdfFooterOptions.AddElement(footerHtml);
    }

    void OnFooterHtmlNavigationCompleted(NavigationCompletedParams eventParams)
    {
        // Get the header HTML width and height from event parameters
        float footerHtmlWidth = eventParams.HtmlContentWidthPt;
        float footerHtmlHeight = eventParams.HtmlContentHeightPt;

        // Calculate the header width from coverter settings
        float footerWidth = pdfConverter.PdfDocumentOptions.PdfPageSize.Width - pdfConverter.PdfDocumentOptions.LeftMargin -
                    pdfConverter.PdfDocumentOptions.RightMargin;

        // Calculate a resize factor to fit the header width
        float resizeFactor = 1;
        if (footerHtmlWidth > footerWidth)
            resizeFactor = footerWidth / footerHtmlWidth;

        // Calculate the header height to preserve the HTML aspect ratio
        float footerHeight = footerHtmlHeight * resizeFactor;

        // Set the calculated header height
        pdfConverter.PdfFooterOptions.FooterHeight = footerHeight;
    }

有一个working example with source code for headers。对于页脚应该是相似的。

// Define the HTML to PDF converter object as a class member to make it accessible in the headerHtml_NavigationCompletedEvent handler
// where the header height will be automatically adjusted
private HtmlToPdfConverter htmlToPdfConverter;

// Indicates if a line should be drawn at the botom of the header
private bool drawHeaderLine = true;

protected void convertToPdfButton_Click(object sender, EventArgs e)
{
    // Create a HTML to PDF converter object with default settings
    htmlToPdfConverter = new HtmlToPdfConverter();

    // Set license key received after purchase to use the converter in licensed mode
    // Leave it not set to use the converter in demo mode
    htmlToPdfConverter.LicenseKey = "fvDh8eDx4fHg4P/h8eLg/+Dj/+jo6Og=";

    // Enable header in the generated PDF document
    htmlToPdfConverter.PdfDocumentOptions.ShowHeader = true;

    string headerHtmlUrl = Server.MapPath("~/DemoAppFiles/Input/HTML_Files/Header_HTML.html");
    Document documentObject = null;
    try
    {
        if (autoResizeHeaderRadioButton.Checked)
        {
            // Create a HTML element to be added in header
            HtmlToPdfElement headerHtml = new HtmlToPdfElement(headerHtmlUrl);

            // Install a handler where to set the automatically calculated header height
            headerHtml.NavigationCompletedEvent += new NavigationCompletedDelegate(headerHtml_NavigationCompletedEvent);

            // Add the HTML element to header
            // When the element is rendered in header by converter, the headerHtml_NavigationCompletedEvent handler 
            // will be invoked and the header height will be automatically calculated
            htmlToPdfConverter.PdfHeaderOptions.AddElement(headerHtml);

            // Call the converter to produce a Document object
            documentObject = htmlToPdfConverter.ConvertUrlToPdfDocumentObject(urlTextBox.Text);

            // Uninstall the handler
            headerHtml.NavigationCompletedEvent -= new NavigationCompletedDelegate(headerHtml_NavigationCompletedEvent);

            // Draw a line at the header bottom
            if (drawHeaderLine)
            {
                float headerWidth = documentObject.Header.Width;
                float headerHeight = documentObject.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
                documentObject.Header.AddElement(headerLine);
            }

            // Save the PDF document in a memory buffer
            byte[] outPdfBuffer = documentObject.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=Auto_Resize_Header_Footer.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();
        }
        else
        {
            // Create a HTML to PDF element to be added in header
            HtmlToPdfElement headerHtml = new HtmlToPdfElement(headerHtmlUrl);

            // Set a fixed header height in points
            htmlToPdfConverter.PdfHeaderOptions.HeaderHeight = float.Parse(headerHeightTextBox.Text);

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

            // Add HTML element to fit the fixed header height
            htmlToPdfConverter.PdfHeaderOptions.AddElement(headerHtml);

            // Draw a line at the header bottom
            if (drawHeaderLine)
            {
                // Calculate the header width based on PDF page size and margins
                float headerWidth = htmlToPdfConverter.PdfDocumentOptions.PdfPageSize.Width -
                            htmlToPdfConverter.PdfDocumentOptions.LeftMargin - htmlToPdfConverter.PdfDocumentOptions.RightMargin;

                // Calculate header height
                float headerHeight = htmlToPdfConverter.PdfHeaderOptions.HeaderHeight;

                // 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
                htmlToPdfConverter.PdfHeaderOptions.AddElement(headerLine);
            }

            // Convert the HTML page to a PDF document in a memory buffer
            byte[] outPdfBuffer = htmlToPdfConverter.ConvertUrl(urlTextBox.Text);

            // 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=Auto_Resize_Header_Footer.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
    {
        // Close the PDF document
        if (documentObject != null)
            documentObject.Close();
    }
}

/// <summary>
/// This handler is called after the navigation to header HTML completed. The document header is resized in this event handler
/// </summary>
/// <param name="eventParams">The event parameter containing the HTML content size in pixels and points</param>
void headerHtml_NavigationCompletedEvent(NavigationCompletedParams eventParams)
{
    // Get the header HTML width and height from event parameters
    float headerHtmlWidth = eventParams.HtmlContentWidthPt;
    float headerHtmlHeight = eventParams.HtmlContentHeightPt;

    // Calculate the header width from coverter settings
    float headerWidth = htmlToPdfConverter.PdfDocumentOptions.PdfPageSize.Width - htmlToPdfConverter.PdfDocumentOptions.LeftMargin -
                htmlToPdfConverter.PdfDocumentOptions.RightMargin;

    // Calculate a resize factor to fit the header width
    float resizeFactor = 1;
    if (headerHtmlWidth > headerWidth)
        resizeFactor = headerWidth / headerHtmlWidth;

    // Calculate the header height to preserve the HTML aspect ratio
    float headerHeight = headerHtmlHeight * resizeFactor;

    if (!(headerHeight < htmlToPdfConverter.PdfDocumentOptions.PdfPageSize.Height - htmlToPdfConverter.PdfDocumentOptions.TopMargin -
                htmlToPdfConverter.PdfDocumentOptions.BottomMargin))
    {
        throw new Exception("The header height cannot be bigger than PDF page height");
    }

    // Set the calculated header height
    htmlToPdfConverter.PdfDocumentOptions.DocumentObject.Header.Height = headerHeight;
}