I have an HTML table in a view. I'm using ITextSharp to convert the HTML to a PDF. I want to use external CSS and repeat table header for each page. How do I get it to show the header on each page using CSS and page header?
This is to show my page header
str.Append("<table class='text-center'>");
str.Append("<tr class='h4'><td> " + companyName + " </ td ></ tr >");
str.Append("</table>");
And this to show my HTML
TextReader xmlString = new StringReader(str.Append(html).ToString());
And this to append my CSS
ICSSResolver cssResolver = XMLWorkerHelper.GetInstance().GetDefaultCssResolver(false);
cssResolver.AddCssFile(HttpContext.Current.Server.MapPath(@"~/Content/Print.css"), true);
IPipeline pipeline = new CssResolverPipeline(cssResolver,
new HtmlPipeline(htmlContext, new PdfWriterPipeline(document, writer)));
var worker = new XMLWorker(pipeline, true);
var xmlParse = new XMLParser(true, worker);
xmlParse.Parse(xmlString);
xmlParse.Flush();
This code work fine but I am using 1 table for showing data and the table header does not repeat for each page. If i am using this code to repeat headers for table, the CSS does not work. How can i resolve this issue, using both CSS and repeating header.
using (TextReader sr = new StringReader(html))
{
List<IElement> elements =
iTextSharp.text.html.simpleparser.HTMLWorker.ParseToList(sr, null);
foreach (IElement el in elements)
{
if (el is PdfPTable)
{
((PdfPTable)el).HeaderRows = 2;
}
document.Add(el);
xmlParse.Parse(sr);
}
}
XML Worker allows you to configure repeating table headers and footers through proprietary CSS properties: repeat-header
and repeat-footer
. These are not part of the CSS specification. They are only used by XML Worker for this specific purpose.
You can specify your header and footer rows using <thead>
and <tfoot>
.
<table style="repeat-header: yes; repeat-footer: yes;">
<tfoot>
<tr>
<td>Footer 1</td>
</tr>
</tfoot>
<thead>
<tr>
<td>Header 1</td>
</tr>
<tr>
<td>Header 2</td>
</tr>
</thead>
<tbody>
<!-- ... -->
</tbody>
</table>
In your last code sample, you use HTMLWorker
. You shouldn't. It's deprecated in favor of XMLWorker
.
So just use your code based on XMLWorker
and XMLParser
, with the CSS property repeat-header
as illustrated in the HTML sample above.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With