我正在编辑 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 添加到特定页面:
通过 Table#setFixedPosition
为 table 设置固定位置。该方法包含两个允许您指定页码的重载。好处是您可以完全控制 table 的位置。缺点是您需要指定绝对位置和宽度,因此 table 不再真正动态放置。
在指定页面上创建布局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;
}
下面是我编写的代码,使用 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 添加到特定页面:
通过
Table#setFixedPosition
为 table 设置固定位置。该方法包含两个允许您指定页码的重载。好处是您可以完全控制 table 的位置。缺点是您需要指定绝对位置和宽度,因此 table 不再真正动态放置。在指定页面上创建布局
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;
}