ITextSharp重复HTML表头在PDF

本文关键字:PDF 表头 HTML 重复 ITextSharp | 更新日期: 2023-09-27 18:04:37

我在视图中有一个HTML表。我使用ITextSharp 4使用htmlParser将HTML转换为PDF。该表跨越多个页面。我如何让它在每个页面上显示标题?我可以在HTML中打开一些设置,以便ITextSharp可以识别它吗?

ITextSharp重复HTML表头在PDF

我无法访问iTextSharp 4.0,但由于HTML解析器直接写入文档,我不确定如果不修改原始源代码是否可能。是否可以升级到5.0,用更健壮的HTMLWorker对象完全取代HtmlParser ?

要有一个PdfPTable的标题跨越多个页面,你需要设置其HeaderRows属性的行数在你的标题。不幸的是,如果你使用的是HTMLParserHTMLWorker,他们目前并没有将THEADTH标签与TBODYTD标签区别对待。解决方案是在解析之后但在写入文档之前修改PdfPTable。我这里没有4.0,但在5.1.1.0使用HTMLWorker,你可以很容易地做到这一点,手动设置HeaderRows属性:

        //Output file
        string outputFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Table.pdf");
        using (FileStream fs = new FileStream(outputFile, FileMode.Create, FileAccess.Write, FileShare.Read))
        {
            using (Document doc = new Document(PageSize.LETTER))
            {
                using (PdfWriter w = PdfWriter.GetInstance(doc, fs))
                {
                    doc.Open();
                    doc.NewPage();
                    //Create some long text to force a new page
                    string longText = String.Concat(Enumerable.Repeat("Lorem ipsum.", 40));
                    //Create our table using both THEAD and TH which iTextSharp currently ignores
                    string html = "<table>";
                    html += "<thead><tr><th>Header Row 1/Cell 1</th><th>Header Row 1/Cell 2</th></tr><tr><th>Header Row 2/Cell 1</th><th>Header Row 2/Cell 2</th></tr></thead>";
                    html += "<tbody>";
                    for (int i = 3; i < 20; i++)
                    {
                        html += "<tr>";
                        html += String.Format("<td>Data Row {0}</td>", i);
                        html += String.Format("<td>{0}</td>", longText);
                        html += "</tr>";
                    }
                    html += "</tbody>";
                    html += "</table>";
                    using (StringReader sr = new StringReader(html))
                    {
                        //Get our list of elements (only 1 in this case)
                        List<IElement> elements = iTextSharp.text.html.simpleparser.HTMLWorker.ParseToList(sr, null);
                        foreach (IElement el in elements)
                        {
                            //If the element is a table manually set its header row count
                            if (el is PdfPTable)
                            {
                                ((PdfPTable)el).HeaderRows = 2;
                            }
                            doc.Add(el);
                        }
                    }
                    doc.Close();
                }
            }
        }

您应该能够设置:table。HeaderRows = 1;

这将重复每一页的标题

应用repeat-header样式,并设置为"yes",如下所示:

<table style="repeat-header:yes;">