【问题标题】:Bolding with Rich Text Values in iTextSharp在 iTextSharp 中使用富文本值加粗
【发布时间】:2011-11-29 18:28:09
【问题描述】:

是否可以使用 iTextSharp 将句子中的单个单词加粗?我正在处理来自 xml 的大段文本,我试图将几个单独的单词加粗,而不必将字符串分解成单独的短语。

例如:

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

应该输出...

这是粗体文字

【问题讨论】:

    标签: itextsharp


    【解决方案1】:

    正如@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"));
    

    【讨论】:

    • 这个解决方案解决了加粗文本的问题,但是,另一个问题出现了。我已将段落切换为短语,并尝试将字体应用于短语。输出的文本将更新为新的字体名称(Arial 窄),但字体大小不会改变。它默认为 12,我正在尝试将其设置为 10。任何想法可能有什么问题?
    • 我刚刚修复了我的字体大小问题。每个短语包含多个块:每个粗体/非粗体文本段一个块。我遍历了您的 IElement 'e' 中的块,并分别将字体大小分配给每个块。感谢您的帮助!
    【解决方案2】:

    我知道这是一个老问题,但我无法在这里找到其他示例来为我工作。但是在 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);
    

    【讨论】:

      【解决方案3】:

      不确定您的 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 之前,您可能需要对其进行预处理。 (注意 sn-p 和你的有点不同)对解析 HTML/Xml 的支持是最近发布的,所以你的里程可能会有所不同。

      【讨论】:

        【解决方案4】:

        这是另一个 XMLWorker 示例,它使用不同的 ParseHtml 重载并返回一个 Phrase 而不是直接将其写入文档。

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

        【讨论】:

          猜你喜欢
          • 2010-11-30
          • 1970-01-01
          • 2013-11-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-25
          • 2013-01-05
          • 1970-01-01
          相关资源
          最近更新 更多