你好吗,
我正在设计一个带有itext的pdf,但我无法填写整个项目表,因为我总是错过一个。
似乎最后一项没有添加下一行的任何想法?
这是我在CAPEC部分中的项目的原始应用程序,我希望在 itext
的单元格中引入它当我将它直接添加到文档类型对象时,一切都会出现,但是当我想在表中执行它时,不添加最后一项
这是我在java中的代码
private void capecReferences() throws DocumentException, IOException {
PdfPTable tableCapec = new PdfPTable(2);
tableCapec.setHeaderRows(0);
tableCapec.setWidthPercentage(100);
tableCapec.setTotalWidth(100);
// Add headers
tableCapec.addCell(createHeaderCellWithColor("CAPEC & References"));
document.add(tableCapec);
/*
* CAPEC
*/
if (cve.getCapec().size() > 0) {
Paragraph capec = new Paragraph(new Chunk("\nCAPEC", captionFont));
PdfPTable table = new PdfPTable(2);
table.setHeaderRows(1);
table.setWidthPercentage(100);
table.setTotalWidth(100);
Paragraph capecs = new Paragraph(new Chunk("",normalFont));
for (Capec capecTmp : cve.getCapec()) {
table.addCell(createCell(capecTmp.getName()));
//capecs.add("\n"+capecTmp.getName());
//document.add(table);
}
document.add(capec);
//document.add(capecs);
document.add(table);
document.add(Chunk.NEWLINE);
}
/*
* REFERENCES
*/
if (cve.getReferences().size() > 0) {
Paragraph references = new Paragraph(new Chunk("\nREFERENCES", captionFont));
Paragraph r = new Paragraph();
Anchor link;
for (String reference : cve.getReferences()) {
link = new Anchor(reference);
link.setReference(reference);
r.add(link);
}
document.add(references);
document.add(r);
document.add(Chunk.NEWLINE);
}
/*
* SCPI
*/
if (cve.getMapCveScip() != null) {
Paragraph scpi = new Paragraph(new Chunk("\nSCPI", captionFont));
Paragraph scpiID = new Paragraph(new Chunk("SCIP ID: ", normalFont));
Paragraph scpiLink = new Paragraph(new Chunk("SCIP Link: ", normalFont));
Anchor link2;
scpiID.add(cve.getMapCveScip().getScipid());
link2 = new Anchor(cve.getMapCveScip().getSciplink());
link2.setReference(cve.getMapCveScip().getSciplink());
scpiLink.add(link2);
document.add(scpi);
document.add(scpiID);
document.add(scpiLink);
document.add(Chunk.NEWLINE);
}
/*
* Nessus
*/
if (cve.getMapCveNessus() != null) {
Paragraph nessus = new Paragraph(new Chunk("Nessus ",captionFont));
document.add(nessus);
Paragraph nessusScriptId = new Paragraph("Nessus Script Id: ", normalFont);
nessusScriptId.add(new Chunk(cve.getMapCveNessus().getNessusScriptId()));
document.add(nessusScriptId);
Paragraph nessusScriptName = new Paragraph("Nessus Script Name: ", normalFont);
nessusScriptName.add(new Chunk(cve.getMapCveNessus().getNessusScriptName()));
document.add(nessusScriptName);
Paragraph nessusScriptFile = new Paragraph("Nessus Script File: ", normalFont);
nessusScriptFile.add(new Chunk(cve.getMapCveNessus().getNessusScriptFile()));
document.add(nessusScriptFile);
Paragraph nessusScriptFamily = new Paragraph("Nessus Script Family: ", normalFont);
nessusScriptFamily.add(new Chunk(cve.getMapCveNessus().getNessusScriptFamily()));
document.add(nessusScriptFamily);
document.add(Chunk.NEWLINE);
}
}
这是创建的pdf,表格中缺少这个
客户端注入引起的缓冲区溢出
答案 0 :(得分:0)
您的问题文本让我们假设集合cve.getCapec()
包含问题顶部屏幕截图中的11个值,包括 客户端注入引起的缓冲区溢出 ;在这个循环中,您将它们添加到两列表:
/*
* CAPEC
*/
if (cve.getCapec().size() > 0) {
Paragraph capec = new Paragraph(new Chunk("\nCAPEC", captionFont));
PdfPTable table = new PdfPTable(2);
table.setHeaderRows(1);
table.setWidthPercentage(100);
table.setTotalWidth(100);
Paragraph capecs = new Paragraph(new Chunk("",normalFont));
for (Capec capecTmp : cve.getCapec()) {
table.addCell(createCell(capecTmp.getName()));
//capecs.add("\n"+capecTmp.getName());
//document.add(table);
}
document.add(capec);
//document.add(capecs);
document.add(table);
document.add(Chunk.NEWLINE);
}
由于集合中有11个条目,这意味着表格的最后一行只添加一个单元格。因此,该行不完整,不会被绘制。
您应该跟踪您添加的条目数是否均匀(例如通过计数或切换布尔值);如果它不均匀,你最后应该添加另一个空单元格。
(或者如果你想依靠iText不绘制不完整的行,只需在循环后添加一个空单元格。)
顺便说一下,如果可能的话,你应该真的更新。
答案 1 :(得分:0)
我发布此答案是因为我认为它可能会在将来对某人有所帮助。
我今天也遇到了同样的问题,并且为这个问题找到了一个非常好的解决方案。
只需使用pdfTable.completeRow();
告诉itext库为不完整的行添加空单元格即可。
谢谢.. !!