java生成PDF:itext
in 默认分类 with 0 comment

java生成PDF:itext

in 默认分类 with 0 comment

itext是java的一个合成PDF库,最近接触生成PDF相关的功能,一开始用生成图片再合成PDF的方式做,但发现性能不佳,并且排版非常麻烦,PDF种的文字也无法选中。

网上查了一番,发现有itext可用,于是拿出来试一番。2.1.7版本之后需要购买许可证才能商用,简单试用了下。

maven

        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.5.10</version>
        </dependency>

最新版的是IText 7 Core,但相对说5.x的相关教程比较多,只是简单使用于是就用了5.5.10的版本进行。

步骤

最基本的有5个步骤,如下:

    // 创建文档
    Document document = new Document();  
    // 关联书写器
    PdfWriter.getInstance(document, new FileOutputStream("createSamplePDF.pdf"));
    // 打开文档
    document.open();  
    // 写入内容
    document.add(new Paragraph("Hello World"));  
    // 关闭文档
    document.close(); 

给PdfPTable最外层套上边框

table默认是不能直接设置边框的,只能给表格里的单元格设置边框。所以需要用到表格事件来完成,在绘制结束的时候触发事件绘制边框。

/**
 * 表格边框事件
 */
class BorderEvent implements PdfPTableEvent {
    @Override
    public void tableLayout(PdfPTable table, float[][] widths,
                            float[] heights, int headerRows, int rowStart,
                            PdfContentByte[] canvases) {
        float width[] = widths[0];
        float x1 = width[0];
        float x2 = width[width.length - 1];
        float y1 = heights[0];
        float y2 = heights[heights.length - 1];
        PdfContentByte cb = canvases[PdfPTable.LINECANVAS];
        cb.rectangle(x1, y1, x2 - x1, y2 - y1);
        cb.stroke();
        cb.resetRGBColorStroke();
    }
}

使用:

PdfPTable table = new PdfPTable(1);
table.setTotalWidth(350);
table.setLockedWidth(true);
table.setTableEvent(new BorderEvent());
Responses