c#iTextsharp使用xmlworker生成的PDF正在打破列表

时间:2017-12-15 10:44:47

标签: itext xmlworker

我正在使用带有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;
&#13;
&#13;

并且pdf看起来正确如下图所示。

enter image description here

但是格式化问题一旦列在任何级别的Div中就会开始。 pdf中的列表变为内联。

enter image description here

&#13;
&#13;
<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;
&#13;
&#13; 有什么办法可以解决这个问题吗?为什么Div会影响列表的形成。

仅供参考,这是我正在使用的CreatePDF方法。

&#13;
&#13;
  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;
&#13;
&#13;

1 个答案:

答案 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。

这是我得到的结果:

w3schools

所以请停止抱怨旧的iText版本({em>维护版本)和enter image description here中的错误!正如upgrade to iText 7 and pdfHTML中所解释的那样,它可以帮助您避免许多挫败感。它也会让我免于很多挫折,因为我在过去几周内每天都会重复这几条同样的信息。