Itextsharp - CSS не применяется - С#.NET

Я использую iTextSharp для преобразования страницы HTML в PDF. Я использую класс-помощник, указанный здесь, и я также попытался использовать StyleSheet.LoadTagStyle() для применения CSS. Но ничего не работает. Любые идеи?

ИЗМЕНИТЬ

Я могу добавить такие стили -

.mystyle
{
   color: red;
   width: 400px;
}

Со следующим кодом -

StyleSheet css = new StyleSheet();
css.LoadStyle("mystyle", "color", "red");
css.LoadStyle("mystyle", "width", "400px");

Но что происходит, когда Ive сложные стили вроде этого?

div .myclass
{
    /*some styles*/
}

td a.hover
{
    /*some styles*/
}

td .myclass2
{
    /*some styles*/
}    
.myclass .myinnerclass
{
    /*some styles*/
}

Как добавить его с помощью iTextSharp?

Ответ 1

вы на правильном пути с помощью StyleSheet.LoadTagStyle().

в основном это четырехэтапный процесс:

  • получить HTML в строке
  • создайте объект StyleSheet и вызовите StyleSheet.LoadTagStyle() для каждого стиля, который вы хотите.
  • вызов HTMLWorker.ParseToList()
  • добавьте IElement (ы), возвращенный с предыдущего вызова в объект Document.

здесь простой обработчик HTTP:

<%@ WebHandler Language='C#' Class='styles' %>
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Web;
using iTextSharp.text.html;
using iTextSharp.text.html.simpleparser;
using iTextSharp.text;  
using iTextSharp.text.pdf;  

public class styles : IHttpHandler {
  public void ProcessRequest (HttpContext context) {
    HttpResponse Response = context.Response;
    Response.ContentType = "application/pdf";
    string Html = @"
<h1>h1</h1>
<p>A paragraph</p>    
<ul> 
<li>one</li>   
<li>two</li>   
<li>three</li>   
</ul>";
    StyleSheet styles = new StyleSheet();
    styles.LoadTagStyle(HtmlTags.H1, HtmlTags.FONTSIZE, "16");
    styles.LoadTagStyle(HtmlTags.P, HtmlTags.FONTSIZE, "10");
    styles.LoadTagStyle(HtmlTags.P, HtmlTags.COLOR, "#ff0000");
    styles.LoadTagStyle(HtmlTags.UL, HtmlTags.INDENT, "10");
    styles.LoadTagStyle(HtmlTags.LI, HtmlTags.LEADING, "16");
    using (Document document = new Document()) {
      PdfWriter.GetInstance(document, Response.OutputStream);
      document.Open();
      List<IElement> objects = HTMLWorker.ParseToList(
        new StringReader(Html), styles
      );
      foreach (IElement element in objects) {
        document.Add(element);
      }
    }
 }
  public bool IsReusable {
      get { return false; }
  }
} 

вам нужна версия 5.0.6 для запуска кода выше. поддержка синтаксического анализа HTML была значительно улучшена.

если вы хотите узнать, какие теги поддерживаются текущей версией, см. SVN для класса HtmlTags.

Ответ 2

var reader = new StringReader(text);
var styles = new StyleSheet();
styles.LoadTagStyle("body", "face", "Arial");
styles.LoadTagStyle("body", "size", fontSize + "px");
styles.LoadTagStyle("body", "font-weight", "bold");

ArrayList list = HTMLWorker.ParseToList(reader, styles);
for (int k = 0; k < list.Count; k++)
{

  var element = (IElement)list[k];

  if (element is Paragraph)
  {
    var paragraph = (Paragraph)element;
    paragraph.SpacingAfter = 10f;
    cell.AddElement(paragraph);
  }
 else
  cell.AddElement((IElement)list[k]);
}