【问题标题】:iText: Why the last item of an unordered html bullet list is not showing on my PDF?iText:为什么我的 PDF 上没有显示无序 html 项目符号列表的最后一项?
【发布时间】:2015-06-06 01:53:11
【问题描述】:

我正在关注itextpdf 示例http://itextpdf.com/sandbox/htmlworker/HtmlContentForCell

我遇到了一个问题,每当我解析为元素并填充pdfCell 的 html 内容中有 bulletlist 时,除了最后一项丢失外,其他所有内容都显示正常.是什么原因造成的?

我有以下代码:

// Relevant code from main part of the class:

   ByteArrayOutputStream baos = new ByteArrayOutputStream();
   Document document = new Document(PageSize.A4, 40, 40, 40, 40);
   PdfWriter writer = PdfWriter.getInstance(document, baos);
   document.open();
   document.add(buildContent());
   document.close();

// method that should provide content to the document.

public PdfPTable buildContent() throws IOException {
    InfoList infoList = infoListInstance.get();
    PdfPTable table = new PdfPTable(2);
    for (InfoListMessage message
            : infolistList.getMessages()) {
        renderMessageMetadata(message, table);
        renderMessageContent(message, table);
    }
    return table;
}

// method where the problem occurs and exception is thrown in the for-loop line

public void renderMessageContent(
        InfoListMessage message,
        PdfPTable table) throws IOException {

PdfPCell cell = new PdfPCell();

for (Element e : XMLWorkerHelper.parseToElementList(message.getContent(), null)) {
    cell.addElement(e);
}  
    table.addCell(cell);
}

我很确定它与 html 标签有关,但是当谈到 html 标签的复杂性时,我通常会迷失方向。这是我的代码的示例 HTML。这就是我作为 HTML 提供给 XMLWorkerHelper.parseToElementList 的内容:

<html>
 <head></head>
 <body>
  <span>Lisätty liitteet</span> 
  <ul> 
   <li>document2.txt.txt (23 B)</li> 
   <li>document1.txt.txt (12 B)</li> 
   <li>document3.txt.txt (27 B)</li> 
  </ul>
 </body>
</html>

这是应用程序创建的 pdf 中的一个单元格的屏幕截图:

【问题讨论】:

  • 有很多行? for-each 循环不保留排序...您是否进行了计数以检查元素是否丢失或放错位置???
  • @JordiCastilla 是的,这里的顺序甚至都不重要。该元素未显示在 pdf 中。即使它在循环中的那个列表中。

标签: java html parsing pdf itext


【解决方案1】:

请查看HtmlContentForCell2。它与您引用的示例几乎相似,但 HTML 由无序列表组成,而不是段落:

public static final String HTML = "<ul><li>Overview&#160;line1</li>"
        + "<li>Overview&#160;line2</li><li>Overview&#160;line3</li>"
        + "<li>Overview&#160;line4</li><li>Overview&#160;line5</li></ul>";

该列表中有 5 个列表项,当我们查看生成的 PDF 时,我们会看到全部 5 个:

当然,这是非常简单的 HTML,用作列表的最后一项不会消失的概念证明。

以下是不是所有项目都出现的一些可能原因:

  • 也许您正在嵌套列表。在表的上下文中不支持列表的深层嵌套。
  • 标签中可能有一个小错误。例如:您的列表项可能缺少 &lt;li&gt; 标记。
  • 可能列表项中的某些内容是特殊的并且 XML Worker 没有拾取该内容

要获得明确的答案,我们需要查看 HTML。你能根据HtmlContentForCell2准备一个SSCCE吗?

更新:

您提供的 HTML 简单有效。我能够重现您的问题,因此我们面临一个错误。我会为此问题提交错误报告。

请注意,我可以通过在最终的 &lt;/ul&gt; 之后添加一些额外内容来解决此问题:请参阅 HtmlContentForCell3 和生成的 PDF html_in_cell3.pdf。但是,这只是一个快速修复,可以解决错误而不是修复它。该错误应该已修复。

【讨论】:

  • 感谢您的详尽回答!为了可能节省大家的时间,首先我只是将 html 添加到问题和屏幕截图中。如果这已经足以指出问题。我真的很讨厌 html,所以很有可能......
  • 我能够重现该问题。我会把它作为一个错误归档。注意:如果我在最后的&lt;/ul&gt; 之后添加额外的内容,即使只是&amp;nbsp;,问题就消失了。请参阅itextpdf.com/sandbox/xmlworker/HtmlContentForCell3 不过,这不是一个好的解决方案。该错误需要修复。
  • 再次感谢您。你是最好的。即时回复、帮助、错误归档、解决方法。哇。
【解决方案2】:

如果您从请求中获取所有元素,但看不到表中插入的最后一个元素,是因为 table(2) 的最后一行没有所需的所有元素(在您的情况下,表每行需要 2 个元素),请使用 @987654321 @ 将最后一行标记为已完成在返回之前...

public void renderMessageContent 方法中,如果XMLWorkerHelper.parseToElementList( 有奇数个元素,你将看不到最后一个:

for (Element e : XMLWorkerHelper.parseToElementList(message.getContent(), null))
    cell.addElement(e);

table.addCell(cell);   // here you only add one cell to a 2 column table!!!!

【讨论】:

  • 我会假设第一列中的单元格是在renderMessageMetadata() 方法中添加的。
  • 是的,这是真的。第一列被添加到 renderMessageMetadata() 中。也许我应该在问题的代码中证明这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-07
  • 2015-07-10
  • 2020-04-25
  • 2021-05-18
相关资源
最近更新 更多