Bolding with Rich Text Values in iTextSharp

 ̄綄美尐妖づ 提交于 2019-11-28 12:32:23

As @kuujinbo pointed out there is the XMLWorker object which is where most of the new HTML parsing work is being done. But if you've just got simple commands like bold or italic you can use the native iTextSharp.text.html.simpleparser.HTMLWorker class. You could wrap it into a helper method such as:

private Paragraph CreateSimpleHtmlParagraph(String text) {
    //Our return object
    Paragraph p = new Paragraph();

    //ParseToList requires a StreamReader instead of just text
    using (StringReader sr = new StringReader(text)) {
        //Parse and get a collection of elements
        List<IElement> elements = iTextSharp.text.html.simpleparser.HTMLWorker.ParseToList(sr, null);
        foreach (IElement e in elements) {
            //Add those elements to the paragraph
            p.Add(e);
        }
    }
    //Return the paragraph
    return p;
}

Then instead of this:

document.Add(new Paragraph("this is <b>bold</b> text"));

You could use this:

document.Add(CreateSimpleHtmlParagraph("this is <b>bold</b> text"));
document.Add(CreateSimpleHtmlParagraph("this is <i>italic</i> text"));
document.Add(CreateSimpleHtmlParagraph("this is <b><i>bold and italic</i></b> text"));

Not sure how complex your Xml is, but try XMLWorker. Here's a working example with an ASP.NET HTTP handler:

<%@ WebHandler Language="C#" Class="boldText" %>
using System;
using System.IO;
using System.Web;
using iTextSharp.text;  
using iTextSharp.text.pdf;
using iTextSharp.text.xml;
using iTextSharp.tool.xml;

public class boldText : IHttpHandler {
  public void ProcessRequest (HttpContext context) {
    HttpResponse Response = context.Response;
    Response.ContentType = "application/pdf";  
    StringReader xmlSnippet = new StringReader(
      "<p>This is <b>bold</b> text</p>"
    );
    using (Document document = new Document()) {
      PdfWriter writer = PdfWriter.GetInstance(
        document, Response.OutputStream
      );
      document.Open();
      XMLWorkerHelper.GetInstance().ParseXHtml(
        writer, document, xmlSnippet
      );      
    }
  }
  public bool IsReusable { get { return false; } }
}

You may have to pre-process your Xml before sending it to XMLWorker. (notice the snippet is a bit different from yours) Support for parsing HTML/Xml was released relatively recently, so your mileage may vary.

I know that this is an old question, but I could not get the other examples here to work for me. But adding the text in Chucks with different fonts did.

//define a bold font to be used
Font boldFont = FontFactory.GetFont(FontFactory.HELVETICA_BOLD, 12);

//add a phrase and add Chucks to it
var phrase2 = new Phrase();
phrase2.Add(new Chunk("this is "));
phrase2.Add(new Chunk("bold", boldFont));
phrase2.Add(new Chunk(" text"));

document.Add(phrase2);

Here is another XMLWorker example that uses a different overload of ParseHtml and returns a Phrase instead of writing it directly to the document.

private static Phrase CreateSimpleHtmlParagraph(String text)
{
    var p = new Phrase();
    var mh = new MyElementHandler();
    using (TextReader sr = new StringReader("<html><body><p>" + text + "</p></body></html>"))
    {
        XMLWorkerHelper.GetInstance().ParseXHtml(mh, sr);
    }
    foreach (var element in mh.elements)
    {
        foreach (var chunk in element.Chunks)
        {
            p.Add(chunk);
        }
    }
    return p;
}

private class MyElementHandler : IElementHandler
{
    public List<IElement> elements = new List<IElement>();
    public void Add(IWritable w)
    {
        if (w is iTextSharp.tool.xml.pipeline.WritableElement)
        {
            elements.AddRange(((iTextSharp.tool.xml.pipeline.WritableElement)w).Elements());
        }
    }
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!