【问题标题】:c# iTextsharp generated PDF with xmlworker is breaking Listsc# iTextsharp 使用 xmlworker 生成的 PDF 正在破坏列表
【发布时间】:2018-05-29 13:33:35
【问题描述】:

我正在使用带有 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>

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

但是一旦 List 包含在任何级别的 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>
我能做些什么来处理这个问题吗?为什么 Div 会影响列表的格式。

仅供参考,这是我正在使用的 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();


            }

        }

【问题讨论】:

  • 你能用 iText 7.1.0 + pdfHTML 2.0.0 重现这个吗?
  • 不,最新版本无法复制。我将投票关闭这个问题作为题外话,表明这是一个无法再重现的问题。升级应该可以解决问题。

标签: itext xmlworker


【解决方案1】:

首先:您对&lt;span&gt; 的使用很尴尬。根据w3schools&lt;span&gt;标签定义和使用如下:

&lt;span&gt; 标签用于对文档中的内联元素进行分组。

&lt;span&gt; 标签本身不提供视觉变化。

&lt;span&gt; 标签提供了一种向文本的一部分或文档的一部分添加挂钩的方法。

当我查看你得到的结果时,我看到列表被“扁平化”为一个 inline 元素,而不是保留你想要的 block 元素是。不过,我理解您为什么会认为这是一个错误,因为浏览器会接受编写不当的 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 版本(维护版本)中的错误,以及upgrade to iText 7 and pdfHTML!正如introduction of the HTML to PDF tutorial 中所解释的那样,它将使您免于很多挫败感。它还可以让我免于很多挫折,因为在过去的几周里,我每天都会重复多次同样的信息。

【讨论】:

    猜你喜欢
    • 2011-09-16
    • 2014-07-30
    • 1970-01-01
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    相关资源
    最近更新 更多