【问题标题】:How to Page Break HTML Content in HTML Renderer如何在 HTML 渲染器中分页 HTML 内容
【发布时间】:2017-11-08 20:13:49
【问题描述】:

我有一个使用 HTML 渲染器将 HTML 代码转换为 PDF 的项目。 HTML 代码包含一个表格。显示 PDF,但问题是表格的内容在最后被截断。那么有没有什么解决办法呢?

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");
            }

【问题讨论】:

  • PDFsharp 无法转换 HTML。您正在使用哪些工具?也许显示一些代码。
  • 对不起..代码显示..

标签: pdf-generation html-renderer


【解决方案1】:

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

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

另请参阅此答案:
https://stackoverflow.com/a/37833107/162529

【讨论】:

    【解决方案2】:

    据我所知,不支持分页符,但我通过使用分页符类将 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 就可以打印了。

    【讨论】:

    • 这个的另一个实现可以在here找到。简单一点,不需要添加额外的引用
    【解决方案3】:

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

    table { page-break-inside: avoid; }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-29
      • 1970-01-01
      • 2017-11-16
      • 1970-01-01
      • 1970-01-01
      • 2015-01-30
      • 1970-01-01
      相关资源
      最近更新 更多