如何在HTML呈现器中分页HTML内容

时间:2017-06-07 12:54:11

标签: pdf-generation html-renderer

我有一个项目,使用HTML呈现器将HTML代码转换为PDF。 HTML代码包含一个表。显示PDF但问题是表格的内容在最后被截断。那么这个问题是否有任何解决方案?enter image description here

PdfDocument pdf = new PdfDocument();

            var config = new PdfGenerateConfig()
            {
                MarginBottom = 20,
                MarginLeft = 20,
                MarginRight = 20,
                MarginTop = 20,
            };
            //config.PageOrientation = PageOrientation.Landscape;
            config.ManualPageSize = new PdfSharp.Drawing.XSize(1080, 828);

            pdf = PdfGenerator.GeneratePdf(html, config);

            byte[] fileContents = null;
            using (MemoryStream stream = new MemoryStream())
            {
                pdf.Save(stream, true);
                fileContents = stream.ToArray();
                return new FileStreamResult(new MemoryStream(fileContents.ToArray()), "application/pdf");
            }

3 个答案:

答案 0 :(得分:2)

HTMLRenderer应该可以将表格分解到下一页 另见:
https://github.com/ArthurHub/HTML-Renderer/pull/41

确保您使用的是最新版本。您可能必须添加这些CSS属性。

另见这个答案:
https://stackoverflow.com/a/37833107/162529

答案 1 :(得分:1)

据我所知,不支持分页符,但是我通过使用分页符类将HTML拆分为单独的页面,然后添加了一些解决方法(可能不适用于所有情况) pdf的每一页。

请参见下面的示例代码:

    //This will only work on page break elements that are direct children of the body element.
    //Each page's content must be inside the pagebreak element
    private static PdfDocument SplitHtmlIntoPagedPdf(string html, string pageBreakBeforeClass, PdfGenerateConfig config, PdfDocument pdf)
    {
        var htmlDoc = new HtmlDocument();
        htmlDoc.LoadHtml(html);
        var htmlBodyNode = htmlDoc.DocumentNode.SelectSingleNode("//body");

        var tempHtml = string.Empty;
        foreach (var bodyNode in htmlBodyNode.ChildNodes)
        {
            if (bodyNode.Attributes["class"]?.Value == pageBreakBeforeClass)
            {
                if (!string.IsNullOrWhiteSpace(tempHtml))
                {
                    //add any content found before the page break
                    AddPageToPdf(htmlDoc,tempHtml,config,ref pdf);
                    tempHtml = string.Empty;
                }
                AddPageToPdf(htmlDoc,bodyNode.OuterHtml,config,ref pdf);
            }
            else
            {
                tempHtml += bodyNode.OuterHtml;
            }
        }
        if (!string.IsNullOrWhiteSpace(tempHtml))
        {
            //add any content found after the last page break
            AddPageToPdf(htmlDoc, tempHtml, config, ref pdf);
        }

        return pdf;
    }

    private static void AddPageToPdf(HtmlDocument htmlDoc, string html, PdfGenerateConfig config, ref PdfDocument pdf)
    {
        var tempDoc = new HtmlDocument();
        tempDoc.LoadHtml(htmlDoc.DocumentNode.OuterHtml);
        var docNode = tempDoc.DocumentNode;
        docNode.SelectSingleNode("//body").InnerHtml = html;
        var nodeDoc = PdfGenerator.GeneratePdf(docNode.OuterHtml, config);
        using (var tempMemoryStream = new MemoryStream())
        {
            nodeDoc.Save(tempMemoryStream, false);
            var openedDoc = PdfReader.Open(tempMemoryStream, PdfDocumentOpenMode.Import);
            foreach (PdfPage page in openedDoc.Pages)
            {
                pdf.AddPage(page);
            }
        }
    }

然后按如下所示调用代码:

            var pdf = new PdfDocument();
            var config = new PdfGenerateConfig()
            {
                MarginLeft = 5,
                MarginRight = 5,
                PageOrientation = PageOrientation.Portrait,
                PageSize = PageSize.A4
            };
            if (!string.IsNullOrWhiteSpace(pageBreakBeforeClass))
            {
                pdf = SplitHtmlIntoPagedPdf(html, pageBreakBeforeClass, config, pdf);
            }
            else
            {
                pdf = PdfGenerator.GeneratePdf(html, config);
            }

对于要在其自己的页面中包含的任何html,只需将html放入具有“ pagebreak”类(或任何您想调用的类)的div中。如果愿意,可以将该类添加到CSS中,并给它“ page-break-before:always;”,这样html才易于打印。

答案 2 :(得分:0)

我刚刚想出了如何使它工作,而不是在 TD 上进行分页,而是在 TABLE 上进行。代码如下:

table { page-break-inside: avoid; }

我目前使用以下版本(目前不在稳定版本上工作): v1.5.1-beta1 上的 HtmlRenderer PDFsharp v1.51.5185-beta