You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

从iText 5迁移至iText 7:如何实现表格分页并每页前置指定文本?

iText 7 迁移:实现带前置文本的表格分页

我刚好做过类似的iText 5到7的迁移,这个分页加前置文本的需求其实可以沿用你原来的思路实现,只是API有调整,我给你拆解一下:

关键API替代

先解决你找不到的两个核心方法:

  • pdfWriter.getVerticalPosition(true):在iText 7里,你需要通过文档渲染器获取当前内容的位置,对应代码是:
    float currentY = document.getRenderer().getCurrentArea().getBBox().getTop();
    
    这个值代表当前内容已经写到页面的哪个Y坐标,也就是剩余可用空间的起始点。
  • document.bottomMargin():这个在iText 7里有直接对应的规范方法:
    float bottomMargin = document.getBottomMargin();
    

重构后的核心逻辑

和你原来的思路一致:循环添加前置文本→检查剩余空间→添加能容纳的表格行→分页继续,直到所有行处理完毕。下面是完整的代码示例:

主循环方法

void generateTablePages(PdfWriter pdfWriter, Document document) { 
    int docOffset = 0; 
    do { 
        addLeadInformation(document); // 先添加每页表格前的文本
        docOffset = addDocListTable(document, docOffset); 
        // 如果还有剩余行,手动触发分页,确保下一次循环在新页面执行
        if (docOffset < numberOfDocs) {
            document.add(new AreaBreak(AreaBreakType.NEXT_PAGE));
        }
    } while (docOffset < numberOfDocs); 
} 

表格生成方法

int addDocListTable(Document document, int docOffset) { 
    // 根据你的业务需求创建表格,这里以3列等宽表格为例
    Table table = new Table(UnitValue.createPercentArray(3));
    table.setWidth(UnitValue.createPercentValue(100)); // 表格占满页面宽度

    // 计算当前页面剩余可用高度
    float bottomMargin = document.getBottomMargin();
    float currentY = document.getRenderer().getCurrentArea().getBBox().getTop();
    float remainingVerticalSize = currentY - bottomMargin;

    int docIdx;
    for (docIdx = docOffset; docIdx < bklgReceiptEntries.size(); ++docIdx) {
        // 根据条目生成表格行(你需要自行实现这个行创建方法)
        TableRow row = createReceiptRow(bklgReceiptEntries.get(docIdx));
        table.addRow(row);

        // 检查当前表格总高度是否超过剩余空间
        float tableHeight = table.getHeight();
        if (tableHeight > remainingVerticalSize) {
            table.removeLastRow(); // 移除超出剩余空间的行
            break;
        }
    }

    // 将当前表格段添加到文档
    document.add(table);
    return docIdx;
}

注意事项

  1. 确保getCurrentArea()不为null:必须先调用addLeadInformation添加内容,文档渲染器才会生成当前区域信息,否则getCurrentArea()会返回null。
  2. 动态行高度兼容:如果表格行包含自动换行的文本,table.getHeight()会自动计算实际渲染高度,无需额外处理。
  3. 极端场景处理:如果某一行的高度直接超过剩余空间,表格会自动分页到下一页,下一次循环会自动在新页面添加前置文本,完全符合你的需求。

这种方式和你原来的逻辑完全对齐,不需要复杂的分页事件,容易理解和维护。

内容的提问来源于stack exchange,提问作者Daniel Rodríguez

火山引擎 最新活动