【问题标题】:iText java - Split table vertically and horizontallyiText java - 垂直和水平拆分表格
【发布时间】:2016-06-13 12:58:20
【问题描述】:

我是一名 iText Java 开发人员。我一直在使用大桌子,现在我被困在垂直拆分桌子上。

在 iText in Action 的第 119 页中,尊敬的 Bruno Lowagie(我非常尊重这个人)解释了如何拆分大表,以便列出现在两个不同的页面中。

我按照他的示例进行操作,当文档的行数很少时它可以正常工作。

在我的例子中,我有 100 行,这意味着文档需要将 100 行分成几页,同时垂直拆分列。我按如下方式运行我的代码,但只显示前 34 行。

谁能解释一下这段代码有什么问题:

//create a PDFPTable with 24 columns
PdfPTable tbl = new PdfPTable(new float{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1});
//loop through 100 rows
for (int i = 0; i < 100; i++) {
    //insert 24 table cells
}

tbl.setTotalWidth(1500);//set table width
float top = document.top() - document.topMargin() - 30;
PdfContentByte canvas = writer.getDirectContent();
tbl.writeSelectedRows(0, 12, 0, -1, document.leftMargin(), top, canvas);
document.newPage();
// draw the remaining two columns on the next page
tbl.writeSelectedRows(12, -1, 0, -1, 5, top, canvas);

【问题讨论】:

    标签: java itext


    【解决方案1】:

    您看不到 100 行,因为 100 行不适合单个页面。当您使用writeSelectedRows() 时,您需要计算页面上适合多少行,并且只添加适合的行。

    我目前正在柏林参加一个会议,但我写了一个简单的示例,或多或少地显示了您需要做的事情:

    public void createPdf(String dest) throws IOException, DocumentException {
        Document document = new Document(PageSize.A4.rotate());
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest));
        document.open();
        PdfPTable tbl = new PdfPTable(new float[]{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1});
        //loop through 100 rows
        for (int r = 1; r <= 100; r++) {
            for (int c = 1; c <= 24; c++) {
                tbl.addCell(String.format("r%sc%s", r, c));
            }
        }
        PdfContentByte canvas = writer.getDirectContent();
        tbl.setTotalWidth(1500);//set table width
        float top = document.top() - document.topMargin() - 30;
        float yPos = top;
        int start = 0;
        int stop = 0;
        for (int i = 0; i < 100; i++) {
            yPos -= tbl.getRowHeight(i);
            if (yPos < 0) {
                stop = --i;
                tbl.writeSelectedRows(0, 12, start, stop, document.leftMargin(), top, canvas);
                document.newPage();
                tbl.writeSelectedRows(12, -1, start, stop, 5, top, canvas);
                start = stop;
                document.newPage();
                yPos = top;
            }
        }
        tbl.writeSelectedRows(0, 12, stop, -1, document.leftMargin(), top, canvas);
        document.newPage();
        tbl.writeSelectedRows(12, -1, stop, -1, 5, top, canvas);
        document.close();
    }
    

    如您所见,我会跟踪表格的高度,一旦有“从页面上掉下来”的风险,我就会渲染适合的行,然后转到下一页。

    【讨论】:

    • 效果很好,我的兄弟。这是公认的答案。我已经在这一天失眠了很多个晚上,现在我可以睡一觉了。柏林一切顺利,顺便说一句,我们真的需要在肯尼亚的 Naiobi 举办一次 Java/iText 会议。我希望你能来激励非洲的年轻开发者。我会做到这一点。我如何亲自给你写信?如果我违反了 Stackoverflow 协议,我深表歉意。
    • 我飞遍世界去参加会议,但我还没有到过非洲。联系我参加会议的最佳方式是发送邮件至marketing@itextpdf.com 这样您就可以联系到比我更了解我的旅行/会议议程的人。
    • 我一定会写信给你的,兄弟。我很感激。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 1970-01-01
    • 2017-06-06
    • 1970-01-01
    相关资源
    最近更新 更多