我正在使用itextsharp 5.3.2。我使用VS2010创建了一个自定义操作,以从SharePoint列表项生成pdf。字符串“value”来自增强型RTF多行文本字段。在大多数情况下,下面的方法非常适合创建带有html内容的PdfPCell,然后我可以将其添加到文档中的表中。我用这篇文章的答案来写我的方法:How to get ordered list into pdf using itext?
我遇到了一个带有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
感谢您的帮助。