Выделение жирными шрифтами значений в iTextSharp - PullRequest
4 голосов
/ 29 ноября 2011

Можно ли выделить слово в предложении с помощью iTextSharp? Я работаю с большими абзацами текста из xml и пытаюсь выделить несколько отдельных слов, не разбивая строку на отдельные фразы.

Например:

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

должен вывести ...

это полужирный текст

Ответы [ 4 ]

6 голосов
/ 30 ноября 2011

Как отметил @kuujinbo, существует объект XMLWorker, в котором выполняется большая часть новой работы по разбору HTML. Но если у вас есть простые команды, такие как полужирный или курсив, вы можете использовать собственный класс iTextSharp.text.html.simpleparser.HTMLWorker. Вы могли бы обернуть это во вспомогательный метод, такой как:

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

Тогда вместо этого:

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

Вы можете использовать это:

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 голосов
/ 17 июля 2014

Я знаю, что это старый вопрос, но я не мог заставить другие примеры здесь работать на меня. Но добавление текста в Chucks с разными шрифтами не помогло.

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

enter image description here

2 голосов
/ 30 ноября 2011

Не уверен, насколько сложен ваш Xml, но попробуйте XMLWorker .Вот рабочий пример с обработчиком ASP.NET HTTP:

<%@ 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; } }
}

Возможно, вам придется предварительно обработать ваш Xml перед отправкой в ​​XMLWorker.(обратите внимание, что фрагмент немного отличается от вашего) Поддержка парсинга HTML / Xml была выпущена сравнительно недавно, поэтому ваш пробег может отличаться.

0 голосов
/ 07 июня 2015

Вот еще один пример XMLWorker, который использует другую перегрузку ParseHtml и возвращает фразу вместо записи ее непосредственно в документ.

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