Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将圆角边框应用于表格(单页/多页)?_Java_Pdf_Itext_Border_Itext7 - Fatal编程技术网

Java 如何将圆角边框应用于表格(单页/多页)?

Java 如何将圆角边框应用于表格(单页/多页)?,java,pdf,itext,border,itext7,Java,Pdf,Itext,Border,Itext7,我想将圆角边框应用于桌子。这张桌子是动态的。这意味着它可以扩展到多个页面,也可以容纳单个页面 若表格是单页的,那个么所有四个角单元格的最外角都应该画成圆角。 若表格扩展到多页(比如3页),则所有四个角单元格的最外角应为所有3页的四舍五入 下面是我用来实现上述场景的方法 public void createPdf(String dest) throws FileNotFoundException { PdfWriter writer = new PdfWriter

我想将圆角边框应用于桌子。这张桌子是动态的。这意味着它可以扩展到多个页面,也可以容纳单个页面

若表格是单页的,那个么所有四个角单元格的最外角都应该画成圆角。 若表格扩展到多页(比如3页),则所有四个角单元格的最外角应为所有3页的四舍五入

下面是我用来实现上述场景的方法

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