2014-06-25 60 views
3

我到處搜索這個問題,我仍然無法獲得工作解決方案wrrr,這是非常煩人的。iTextSharp XMLWorker Footer from html

我使用xmlworker(itextsharp 2.1)從html創建pdf。這對我來說是完美的,但我需要添加頁腳和頁眉到由傳遞的HTML片段填充的每個頁面。在例子中,我這個字符串傳遞給函數的頁腳HTML

<table> 
    <tr> 
     <td>كند/źćąśęłżźń</td> 
     <td>something</td> 
     <td><img src="i_03_x2.png"/></td> 
    </tr> 
</table> 

,我需要解析它使用XMLWorker.GetInstance(列出),並將其添加爲頁腳:

public override void OnEndPage(PdfWriter writer, Document document) 
{ 
    PdfPTable footerTable = new PdfPTable(1); 
    footerTable.TotalWidth = width; 
    PdfPCell singleCell = new PdfPCell(); 
    singleCell.BorderWidth = 2f; 

    DirectHandler handler = new DirectHandler(); 
    using (TextReader sr = new StringReader(HTMLtoPDF.footer.HTML)) 
    { 
     XMLWorkerHelper.GetInstance().ParseXHtml(handler, sr); 
    } 

    foreach (var element in handler.elements) 
    { 
     singleCell.AddElement(element); 
    } 

    footerTable.AddCell(singleCell); 
    footerTable.WriteSelectedRows(0, -1, left, bottom, writer.DirectContent); 
} 

public class DirectHandler : IElementHandler 
{ 
    public List<IElement> elements = new List<IElement>(); 
    public void Add(IWritable w) 
    { 
     if (w is WritableElement) 
     { 
      elements.AddRange(((WritableElement)w).Elements()); 
     } 
    } 
} 

而且現在第二和從HTML顯示,但第一個丟失三列,所以我的問題是:

是否有可能我的字體(宋體的Unicode)連接到

XMLWorkerHelper.GetInstance().ParseXHtml 

使用我的處理程序和字體? ParseXHtml函數有多個重載,但我需要使用DirectHandler作爲IElement處理程序和MY FONT(arialuni.ttf)作爲字體提供程序。 任何幫助,將不勝感激

+0

你能更改HTML位有字體信息?如果是這樣,[試試這個](http://stackoverflow.com/a/12230552/231316)。如果您無法更改HTML,請參閱此文件(http://stackoverflow.com/a/11564028/231316),以便在'for'循環中設置字體。 –

+0

在循環中設置字體僅適用於段落,其他元素(假設我們使用XMLWorker而不是HTMLWorker)不適用。我有一個帶有字體的外部樣式表,但是在這裏我遇到了同樣的問題 - 我無法將它添加到ParseXHtml函數中。 –

+1

我認爲這是你正在尋找的然後:http://stackoverflow.com/a/16105368/231316 –

回答

-1

好吧,我想通了,首先 - 我需要完全從ParseXHtml函數退出。我使用的標準XMLWorker與這條管道:

PdfWriterPipeline pdf = new ElementHandlerPipeline(handler, null) 

而是默認之一:

PdfWriterPipeline pdf = new PdfWriterPipeline(document, writer); 

然後我可以通過元素在處理程序遍歷

foreach (var element in handler.elements) 
{ 
    singleCell.AddElement(element); 
} 

footerTable.AddCell(singleCell); 
+0

請粘貼完整的代碼 – Ovis