使用itext 2.1.7 pdf的表中的错误,未创建最后一行

时间:2017-03-07 13:08:39

标签: java itext

你好吗,

我正在设计一个带有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

2 个答案:

答案 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库为不完整的行添加空单元格即可。

谢谢.. !!