2017-05-31 104 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; 
}