最后一行未在 itext 2.1.7 pdf 的表格中创建

问题描述 投票:0回答:3

你好吗,

我正在用 itext 设计一个 pdf,但我无法填写整个项目表,因为我总是在最后漏掉一个项目。

似乎最后一项没有添加下一行任何想法?

这是我对该项目的原始应用程序,在 CAPEC 部分,我想在单元格中使用 itext

介绍它的所有内容

CVE-2010-3972 当我将其直接添加到文档类型对象时,所有内容都会出现,但是当我想在表中执行此操作时,不会添加最后一项

这是我的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,表格中缺少此

客户端注入导致缓冲区溢出

capecPDF

java itext
3个回答
1
投票

我发布这个答案是因为我认为它可能会对将来的某人有所帮助。

我今天遇到了同样的问题,并得到了一个非常好的解决方案。

只需使用

pdfTable.completeRow();
告诉 itext 库为不完整的行添加空单元格。

谢谢..!!


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 不绘制不完整的行,只需在循环后添加一个空单元格即可。)


顺便说一句,如果可能的话你真的应该更新。


0
投票

除了@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)
}
© www.soinside.com 2019 - 2024. All rights reserved.