Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 向itext 7 pdf添加表时发生IndexOutOfBoundsException_Java_Pdf_Itext7 - Fatal编程技术网

Java 向itext 7 pdf添加表时发生IndexOutOfBoundsException

Java 向itext 7 pdf添加表时发生IndexOutOfBoundsException,java,pdf,itext7,Java,Pdf,Itext7,我试图创建一个包含多个表(大小未知)的PDF。 在一定数量的表(本例中为18)之后,将引发以下异常: Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 20, Size: 20 at java.util.ArrayList$SubList.rangeCheck(Unknown Source) at java.util.ArrayList$SubList.get(Unknown Source)

我试图创建一个包含多个表(大小未知)的PDF。 在一定数量的表(本例中为18)之后,将引发以下异常:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 20, Size: 20
   at java.util.ArrayList$SubList.rangeCheck(Unknown Source)
   at java.util.ArrayList$SubList.get(Unknown Source)
   at com.itextpdf.layout.renderer.CollapsedTableBorders.collapseAllBordersAndEmptyRows(CollapsedTableBorders.java:77)
   at com.itextpdf.layout.renderer.CollapsedTableBorders.updateBordersOnNewPage(CollapsedTableBorders.java:617)
   at com.itextpdf.layout.renderer.TableRenderer.layout(TableRenderer.java:248)
   at com.itextpdf.layout.renderer.RootRenderer.addChild(RootRenderer.java:111)
   at com.itextpdf.layout.RootElement.add(RootElement.java:108)
   at com.itextpdf.layout.Document.add(Document.java:143)
   at com.test.MinimalITextTest.createPdf(MinimalITextTest.java:83)
   at com.test.MinimalITextTest.main(MinimalITextTest.java:66)
我使用的是iText 7的快照版本(3月24日的7.0.3-snapshot)

是否有任何解决办法,或者我只是做错了什么

触发错误的示例代码:

package com.test;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import com.itextpdf.kernel.color.Color;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.border.SolidBorder;
import com.itextpdf.layout.element.Cell;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.element.Table;
import com.itextpdf.layout.property.HorizontalAlignment;
import com.itextpdf.layout.property.TextAlignment;
import com.itextpdf.layout.property.UnitValue;

public class MinimalITextTest {

    private static final int numberOfColumns=8;
    private static final UnitValue[] columnWeight;
    private static final int NUMBER_OF_TABLES = 18; //Does work with 17

    static {
        float[] percentArray = new float[numberOfColumns];
        for(int i=0; i<percentArray.length;i++)
        {
            percentArray[i] = 100.0f/numberOfColumns;
        }
        columnWeight=UnitValue.createPercentArray(percentArray);
    }


    private final List<Table> tables=new ArrayList<>();
    private Table currentTable;


    public MinimalITextTest()
    {
        currentTable=new Table(columnWeight)
            .setWidthPercent(100)
            .setTextAlignment(TextAlignment.CENTER)
            .setHorizontalAlignment(HorizontalAlignment.CENTER);
        tables.add(currentTable);
    }

    public static void main(String[] args) throws IOException
    {
        final char[] charArray="Minimal Example".toCharArray();
        final MinimalITextTest test = new MinimalITextTest();
        for(int k=0;k<NUMBER_OF_TABLES;k++)
        {
            for(int i=0;i<10;i++)
            {
                CellElement[] cellElement=new CellElement[charArray.length];
                for(int j=0;j<charArray.length;j++)
                {
                    cellElement[j] = new CellElement(String.valueOf(charArray[j]));
                }
                test.createRow(cellElement);
            }
            test.createNewTable();
        }
        test.createPdf("Minimal_test.pdf");
    }

    private void createNewTable() {
        currentTable=new Table(columnWeight)
            .setWidthPercent(100)
            .setTextAlignment(TextAlignment.CENTER)
            .setHorizontalAlignment(HorizontalAlignment.CENTER);
        tables.add(currentTable);
    }

    public void createPdf(String destinationFile) throws IOException {
        PdfWriter pw = new PdfWriter(new FileOutputStream(destinationFile));

        Document document = new Document(new PdfDocument(pw));
        for(Table t : tables)
        {
            document.add(t);
        }
        document.close();
    }

    public void createRow(CellElement... cells)
    {
        boolean addedACell=false;
        for(CellElement currentCell : cells)
        {
            if(currentCell==null)
            {
                continue;
            }
            addedACell = true;
            Cell cell = new Cell();
            cell.add(new Paragraph(currentCell.getText()))
                .setBorder(new SolidBorder(Color.BLACK, 0.5f))
                .setBackgroundColor(currentCell.getBackgroundColor());
            currentTable.addCell(cell);
        }
        if(addedACell)
        {
            currentTable.startNewRow();
        }
    }

    public static class CellElement
    {
        private final String text;
        private final Color color;

        public CellElement()
        {
            this.text = "";
            this.color = Color.WHITE;
        }


        public CellElement(String text)
        {
            this.text = text;
            this.color = Color.WHITE;
        }

        public CellElement(String text, Color color)
        {
            this.text = text;
            this.color = color;
        }

        public String getText() {
            return text;
        }

        public Color getBackgroundColor() {
            return color;
        }

    }
}
package.com.test;
导入java.io.FileOutputStream;
导入java.io.IOException;
导入java.util.ArrayList;
导入java.util.List;
导入com.itextpdf.kernel.color.color;
导入com.itextpdf.kernel.pdf.PdfDocument;
导入com.itextpdf.kernel.pdf.PdfWriter;
导入com.itextpdf.layout.Document;
导入com.itextpdf.layout.border.SolidBorder;
导入com.itextpdf.layout.element.Cell;
导入com.itextpdf.layout.element.paragration;
导入com.itextpdf.layout.element.Table;
导入com.itextpdf.layout.property.HorizontalAlignment;
导入com.itextpdf.layout.property.TextAlignment;
导入com.itextpdf.layout.property.UnitValue;
公共类最小测试{
私有静态final int numberOfColumns=8;
私有静态最终单位值[]列权重;
私有静态final int NUMBER_OF_TABLES=18;//可用于17
静止的{
float[]percentArray=新的float[numberOfColumns];

对于(int i=0;i这确实是当前快照中的一个错误。作为一种解决方法,如果知道将不再有行,请不要调用
startNewRow()

对于您的示例,可通过以下方式应用解决方案:

public void createRow(boolean lastRow, CellElement... cells)
{
    for(CellElement currentCell : cells)
    {
        if(currentCell==null)
        {
            continue;
        }
        Cell cell = new Cell();
        cell.add(new Paragraph(currentCell.getText()))
                .setBorder(new SolidBorder(Color.BLACK, 0.5f))
                .setBackgroundColor(currentCell.getBackgroundColor());
        currentTable.addCell(cell);
    }
    if (!lastRow) {
        currentTable.startNewRow();
    }
}

传递一个参数,指示这是否是
createRow
的最后一行。在您的示例中,调用将是
createRow(i==9,cellElement);
您好,谢谢您的提问


太长了,读不下去了。< P>问题。我们可以在快照版本中找到变化。

欢迎使用T.Dr;DR;请参阅使用稳定版本(7.0.2),除非ITEXT支持明确地要求。谢谢您的快速响应。