【发布时间】:2011-11-29 18:28:09
【问题描述】:
是否可以使用 iTextSharp 将句子中的单个单词加粗?我正在处理来自 xml 的大段文本,我试图将几个单独的单词加粗,而不必将字符串分解成单独的短语。
例如:
document.Add(new Paragraph("this is <b>bold</b> text"));
应该输出...
这是粗体文字
【问题讨论】:
标签: itextsharp
是否可以使用 iTextSharp 将句子中的单个单词加粗?我正在处理来自 xml 的大段文本,我试图将几个单独的单词加粗,而不必将字符串分解成单独的短语。
例如:
document.Add(new Paragraph("this is <b>bold</b> text"));
应该输出...
这是粗体文字
【问题讨论】:
标签: itextsharp
正如@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"));
【讨论】:
我知道这是一个老问题,但我无法在这里找到其他示例来为我工作。但是在 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);
【讨论】:
不确定您的 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 的支持是最近发布的,所以你的里程可能会有所不同。
【讨论】:
这是另一个 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());
}
}
}
【讨论】: