使用 iText 5 时出现奇怪的显示问题

Weird Display issue using iText 5

我很确定我的问题最简单的答案是 "You need to update your version of iText." 但是,我的老板在从 iText 4 更新到 iText 5 后不愿意更新,正如他所说,"Broke so much crap." 所以我使用 iText 5.0.1 来构建这个 PDF。

我正在构建一个应用程序,它将读取 Excel 文件并为我们参加的活动创建徽章。它相当简单,一切都按预期工作,除了最终结果的样子。

我设置 PDF 的方式(代码将在下面显示)是每个徽章都印有正面和背面(我们双面打印),并且每个页面本身应该包含 6 个徽章。当我通过在每次销售中复制相同的徽章来测试它时,它看起来不错。但是当我使用一组数据时,无论出于何种原因,我的 PDF 都会被丢弃。它不是每页 6 个徽章,而是有时 每页打印 6 个,其他时候每页打印 3 个。例如,我的 excel 文件有 21 行数据 - 要创建 21 个徽章。我每页有 3 组 3 个徽章,每页有 2 组 6 个徽章,分别设置为 3、6、6、3,分别对应每页上的徽章数量。

我是否遗漏了 3 页,每页 6 个徽章,然后一页只有 3 个徽章?

    Document document = new Document(PageSize.LETTER, MARGIN, MARGIN, MARGIN, MARGIN);
    PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(filename));
    document.open();
    PdfContentByte cb = writer.getDirectContent();
    buildDocument(document, badgeFronts, badgeBacks);
    document.close();

    public void buildDocument(Document document, ArrayList<PdfPTable> badgeFronts, ArrayList<PdfPTable> badgeBacks) throws DocumentException{
        float[] frontTableWidths = {150f, 10f, 150f, 10f, 150f, 10f};
        float[] backTableWidths = {10f, 150f, 10f, 150f, 10f, 150f};
        PdfPTable frontTable = new PdfPTable(6);
        frontTable.setWidths(frontTableWidths);
        frontTable.setWidthPercentage(100);
        PdfPTable backTable = new PdfPTable(6);
        backTable.setWidths(backTableWidths);
        backTable.setWidthPercentage(100);
        int count = 0;
        for(int i = 0; i < badgeFronts.size(); i++){
            PdfPCell frontCell = new PdfPCell();
            frontCell.setFixedHeight(260f);
            frontCell.setBorderColor(BaseColor.GRAY);
            PdfPCell backCell = new PdfPCell();
            backCell.setFixedHeight(260f);
            backCell.setBorderColor(BaseColor.GRAY);
            if(count == 5){
                count = 0;
                document.add(frontTable);
                document.newPage();
                document.add(backTable);
                document.newPage();
                frontTable.deleteBodyRows();
                backTable.deleteBodyRows();
            }
            PdfPTable front = badgeFronts.get(i);
            PdfPTable back = badgeBacks.get(i);
            frontCell.addElement(front);
            backCell.addElement(back);

            frontTable.addCell(frontCell);
            frontTable.addCell("");

            backTable.addCell("");
            backTable.addCell(backCell);

            if(i == badgeFronts.size() - 1){
                document.add(frontTable);
                document.newPage();
                document.add(backTable);
                document.newPage();
            }
            count++;
        }
        frontTable.completeRow();
        backTable.completeRow();
    }

以上是我的代码。我在其他地方的主要 table 单元格中创建了表格,并且可以在需要时显示它,但我认为没有必要。

if(count == 5){
     count = 0;
     document.add(frontTable);
     document.newPage();
     document.add(backTable);
     document.newPage();
     frontTable.deleteBodyRows();
     backTable.deleteBodyRows();
}

这个代码块就是问题所在。对于初学者来说,现在还为时过早。它需要放在 之后 count++; 语句。其次,不是在移动块后检查 count == 5,而是检查 count == 6 达到了目的。此更改一发生,它就开始按预期正常工作。

这几乎意味着我不太擅长在转向 Stack Overflow 之前用尽所有选项...