如何将富文本框(HTML)添加到表格单元格?

时间:2014-11-19 11:24:02

标签: pdf itextsharp richtext

我有一个名为“DocumentContent”的富文本框,我将使用以下代码将其内容添加到pdf中:

iTextSharp.text.Font font = FontFactory.GetFont(@"C:\Windows\Fonts\arial.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED, 12f, Font.NORMAL, BaseColor.BLACK);
            DocumentContent = System.Web.HttpUtility.HtmlDecode(DocumentContent);
            Chunk chunkContent = new Chunk(DocumentContent);
            chunkContent.Font = font;            

            Phrase PhraseContent = new Phrase(chunkContent);
            PhraseContent.Font = font;


            PdfPTable table = new PdfPTable(2);
            table.WidthPercentage = 100;
            PdfPCell cell;

            cell = new PdfPCell(new Phrase(PhraseContent));
            cell.Border = Rectangle.NO_BORDER;
            table.AddCell(cell);

问题是当我打开PDF文件时,内容显示为HTML而不是下面的文字:

<p>Overview&#160; line1 </p><p>Overview&#160; line2
</p><p>Overview&#160; line3 </p><p>Overview&#160;
line4</p><p>Overview&#160; line4</p><p>Overview&#160;
line5&#160;</p>

但它应该如下所示

Overview line1
Overview line2
Overview line3
Overview line4
Overview line4
Overview line5

我要做的是保留用户应用于富文本的所有样式,只需将字体系列更改为Arial。

我可以更改字体系列,但我需要将此内容从HTML解码为文本。

你能告诉我吗? 感谢

2 个答案:

答案 0 :(得分:5)

请查看HtmlContentForCell示例。

在这个例子中,我们有你提到的HTML:

public static final String HTML = "<p>Overview&#160;line1</p>"
        + "<p>Overview&#160;line2</p><p>Overview&#160;line3</p>"
        + "<p>Overview&#160;line4</p><p>Overview&#160;line4</p>"
        + "<p>Overview&#160;line5&#160;</p>";

我们还为<p>标记创建了一种字体:

public static final String CSS = "p { font-family: Cardo; }";

在您的情况下,您可能希望将Cardo替换为Arial

请注意,我们注册了Cardo字体的常规版本:

FontFactory.register("resources/fonts/Cardo-Regular.ttf");

如果您需要粗体,斜体和粗体斜体,还需要注册相同Cardo系列的字体。 (如果是arial,你要注册arial.ttf,arialbd.ttf,ariali.ttf和arialbi.ttf)。

现在我们可以使用Element方法将此HTML和CSS解析为parseToElementList()个对象的列表。我们可以在单元格中使用这些对象:

PdfPTable table = new PdfPTable(2);
table.addCell("Some rich text:");
PdfPCell cell = new PdfPCell();
for (Element e : XMLWorkerHelper.parseToElementList(HTML, CSS)) {
    cell.addElement(e);
}
table.addCell(cell);
document.add(table);

有关生成的PDF,请参阅html_in_cell.pdf

我没有时间/技能在iTextSharp中提供此示例,但将其移植到C#应该非常容易。

答案 1 :(得分:4)

最后,我在c#中编写了这个代码,这个代码工作正常,感谢Bruno帮助我理解XMLWorker。

以下是在C#中使用XMLWorker的示例。

我使用了以下示例HTML:

public static string HTML = "<p>Overview&#160;line1âââŵẅẃŷûâàêÿýỳîïíìôöóòêëéèẁẃẅŵùúúüûàáäâ</p>"
            + "<p>Overview&#160;line2</p><p>Overview&#160;line3</p>"
            + "<p>Overview&#160;line4</p><p>Overview&#160;line4</p>"
            + "<p>Overview&#160;line5&#160;</p>";

我创建了Test.css文件并将其保存在SharePoint样式库中。 (对于这个测试,我将它保存在D驱动器中以保持简单) 这是我的测试css文件的内容:     p {font-family:arial; }

然后使用下面的c#代码我将PDF文件保存在D盘中。 (在SharePoint中我使用了Memorystream。我保持这个例子很容易理解)

string fileName = @"D:\Test.pdf";                     
var css = @"D:\Test.css";
using (var ActionStream = new MemoryStream(UTF8Encoding.UTF8.GetBytes(HTML)))
{
    using (FileStream cssFile = new FileStream(css, FileMode.Open))
    {
        var document = new Document(PageSize.A4, 30, 30, 10, 10);                    
        var worker = XMLWorkerHelper.GetInstance();
        var writer = PdfWriter.GetInstance(document, new FileStream(fileName, FileMode.Create));
        document.Open();
        worker.ParseXHtml(writer, document, ActionStream, cssFile);
        writer.CloseStream = false;
        document.Close();

    }
}

它创建了Test.pdf文件,使用Font Family:Arial添加我的HTML。因此,所有威尔士字符都可以保存为PDF文件。

注意:我已将iTextSharp.dll v:5.5.3和XMLworker.dll v:5.5.3添加到我的项目中。

using iTextSharp.text;
using iTextSharp.text.html;
using iTextSharp.text.pdf;
using iTextSharp.tool.xml;
using iTextSharp.tool.xml.css;
using iTextSharp.tool.xml.html;
using iTextSharp.tool.xml.parser;
using iTextSharp.tool.xml.pipeline;

希望这可能有用。

凯特