iText中顶部和底部的虚线

时间:2015-03-29 09:05:33

标签: android itext

我正在使用iText生成pdf。我想在表头中画出虚线。 现在我想这样做。

private void createTable(Document document)  throws DocumentException {
              Report_Page app = new Report_Page();
            float[] columnWidths = { 1.5f, 5f, 2f, 1.5f, 2f };          
            PdfPTable table = new PdfPTable(columnWidths);

            table.setTotalWidth(300f);

            PdfPCell cell = new PdfPCell(new Phrase("P.No"));
            cell.setHorizontalAlignment(Element.ALIGN_CENTER);
            cell.setCellEvent(app.new DottedCell());
            cell.setBorder(Rectangle.NO_BORDER);
            table.addCell(cell);


            cell = new PdfPCell(new Phrase("Item Name"));
            cell.setHorizontalAlignment(Element.ALIGN_CENTER);
            cell.setCellEvent(app.new DottedCell());
            cell.setBorder(Rectangle.NO_BORDER);
            table.addCell(cell);


            cell = new PdfPCell(new Phrase("Price"));
            cell.setHorizontalAlignment(Element.ALIGN_CENTER);
            cell.setCellEvent(app.new DottedCell());
            cell.setBorder(Rectangle.NO_BORDER);
            table.addCell(cell);


            cell = new PdfPCell(new Phrase("Qty"));
            cell.setHorizontalAlignment(Element.ALIGN_CENTER);
            cell.setCellEvent(app.new DottedCell());
            cell.setBorder(Rectangle.NO_BORDER);
            table.addCell(cell);


            cell = new PdfPCell(new Phrase("Ext Price"));
            cell.setHorizontalAlignment(Element.ALIGN_CENTER);
            cell.setCellEvent(app.new DottedCell());
            cell.setBorder(Rectangle.NO_BORDER);
            table.addCell(cell);
            table.setHeaderRows(1);     


        }


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

            }
        }

现在O / P是这样的。 OP Image

但是我想从中移除左右边框。请让我删除左右边框。

表格中心的图片: Image

1 个答案:

答案 0 :(得分:1)

请查看DottedLineHeader标题示例。您有DottedLineCell中的复制/粘贴代码,您可以创建一个完整的矩形而不是两个单独的行。因此,您的问题的答案可能是:绘制两条线而不是矩形的四条边:

class DottedCell implements PdfPCellEvent {
    public void cellLayout(PdfPCell cell, Rectangle position,
        PdfContentByte[] canvases) {
        PdfContentByte canvas = canvases[PdfPTable.LINECANVAS];
        canvas.setLineDash(3f, 3f);
        canvas.moveTo(position.getLeft(), position.getTop());
        canvas.lineTo(position.getRight(), position.getTop());
        canvas.moveTo(position.getLeft(), position.getBottom());
        canvas.lineTo(position.getRight(), position.getBottom());
        canvas.stroke();
    }
}

虽然你可能会说:嘿,这有效!,如果你接受并赞成这样一个答案,我会感到内疚,因为它不是最好的答案。为什么不?因为您将为每个单元格绘制一个单独的行,并为每个单独行的第一个短划线创建不同的起始点。

更好的解决方案是将标题行定义为标题行(使用setHeaderRows()方法)并使用表事件绘制行:

class DottedHeader implements PdfPTableEvent {
    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 x1 = widths[0][0];
        float x2 = widths[0][widths.length];
        canvas.moveTo(x1, heights[0]);
        canvas.lineTo(x2, heights[0]);
        canvas.moveTo(x1, heights[headerRows]);
        canvas.lineTo(x2, heights[headerRows]);
        canvas.stroke();
    }
}

在这种情况下,当您使用单元格事件时,您只为标题写入两行而不是两行的倍数。