iText:为什么未排序的 html 项目符号列表的最后一项没有显示在我的 PDF 中?

iText: Why the last item of an unordered html bullet list is not showing on my PDF?

我正在遵循 itextpdf 示例 http://itextpdf.com/sandbox/htmlworker/HtmlContentForCell

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

我有以下代码:

// 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 中的一个单元格的屏幕截图:

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

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!!!!

请看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,用作列表最后一项不会消失的概念证明。

以下是未显示所有项目的一些可能原因:

  • 也许你在嵌套列表。表上下文不支持列表的深度嵌套。
  • 标签中可能存在小错误。例如:也许您的列表项缺少 <li> 标签。
  • 可能列表项中的内容比较特殊,XML 工作人员
  • 没有选择这些内容

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

更新:

您提供的HTML简单有效。我能够重现您的问题,因此我们遇到了一个错误。我将针对此问题提交错误报告。

请注意,我可以通过在最后的 </ul> 之后添加一些额外的内容来解决该问题:请参阅 HtmlContentForCell3 and the resulting PDF html_in_cell3.pdf。但是,这只是解决错误而不是修复错误的快速修复。该错误应该已修复。