我在视图中有一个HTML表。我正在使用ITextSharp 4使用htmlParser将HTML转换为PDF。该表跨越多个页面。如何让它在每个页面上显示标题?我可以在HTML中打开一些设置,以便ITextSharp可以识别吗?
答案 0 :(得分:4)
我无法访问iTextSharp 4.0,但由于HTML解析器直接写入文档,我不确定是否可以在不修改原始源的情况下使用。是否可以选择升级到5.0,将HtmlParser
完全替换为更强大的HTMLWorker
对象?
要让PdfPTable
的标题跨越多个页面,您需要将其HeaderRows
属性设置为标题中的行数。不幸的是,如果您使用的是HTMLParser
或HTMLWorker
,则他们目前不会THEAD
和TH
代码与TBODY
和TD
代码不同。解决方案是在解析之后但在写入文档之前修改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;">