我正在编辑 pdf,想在 pdf 的给定页面添加 table

I am editing a pdf want to add table at given page in pdf

下面是我编写的代码,使用 itext7 将 table 添加到 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();

我无法确定问题出在哪里。

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

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

  1. 通过 Table#setFixedPosition 为 table 设置固定位置。该方法包含两个允许您指定页码的重载。好处是您可以完全控制 table 的位置。缺点是您需要指定绝对位置和宽度,因此 table 不再真正动态放置。

  2. 在指定页面上创建布局Canvas,并将table添加到canvas。

一个展示这两种方法的小例子:

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;
}