List itextsharp无法完全解析HTML有序列表

List itextsharp无法完全解析HTML有序列表,list,pdf-generation,itextsharp,List,Pdf Generation,Itextsharp,我正在使用itextsharp 5.3.2。我使用VS2010创建了一个自定义操作,以从SharePoint列表项生成pdf。字符串“value”来自增强的富文本多行文本字段。在大多数情况下,下面的方法非常适合使用html内容创建PdfPCell,然后我可以将其添加到文档中的表中。我用这篇文章的答案最初写下了我的方法: 我遇到了一个奇怪的问题,html列表是有序的还是无序的。如果列表的深度超过3级,并且在每一级都有多个项,那么html列表在第一级1项之后将无法解析。但是,在正确处理有序列表并将其

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

我遇到了一个奇怪的问题,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>
  • 测试项目1级
  • 测试子项1.1级
  • 测试子项级别1.1.1
  • 测试子项级别1.1.2
  • 测试子项级别1.1.3
  • 测试子项1.2级
  • 测试子项1.2.1级
  • 测试子项级别1.2.2
  • 测试子项级别1.2.3
  • 测试子项1.3级
  • 测试子项1.3.1级
  • 测试子项级别1.3.2
  • 测试子项级别1.3.3
  • 测试项目2级
  • 测试子项目2.1级
  • 测试子项目2.1.1级
  • 测试子项2.1.2级
  • 测试子项2.1.3级
  • 测试子项2.2级
  • 测试子项2.2.1级
  • 测试子项级别2.2.2
  • 测试子项2.2.3级
  • 测试子项2.3级
  • 测试子项2.3.1级
  • 测试子项2.3.2级
  • 测试子项2.3.3级
  • 测试项目3级
  • 测试子项目3.1级
  • 测试子项目3.1.1级
  • 测试子项级别3.1.2
  • 测试子项级别3.1.3
  • 测试子项3.2级
  • 测试子项3.2.1级
  • 测试子项级别3.2.2
  • 测试子项级别3.2.3
  • 测试子项3.3级
  • 测试子项3.3.1级
  • 测试子项级别3.3.2
  • 测试子项级别3.3.3
  • 在有序列表之后还有一些内容

    以下是我将值传递到的方法,以返回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;
    }
    
    const float INDENT=25f;
    ...
    私有静态PdfPCell createHtmlCell(字符串值)
    {
    PdfPCell cell=新的PdfPCell();
    cell.BorderWidth=0f;
    cell.PaddingLeft=10f;
    样式表样式=新样式表();
    styles.LoadTagStyle(HtmlTags.UL,HtmlTags.INDENT,INDENT.ToString());
    LoadTagStyle(HtmlTags.OL,HtmlTags.INDENT,INDENT.ToString());
    LoadTagStyle(HtmlTags.LI,HtmlTags.INDENT,INDENT.ToString());
    使用(StringReader sr=新StringReader(值))
    {
    List html=HTMLWorker.parsetList(sr,样式);
    foreach(用html表示的IELENT e)
    {
    foreach(块c在块e中)
    c、 字体大小=11f;
    如果(e)段为
    {
    第p段=(e)段;
    p、 FirstLineIndent=INDENT/2;
    p、 间隔时间=5f;
    }
    单元。附加元素(e);
    }
    }
    返回单元;
    }
    
    以下是我的pdf结果:


    谢谢您的帮助。

    我建议您首先清理HTML。您的1.1 OL在父LI关闭后开始,而不是之前。这可能会弄乱iTextSharp的HTML解析器。谢谢Chris。我也曾怀疑过。不幸的是,这是SharePoint生成的HTML。所以我的问题可能不是“为什么itextsharp失败了?”而是“为什么Microsoft SharePoint给了我格式不正确的HTML?”我现在手头没有IDE,但是你能先尝试用itextsharp解析有效的HTML,看看这是否如预期的那样有效吗?如果仍然不起作用,可以在这里更新你的帖子。如果有效代码有效,那么我将关闭此线程并作为特定的SharePoint问题重新发布。不幸的是,我对SharePoint了解不多,无法帮助您解决Hello thewire,我对嵌套
    • 也有同样的问题。在嵌套视图中打印不正确。它仅将所有标记打印为父级。你找到解决办法了吗?请帮帮我。谢谢