我正在使用带有XmlWorker版本5.5.12.0的iTextsharp库,并且使用DIV附带了列表问题。
<body>
<span>
<ul>
<ul>
<li>Project Management
<ul>
<li>
<a class="jwiki-small" data-containerid="2544" data-containertype="14" data-objectid="14695" data-objecttype="102" href="https://SampleUrl.com/DOC-146">Sample Text</a>
</li>
</ul>
</li>
</ul>
</ul>
</span>
</body>
&#13;
并且pdf看起来正确如下图所示。
但是格式化问题一旦列在任何级别的Div中就会开始。 pdf中的列表变为内联。
<body>
<div>
<span>
<ul>
<ul>
<li>Project Management
<ul>
<li>
<a class="jwiki-small" data-containerid="2544" data-containertype="14" data-objectid="14695" data-objecttype="102" href="https://SampleUrl.com/DOC-146">Sample Text</a>
</li>
</ul>
</li>
</ul>
</ul>
</span>
</div>
</body>
&#13;
仅供参考,这是我正在使用的CreatePDF方法。
private void CreatePDF(string html)
{
var document = new Document(iTextSharp.text.PageSize.A4,20,20,20,20);
var memoryStream = new MemoryStream();
using (var pdfWriter = PdfWriter.GetInstance(document, memoryStream))
{
document.Open();
var htmlContext = new HtmlPipelineContext(null);
htmlContext.SetTagFactory(Tags.GetHtmlTagProcessorFactory());
htmlContext.SetImageProvider(new CustomItextImageProvider());
htmlContext.CharSet(Encoding.UTF8);
var cssResolver = XMLWorkerHelper.GetInstance().GetDefaultCssResolver(true);
var pipeline = new CssResolverPipeline(cssResolver, new HtmlPipeline(htmlContext, new PdfWriterPipeline(document, pdfWriter)));
var xmlWorker = new XMLWorker(pipeline, true);
var xmlParser = new XMLParser(true,xmlWorker);
StringReader rdr = new StringReader((html));
xmlParser.Parse(rdr);
pdfWriter.CloseStream = false;
document.AddCreator("iTextSharp");
document.AddAuthor("ThreeWill");
document.Close();
string fileName = @"c:\temp\" + "test" + DateTime.Now.ToString("yyyy-mm-dd hh.mm.ss") + ".pdf";
var outputFileStream = new FileStream(fileName, FileMode.Create, FileAccess.Write);
memoryStream.Position = 0;
memoryStream.WriteTo(outputFileStream);
outputFileStream.Close();
}
}
&#13;
答案 0 :(得分:2)
首先:你对<span>
的使用很尴尬。根据{{3}},<span>
标记的定义和使用方式如下:
<span>
标记用于对文档中的内联元素进行分组。
<span>
标记本身不会发生任何视觉变化。
<span>
标记提供了一种向文本的一部分或文档的一部分添加钩子的方法。
当我查看您得到的结果时,我看到列表被“展平”为内联元素,而不是保留您希望它的块元素是。但是,我理解为什么你会认为这是一个错误,因为浏览器接受写得不好的HTML并按预期呈现它而不是它可能应该的。
如何解决您的问题?
您正在使用正在淘汰的iText版本的维护版本。维护版本意味着不是iText客户的公司不再支持此版本。只解决了一些小错误。已知问题,例如您现在遇到的问题将无法在iText 5中修复!
为什么我们不在iText 5中解决这个问题? 因为这已在iText 7.1中修复
我编写了以下代码示例:
FileStream fs = new FileStream("list.pdf", FileMode.Create);
HtmlConverter.ConvertToPdf(htmlString, fs, props);
htmlString
包含您问题中的HTML。
这是我得到的结果:
所以请停止抱怨旧的iText版本({em>维护版本)和中的错误!正如upgrade to iText 7 and pdfHTML中所解释的那样,它可以帮助您避免许多挫败感。它也会让我免于很多挫折,因为我在过去几周内每天都会重复这几条同样的信息。