2

我正在使用 itextsharp 5.3.2。我使用 VS2010 创建了一个自定义操作,以从 SharePoint 列表项生成 pdf。字符串“value”来自增强型富文本多行文本字段。在大多数情况下,下面的方法非常适合使用 html 内容创建 PdfPCell,然后我可以将其添加到文档中的表格中。我使用这篇文章的答案来最初编写我的方法:如何使用 itext 将有序列表转换为 pdf?

我在有序或无序的 html 列表中遇到了一个奇怪的问题。似乎如果列表深度为 3+ 级并且每个级别有多个项目,则 html 列表将在第一个 1 级项目之后解析失败。但是,有序列表之后的任何内容都会被正确处理并添加到 pdf 中。

我已经将我的方法的内容包装在一个 try-catch 中,但没有捕获到异常。

这是我增强的富文本字段的 HTML 源代码:

<div class="ExternalClassAF9636A4B56F497BB4B962AE682E5CA1"><ol><li>test item level 1</li>
<ol><li>test subitem level 1.1</li>
<ol><li>test subitem level 1.1.1</li>
<li>test subitem level 1.1.2</li>
<li>test subitem level 1.1.3</li></ol>
<li>test subitem level 1.2 <ol><li>test subitem level 1.2.1</li>
<li>test subitem level 1.2.2</li>
<li>test subitem level 1.2.3</li></ol></li>
<li>test subitem level 1.3 <ol><li>test subitem level 1.3.1</li>
<li>test subitem level 1.3.2</li>
<li>test subitem level 1.3.3</li></ol></li></ol>
<li>test item level 2 <ol><li>test subitem level 2.1<ol><li>test subitem level 2.1.1</li>
<li>test subitem level 2.1.2</li>
<li>test subitem level 2.1.3</li></ol></li>
<li>test subitem level 2.2<ol><li>test subitem level 2.2.1</li>
<li>test subitem level 2.2.2</li>
<li>test subitem level 2.2.3</li></ol></li>
<li>test subitem level 2.3<ol><li>test subitem level 2.3.1</li>
<li>test subitem level 2.3.2</li>
<li>test subitem level 2.3.3</li></ol></li></ol></li>
<li>test item level 3 <ol><li>test subitem level 3.1<ol><li>test subitem level 3.1.1</li>
<li>test subitem level 3.1.2</li>
<li>test subitem level 3.1.3</li></ol></li>
<li>test subitem level 3.2<ol><li>test subitem level 3.2.1</li>
<li>test subitem level 3.2.2</li>
<li>test subitem level 3.2.3</li></ol></li>
<li>test subitem level 3.3<ol><li>test subitem level 3.3.1</li>
<li>test subitem level 3.3.2</li>
<li>test subitem level 3.3.3</li></ol></li></ol></li></ol></div>
<p>Some more content after the ordered list.</p>

这是我将值传递到返回 PdfPCell 的方法:

const float INDENT = 25f;
...

private static PdfPCell createHtmlCell(string value)
{
    PdfPCell cell = new PdfPCell();  
    cell.BorderWidth = 0f;  
    cell.PaddingLeft = 10f;  

    StyleSheet styles = new StyleSheet();
    styles.LoadTagStyle(HtmlTags.UL, HtmlTags.INDENT, INDENT.ToString());  
    styles.LoadTagStyle(HtmlTags.OL, HtmlTags.INDENT, INDENT.ToString());  
    styles.LoadTagStyle(HtmlTags.LI, HtmlTags.INDENT, INDENT.ToString());  

    using (StringReader sr = new StringReader(value))
    {
        List<IElement> html = HTMLWorker.ParseToList(sr, styles);
        foreach (IElement e in html)
        {
            foreach (Chunk c in e.Chunks)
                c.Font.Size = 11f;

            if (e is Paragraph)
            {
                Paragraph p = (Paragraph)e;
                p.FirstLineIndent = INDENT / 2;
                p.SpacingAfter = 5f;
            }

            cell.AddElement(e);
        }
    }

    return cell;
}

这是我的 pdf 结果:http ://screencast.com/t/9OfqZ2c3Vv

谢谢您的帮助。

4

0 回答 0