iText java-垂直和水平拆分表

iText java-垂直和水平拆分表,java,itext,Java,Itext,我是一名iTextJava开发人员。我一直在处理大型表格,现在我陷入了垂直拆分表格的困境 在iText In Action的第119页中,尊敬的布鲁诺·洛瓦吉(我非常尊重这个家伙)解释了如何拆分一个大表,使列显示在两个不同的页面中 我遵循了他的示例,当文档只有几行时,它可以很好地工作 在我的例子中,我有100行,这意味着文档需要在多个页面中拆分100行,同时垂直拆分列。我按如下方式运行代码,但只显示前34行 有人能解释一下这个代码有什么问题吗 //create a PDFPTable with

我是一名iTextJava开发人员。我一直在处理大型表格,现在我陷入了垂直拆分表格的困境

在iText In Action的第119页中,尊敬的布鲁诺·洛瓦吉(我非常尊重这个家伙)解释了如何拆分一个大表,使列显示在两个不同的页面中

我遵循了他的示例,当文档只有几行时,它可以很好地工作

在我的例子中,我有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);
//创建一个包含24列的PDFPTable
PdfPTable tbl=新的PdfPTable(新浮点{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1});
//循环100行
对于(int i=0;i<100;i++){
//插入24个表格单元格
}
tbl.设置总宽度(1500)//设置桌子宽度
浮动顶部=document.top()-document.topMargin()-30;
PdfContentByte canvas=writer.getDirectContent();
tbl.writeSelectedRows(0,12,0,-1,document.leftMargin(),顶部,画布);
document.newPage();
//在下一页上绘制剩余的两列
tbl.writeSelectedRows(12,-1,0,-1,5,顶部,画布);

你看不到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();
}
public void createPdf(String dest)抛出IOException、DocumentException{
文档=新文档(PageSize.A4.rotate());
PdfWriter writer=PdfWriter.getInstance(文档,新文件输出流(dest));
document.open();
PdfPTable tbl=新的PdfPTable(新浮点[]{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1});
//循环100行

对于(int r=1;r您看不到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();
}
public void createPdf(String dest)抛出IOException、DocumentException{
文档=新文档(PageSize.A4.rotate());
PdfWriter writer=PdfWriter.getInstance(文档,新文件输出流(dest));
document.open();
PdfPTable tbl=新的PdfPTable(新浮点[]{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1});
//循环100行

对于(int r=1;r它工作得很好,我的兄弟。这是公认的答案。我在这一次上了好几个晚上没睡,现在我可以睡一觉了。在柏林一切都很好,顺便说一句,我们真的需要在肯尼亚的奈奥比举行一次Java/iText会议。我希望你能来激励非洲的年轻开发人员。我会做到这一点。我该怎么写亲自给你发电子邮件?如果我违反了Stackoverflow协议,我深表歉意。我飞到世界各地去参加会议,但我还没有到过非洲。联系我参加会议的最好方式是发邮件到marketing@itextpdf.com这样你就能接触到比我更了解我的旅行/会议议程的人。我肯定会的我会很快写信给你的,兄弟。我很感激。我的兄弟,它工作得很好。这是公认的答案。我在这个问题上已经睡了好几个晚上了,现在我可以睡一觉了。在柏林,一切都很好,顺便说一句,我们真的需要在肯尼亚的奈奥比举行一次Java/iText会议。我希望你能来激励非洲的年轻开发者。我将如果我违反了Stackoverflow协议,我会向你道歉。我会飞到世界各地去参加会议,但我还没有到过非洲。联系我参加会议的最好方式是发邮件到marketing@itextpdf.com这样你就可以联系到了解我的旅行/会议安排的人a比我好。我一定会很快给你写信的,兄弟。我很感激。