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

Java iText:为什么无序html项目符号列表的最后一项没有显示在我的PDF上?,java,html,parsing,pdf,itext,Java,Html,Parsing,Pdf,Itext,下面是itextpdf示例 我面临一个问题,每当我将html内容解析为元素并填充pdfCell时,除了最后一项缺失外,其他所有内容都显示良好。是什么原因造成的 我有以下代码: // Relevant code from main part of the class: ByteArrayOutputStream baos = new ByteArrayOutputStream(); Document document = new Document(PageSize.A4, 40, 4

下面是
itextpdf
示例

我面临一个问题,每当我将html内容解析为元素并填充
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>

利塞蒂·利泰特
  • document2.txt.txt(23 B)
  • document1.txt.txt(12 B)
  • document3.txt.txt(27 B)
下面是应用程序创建的pdf中一个单元格的屏幕截图:

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

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!!!!
请看一下。它几乎与您提到的示例相似,但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>";
public static final String HTML=“
  • 概述 ;行1
  • ” +“
  • 概述和第2行
  • 概述和第3行” +“
  • 概述和第4行
  • 概述和第5行
”;
该列表中有5个列表项,当我们查看生成的PDF时,我们会看到所有5个:

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

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

  • 可能您正在嵌套列表。在表的上下文中不支持列表的深度嵌套
  • 标记中可能有一个小错误。例如:您的列表项可能缺少
  • 标记
  • 也许列表项中有一些内容是特殊的,而XML Worker无法获取这些内容
为了得到一个明确的答案,我们需要查看HTML。你能准备一个基于HTML的文档吗

更新:

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


请注意,我可以通过在最终的
之后添加一些额外的内容来解决这个问题:请参阅和生成的PDF。但是,这只是一个快速修复,可以解决问题,而不是修复问题。错误应该得到修复。

有许多行?
对于每个
循环都不会保留排序…您是否进行了修改计数以检查元素是否丢失或放错了位置???@JordiCastilla是的,这里的顺序甚至不重要。元素没有显示在pdf中。即使它在循环的列表中。我假设第一列中的单元格添加到
renderMessageMetadata()中
method。是的,没错。第一列添加到renderMessageMetadata()中.也许我应该在问题中的代码中说明这一点。谢谢你的详细回答!为了可能节省大家的时间,首先我只是在问题中添加了html和一个屏幕截图。如果这已经足以指出问题的话。我对html真的很糟糕,所以很有可能…我能够重现问题问题。我会将其作为错误进行归档。注意:如果我在最终的
之后添加额外内容,即使只是
,问题也会消失。请看,这不是一个好的解决方案。错误需要修复。再次感谢你。你是最好的。即时回复,帮助,错误归档,解决方法。哇。