ITextSharp以PDF格式重复HTML表格标题

时间:2011-08-06 21:25:57

标签: c# html itextsharp

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

3 个答案:

答案 0 :(得分:4)

我无法访问iTextSharp 4.0,但由于HTML解析器直接写入文档,我不确定是否可以在不修改原始源的情况下使用。是否可以选择升级到5.0,将HtmlParser完全替换为更强大的HTMLWorker对象?

要让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();
                }
            }
        }

答案 1 :(得分:3)

你应该只能设置:table.HeaderRows = 1;

这将重复每页的标题。

答案 2 :(得分:2)

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

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