2017-05-04 59 views
1

我已經找到了解決方案,在ColumnText中插入已解析的HTML,但我還沒有找到任何解決方案。在ColumnText中插入已解析的HTML

我有一個HTML文本爲:

String text = '<p>Hello <strong>world</strong>!</p>'; 

我需要將其插入到一個ColumnText

PdfContentByte content = ConvertToHtmlForColumnText(text); 
ColumnText cb = new ColumnText(content); 

在PDF文件中的結果必然是:

你好世界

你有什麼主意實施ConvertToHtmlForColumnText(String text)方法嗎?

+0

雖然很容易解析HTML並且在'ColumnText'繪製它,你的方法'ConvertToHtmlForColumnText(字符串文本)'返回'PdfContentByte'沒有意義。 'ConvertToHtmlForColumnText'應該根據HTML'String'返回一個'PdfContentByte'嗎? – mkl

+0

「ConvertToHtmlForColumnText」方法將分析html字符串,並生成正確的對象以插入到ColumnText中,並在PDF中顯示爲富文本。 – Kanfor

+0

*「生成要在ColumnText中插入的正確對象」* - 這將是可能的,但您希望它返回一個「PdfContentByte」而不是您想要構造「ColumnText」的。 – mkl

回答

1

的方法ConvertToHtmlForColumnText(String text)返回PdfContentByte沒有意義,畢竟方法只具有String text一起工作,沒有PdfWriterPdfContentByte

方法ConvertToHtmlForColumnText(String text)返回的元素稍後添加到ColumnText,另一方面確實有意義,例如,

List<IElement> ConvertToHtmlForColumnText(String text) 
{ 
    ListElementHandler listHandler = new ListElementHandler(); 
    XMLWorkerHelper.GetInstance().ParseXHtml(listHandler, new StringReader(text)); 
    return listHandler.List; 
} 

使用該定製IElementHandler實施

public class ListElementHandler : IElementHandler 
{ 
    List<IElement> elements = new List<IElement>(); 

    public List<IElement> List => elements; 

    public void Add(IWritable w) 
    { 
     if (w is WritableElement) 
     { 
      foreach (IElement e in ((WritableElement)w).Elements()) 
      { 
       elements.Add(e); 
      } 
     } 
    } 
} 

可用於檢索的更高版本可以使用句法糖

此自定義擴展被添加到 ColumnText這樣

String text = "<p>Hello <strong>world</strong>!</p>"; 
List<IElement> parsedText = ConvertToHtmlForColumnText(text); 

using (Document document = new Document(PageSize.A4)) 
{ 
    PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(result, FileMode.Create)); 
    document.Open(); 

    ColumnText ct = new ColumnText(writer.DirectContent); 
    ct.SetSimpleColumn(document.Left, document.Bottom, document.Right, document.Top); 
    ct.Add(parsedText); 
    ct.Go(); 
} 

元件

public static class ColumnTextListExtension 
{ 
    public static void Add(this ColumnText ct, List<IElement> elements) 
    { 
     foreach (IElement e in elements) 
     { 
      ct.AddElement(e); 
     } 
    } 
} 

導致

screenshot of result

+0

謝謝@mkl,我會試試你的解決方案。 – Kanfor