我正在编辑pdf想要在pdf的给定页面添加表格

时间:2017-05-31 09:21:22

标签: java itext itext7

以下是我使用itext7以PDF格式将表格添加到8页的代码。

不幸的是,它只是添加到第一页而不是第8页。

PdfDocument pdfDoc = new PdfDocument(new PdfReader(src), new PdfWriter(dest));
Table table = new Table(new float[]{1, 15});
table.setWidthPercent(80);
table.addHeaderCell("#");
table.addHeaderCell("description");
PageSize ps = pdfDoc.getDefaultPageSize();
PdfPage p =pdfDoc.getPage(8);
Document doc = new Document(p.getDocument());
table.setFixedPosition(doc.getLeftMargin(), doc.getBottomMargin(), ps.getWidth() - doc.getLeftMargin() - doc.getRightMargin());
IRenderer tableRenderer = table.createRendererSubTree().setParent(doc.getRenderer());
LayoutResult tableLayoutResult = tableRenderer.layout(new LayoutContext(new LayoutArea(0, new Rectangle(ps.getWidth(), 1000))));
float totalHeight = tableLayoutResult.getOccupiedArea().getBBox().getHeight();
doc.add(table);
doc.close();

我无法确定问题所在。

我做错了什么以及如何有效地将表格添加到特定页面?

1 个答案:

答案 0 :(得分:2)

使用iText7中的Document对象时,有两种方法可以将表格添加到特定页面:

  1. 通过Table#setFixedPosition为表格设置固定位置。该方法包含两个重载,允许您指定页面编号。好处是你可以绝对控制桌子的位置。缺点是您需要指定绝对位置和宽度,因此表格不再动态放置。

  2. 在指定页面上创建布局Canvas,并将表格添加到画布中。

  3. 展示两种方法的小例子:

    public void createPdf(String dest) throws IOException, FileNotFoundException{
        PdfWriter writer = new PdfWriter(dest);
        PdfDocument pdfDoc = new PdfDocument(writer);
    
        //Turn off immediate flush to be certain the page you want to insert the table on hasn't been flushed yet
        Document doc = new Document(pdfDoc, pdfDoc.getDefaultPageSize(),false);
    
        //Add a some empty pages
        for (int i = 1; i < nrOfPages ; i++) {
            doc.add(new AreaBreak(AreaBreakType.NEXT_PAGE));
        }
    
        //Method 1: Fixed Pos table
        Table fixedPagefixedPosTable = createTable();
        float margin = 10;
        PageSize defaultSize = pdfDoc.getDefaultPageSize();
        float ypos = defaultSize.getHeight()/2;
        fixedPagefixedPosTable.setFixedPosition(tablePage,margin,ypos,defaultSize.getWidth()-2*margin);
        doc.add(fixedPagefixedPosTable);
    
        //Method 2: Using a canvas
        Table canvasTable = createTable();
        PdfCanvas pdfCanvas = new PdfCanvas(pdfDoc.getPage(tablePage+1));
        margin = 10;
        Rectangle canvasArea = new Rectangle(margin,margin,defaultSize.getWidth()-margin,defaultSize.getHeight()-margin);
        Canvas canvas = new Canvas(pdfCanvas,pdfDoc,canvasArea);
        canvas.add(canvasTable);
        canvas.close();
    
        doc.close();
    }
    
    private Table createTable(){
        //Create table
        float[] colWidths = {20f,20f,20f};
        Table table = new Table(colWidths);
        for (int j = 0; j < colWidths.length*nrOfRows; j++) {
            Cell c = new Cell();
            if(j/colWidths.length == 0){
                //Header
                c.add("Header  " +j);
            }else{
                //Data
                c.add("Data " + j/colWidths.length + ","+ j%colWidths.length);
            }
            table.addCell(c);
        }
        return table;
    }
    
相关问题