您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

如何使用虚线作为单元格边框?

如何使用虚线作为单元格边框?

您正在使用单元事件,但是您的代码非常糟糕。您还将引入PDF语法错误,如果仅使用iText的较新版本,将会收到警告。(关于iText版本过时的警告是有原因的。人们不应该忽略它们!!!)

话虽如此,我已经提出了解决您的问题的示例:DottedLineCell

生成的PDF是包含两个表的文档:dotted_line_cell.pdf

对于第一个表,我们使用一个表事件:

class DottedCells implements PdfPTableEvent {
    @Override
    public void tableLayout(PdfPTable table, float[][] widths,
        float[] heights, int headerRows, int rowStart,
        PdfContentByte[] canvases) {
        PdfContentByte canvas = canvases[PdfPTable.LINECANVAS];
        canvas.setLineDash(3f, 3f);
        float llx = widths[0][0];
        float urx = widths[0][widths[0].length -1];
        for (int i = 0; i < heights.length; i++) {
            canvas.moveTo(llx, heights[i]);
            canvas.lineTo(urx, heights[i]);
        }
        for (int i = 0; i < widths.length; i++) {
            for (int j = 0; j < widths[i].length; j++) {
                canvas.moveTo(widths[i][j], heights[i]);
                canvas.lineTo(widths[i][j], heights[i+1]);
            }
        }
        canvas.stroke();
    }
}

这是绘制单元格边框的最优雅的方法,因为它对stroke()所有线条仅使用一个运算符。如果您的表具有行跨度,则这不是一个选择(但是您可能不关心行跨度,因为您使用的iText版本过时,不支持行跨度)。

第二个表使用单元事件:

class DottedCell implements PdfPCellEvent {
    @Override
    public void cellLayout(PdfPCell cell, Rectangle position,
        PdfContentByte[] canvases) {
        PdfContentByte canvas = canvases[PdfPTable.LINECANVAS];
        canvas.setLineDash(3f, 3f);
        canvas.rectangle(position.getLeft(), position.getBottom(),
            position.getWidth(), position.getHeight());
        canvas.stroke();
    }
}

发生单元事件时,将在每个单元周围绘制边框。这意味着您将有多个stroke()运算符和重叠的行。

我可以再恳求您升级到最新版本吗?iText 5之前的版本存在一个特殊错误,该错误导致表行在十亿行中消失一次。

其他 2022/1/1 18:26:28 有484人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶