How to use a dotted line as a cell border?

Tags: tablestable borderbordercell eventdotted lineiText 5

I am trying to create a table with cells that have a dotted line for a border. How can I do this?

Posted on StackOverflow on Nov 21, 2013 with user1913695

I've made an example that solves your problem: DottedLineCell; The resulting PDF is a document with two tables: dotted_line_cell.pdf

For the first table, we use a table event:

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

This is the most elegant way to draw the cell borders, as it uses only one stroke() operator for all the lines. Unfortunately, this solution isn't an option if you have tables with rowspans.

The second table uses a cell event:

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

With a cell event, a border is drawn around every cell. This means you'll have multiple stroke() operators and overlapping lines. However: this solution always works, also when the table has cells with a rowspan greater than one.