2017-05-31 47 views
-3

下面是我使用itext7将PDF格式的表格添加到PDF页面的代码。我正在编辑PDF格式,希望在给定的页面上添加pdf格式的pdf格式

不幸的是,它仅添加到第一页而不是第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(); 

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

我在做什么错,我该如何有效地将表添加到特定页面?

+0

你想修改现有PdfDocument?因为'Document doc = new Document(p.getDocument());'创建全新的PdfDocument。阅读此问题[如何在不创建新PDF的情况下更新PDF?](https://stackoverflow.com/questions/16081831/how-to-update-a-pdf-without-creating-a-new-pdf) – Sergey

+1

所以你知道**表格必须放在现有PDF的第8页上?在这种情况下使用PdfStamper可能是一个好主意 – Jan

+0

或者[iText - 将内容添加到现有PDF文件](https://stackoverflow.com/questions/3335126/itext-add-content-to-existing-pdf-file) 。 – Sergey

回答

1

当与iText7的Document对象的工作,有两种方式将表添加到特定页面:

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

  2. 在指定页面上创建布局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; 
}