2011-03-16 48 views
10

我正在使用iTextSharpHTML頁面轉換爲PDF。我正在使用給定的幫助類here,我也試圖利用StyleSheet.LoadTagStyle()來應用CSS。但似乎沒有任何工作。任何見解?itextsharp - CSS未得到應用 - C#.NET

編輯

我能夠樣式添加這樣的 -

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

用下面的代碼 -

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

但是,當我有複雜的樣式,比如發生了什麼這個?

div .myclass 
{ 
    /*some styles*/ 
} 

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

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

如何使用iTextSharp添加它?

+0

嗨,我也堅持在同一個問題上,當我使用LoadTagStyle它完美的作品,我也可以得到它的工作「LoadStyle()」時,我只使用「顏色」屬性。但是,當我嘗試使用「font-color」或「font-size」屬性時,它似乎不起作用。在我們可以轉換css類的任何示例 – 2012-03-25 10:29:07

+4

使用[https://github.com/webgio/Rotativa](https://github.com/webgio/Rotativa),您可以通過nuget安裝它。它適用於使用webkit引擎呈現html/css的wkhtmltopdf。這很棒! **它支持html/css。** – 2012-04-24 13:03:32

+1

感謝@Preben Huybrechts如果你把它放在一個答案我會投票它 - 這實際上比修補ITextSharp更好。 – 2013-05-09 04:48:16

回答

14

您正在使用StyleSheet.LoadTagStyle()正確的方向。

基本上它是一個四個步驟:

  1. 獲取HTML字符串中的
  2. 實例化一個StyleSheet對象,並調用StyleSheet.LoadTagStyle()你希望每個風格。
  3. 致電HTMLWorker.ParseToList()
  4. 將上面調用返回的IElement(s)添加到Document對象。

這裏有一個簡單的HTTP handler

<%@ 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 for the HtmlTags class

+1

我編輯了我的問題。覈實。 – NLV 2011-03-16 12:43:46

+0

我想你也在[郵件列表](http://www.mail-archive.com/[email protected]/msg55976.html)上提過這個問題?如上所述,您需要等待一段時間或聯繫他們的諮詢團隊。 – kuujinbo 2011-03-16 23:19:56

3
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]); 
} 
+0

我編輯了我的問題。覈實。 – NLV 2011-03-16 12:44:40