Java 如何将圆角边框应用于表格(单页/多页)?
我想将圆角边框应用于桌子。这张桌子是动态的。这意味着它可以扩展到多个页面,也可以容纳单个页面 若表格是单页的,那个么所有四个角单元格的最外角都应该画成圆角。 若表格扩展到多页(比如3页),则所有四个角单元格的最外角应为所有3页的四舍五入 下面是我用来实现上述场景的方法Java 如何将圆角边框应用于表格(单页/多页)?,java,pdf,itext,border,itext7,Java,Pdf,Itext,Border,Itext7,我想将圆角边框应用于桌子。这张桌子是动态的。这意味着它可以扩展到多个页面,也可以容纳单个页面 若表格是单页的,那个么所有四个角单元格的最外角都应该画成圆角。 若表格扩展到多页(比如3页),则所有四个角单元格的最外角应为所有3页的四舍五入 下面是我用来实现上述场景的方法 public void createPdf(String dest) throws FileNotFoundException { PdfWriter writer = new PdfWriter
public void createPdf(String dest) throws FileNotFoundException {
PdfWriter writer = new PdfWriter(DEST);
PdfDocument pdfDoc = new PdfDocument(writer);
Document document = new Document(pdfDoc, PageSize.A4, false);
Table table = new Table(3);
for (int i=0; i < 100; i++) {
for (int j=0; j < 3; j++) {
table.addCell(new Cell().add(new Paragraph("Cell content")));
}
}
table.setNextRenderer(new TableBorderRenderer(table));
document.add(table);
document.close();
}
现在,代码可以正常工作了,但渲染有问题。当我在表格边框顶部绘制白色边框时,它不会完全重叠。此外,外部红色边框在预期区域的稍外侧绘制。简单地说,白色矩形和红色矩形并不重合。所以在外边界和细胞边界之间有一些间隙。
我附加从上述代码生成的输出。要注意这个问题,您可能需要将PDF放大一点
我对此也有一些疑问:
我正在使用顶部画布来获得预期的解决方案。但是有没有什么方法可以在渲染时直接修改表边框?我试过了
drawContext.getCanvas()
.saveState()
.roundRectangle(rect.getLeft(), rect.getBottom(), rect.getWidth(), rect.getHeight(), 5).stroke().restoreState();
但在这种方法中,边界与单元边界重叠(也需要单元边界)。如果我遗漏了一些可以防止这个问题的东西,请指导我
谢谢。使用
getoccupiederabbox
方法可以获得边界区域的外部边界框。但是,边框本身有厚度,默认情况下,在PDF中绘制线条时,应将线条的中心传递给绘图操作,同时传递外部bbox坐标,因此边距小且重叠不精确
要解决此问题,需要将边框线宽度的一半添加到矩形的所有边上:
float lineWidth = 0.5f;
rect.applyMargins(lineWidth / 2, lineWidth / 2, lineWidth / 2, lineWidth / 2, false);
总之,以下自定义代码:
@Override
protected void drawBorders(DrawContext drawContext) {
Rectangle rect = getOccupiedAreaBBox();
PdfPage currentPage = drawContext.getDocument().getPage(getOccupiedArea().getPageNumber());
PdfCanvas aboveCanvas = new PdfCanvas(currentPage.newContentStreamAfter(), currentPage.getResources(), drawContext.getDocument());
float lineWidth = 0.5f;
rect.applyMargins(lineWidth / 2, lineWidth / 2, lineWidth / 2, lineWidth / 2, false);
// drawing white rectangle over table border in order to hide it.
aboveCanvas.saveState().setLineWidth(lineWidth).setStrokeColor(new DeviceRgb(255,255,255)).rectangle(rect).stroke().restoreState();
// drawing red round rectangle which will be shown as boundary.
aboveCanvas.saveState().setLineWidth(lineWidth).setStrokeColor(new DeviceRgb(255,0,0))
.roundRectangle(rect.getLeft(), rect.getBottom(), rect.getWidth(), rect.getHeight(), 5).stroke().restoreState();
super.drawBorders(drawContext);
}
产生以下可视结果:
@Override
protected void drawBorders(DrawContext drawContext) {
Rectangle rect = getOccupiedAreaBBox();
PdfPage currentPage = drawContext.getDocument().getPage(getOccupiedArea().getPageNumber());
PdfCanvas aboveCanvas = new PdfCanvas(currentPage.newContentStreamAfter(), currentPage.getResources(), drawContext.getDocument());
float lineWidth = 0.5f;
rect.applyMargins(lineWidth / 2, lineWidth / 2, lineWidth / 2, lineWidth / 2, false);
// drawing white rectangle over table border in order to hide it.
aboveCanvas.saveState().setLineWidth(lineWidth).setStrokeColor(new DeviceRgb(255,255,255)).rectangle(rect).stroke().restoreState();
// drawing red round rectangle which will be shown as boundary.
aboveCanvas.saveState().setLineWidth(lineWidth).setStrokeColor(new DeviceRgb(255,0,0))
.roundRectangle(rect.getLeft(), rect.getBottom(), rect.getWidth(), rect.getHeight(), 5).stroke().restoreState();
super.drawBorders(drawContext);
}