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 line1</li>"
+ "<li>Overview line2</li><li>Overview line3</li>"
+ "<li>Overview line4</li><li>Overview line5</li></ul>";
该列表中有 5 个列表项,当我们查看生成的 PDF 时,我们会看到全部 5 个:
当然,这很简单HTML,用作列表最后一项不会消失的概念证明。
以下是未显示所有项目的一些可能原因:
- 也许你在嵌套列表。表上下文不支持列表的深度嵌套。
- 标签中可能存在小错误。例如:也许您的列表项缺少
<li>
标签。
- 可能列表项中的内容比较特殊,XML 工作人员
没有选择这些内容
要获得明确的答案,我们需要查看 HTML。你能根据HtmlContentForCell2准备一个SSCCE吗?
更新:
您提供的HTML简单有效。我能够重现您的问题,因此我们遇到了一个错误。我将针对此问题提交错误报告。
请注意,我可以通过在最后的 </ul>
之后添加一些额外的内容来解决该问题:请参阅 HtmlContentForCell3 and the resulting PDF html_in_cell3.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 line1</li>"
+ "<li>Overview line2</li><li>Overview line3</li>"
+ "<li>Overview line4</li><li>Overview line5</li></ul>";
该列表中有 5 个列表项,当我们查看生成的 PDF 时,我们会看到全部 5 个:
当然,这很简单HTML,用作列表最后一项不会消失的概念证明。
以下是未显示所有项目的一些可能原因:
- 也许你在嵌套列表。表上下文不支持列表的深度嵌套。
- 标签中可能存在小错误。例如:也许您的列表项缺少
<li>
标签。 - 可能列表项中的内容比较特殊,XML 工作人员 没有选择这些内容
要获得明确的答案,我们需要查看 HTML。你能根据HtmlContentForCell2准备一个SSCCE吗?
更新:
您提供的HTML简单有效。我能够重现您的问题,因此我们遇到了一个错误。我将针对此问题提交错误报告。
请注意,我可以通过在最后的 </ul>
之后添加一些额外的内容来解决该问题:请参阅 HtmlContentForCell3 and the resulting PDF html_in_cell3.pdf。但是,这只是解决错误而不是修复错误的快速修复。该错误应该已修复。