【问题标题】:How to add a rich Textbox (HTML) to a table cell?如何将富文本框 (HTML) 添加到表格单元格?
【发布时间】:2014-11-19 11:24:01
【问题描述】:

我有一个名为:“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 解码为文本。

你能建议吗? 谢谢

【问题讨论】:

    标签: pdf itextsharp richtext


    【解决方案1】:

    请查看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>";
    

    我们还为&lt;p&gt; 标签创建了一个字体:

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

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

    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# 应该很容易。

    【讨论】:

    • 谢谢布鲁诺,这很有帮助。我感谢您的帮助。现在我正在尝试将其更改为 C#。
    • 好的,如果您可以在移植示例后添加我的代码的 C# 版本作为额外答案,那就太好了。
    【解决方案2】:

    最后我用 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 {字体系列: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 文件,添加我的 HTML 字体系列:Arial。所以所有的威尔士字符都可以保存在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;
    

    希望这能有用。

    凯特

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-23
      • 2022-10-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多