Bolding with Rich Text Values in iTextSharp

2019-01-19 23:39发布

问题:

Is it possible to bold a single word within a sentence with iTextSharp? I'm working with large paragraphs of text coming from xml, and I am trying to bold several individual words without having to break the string into individual phrases.

Eg:

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

should output...

this is bold text

回答1:

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"));


回答2:

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.



回答3:

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);



回答4:

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());
        }
    }
}


标签: itextsharp