你好吗,
我正在用 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,表格中缺少此
客户端注入导致缓冲区溢出
我发布这个答案是因为我认为它可能会对将来的某人有所帮助。
我今天遇到了同样的问题,并得到了一个非常好的解决方案。
只需使用
pdfTable.completeRow();
告诉 itext 库为不完整的行添加空单元格。
谢谢..!!
您的问题文本让我们假设集合
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 不绘制不完整的行,只需在循环后添加一个空单元格即可。)
顺便说一句,如果可能的话你真的应该更新。
除了@Alien的答案之外,您还可以使用
while (!pdfTable.isComplete())
并添加具有您喜欢的样式的新单元格。
我正在使用无边框单元格,但是
pdfTable.completeRow();
添加了有边框单元格,所以我改为做类似thia的事情
while (!pdfTable.isComplete()) {
PdfPCell cell = new PdfPCell();
// Add preferred styling here
cell.setBorder(Rectangle.NO_BORDER);
pdfTable.add(cell)
}