[更文挑战]iText番盘-PDF神器-14

348 阅读3分钟

「这是我参与2022首次更文挑战的第14天,活动详情查看:2022首次更文挑战

PDF神器iText英文版翻译与学习

作者: 薛大郎.
英文原版:iText in Action 2nd Edition.pdf

坚持. 分享. 成长. 利他 !

一. 前言

初二你在舅家还是(丈母)娘家

初二的时候很多地方拜年对象不同, 但是大部分就是舅家或者丈母娘家. 不管谁家, 我们主要是希望与亲人常联系, 希望亲人能够健康常伴, 幸福美满, 尤其是你丈母娘家, 当然你如果没有女朋友或者媳妇, 可一定要趁着过年时间抓紧时间相亲哦. 因为00后的女性已经结婚了一大波人了, 而且所剩的80后和90后 也已经条件认为自己过低了还是找不到. 所以不管怎样, 结婚要在适当的年龄早日修成正果.

二.正文.

6.1 继续详解PdfPTable和PdfPCell 特殊使用

很多时候我们会想将cell中的文字调转方向等, 可以使用PdfPCell.setRotation()来这只旋转倾斜度来实现, 但是还有一种就是使得文字按照竖线展示, 你是否有方案来实现呢?

在这里提示下, 其实就是使用无边框的只有一列的 PdfPTable作为一个Cell来实现即可. 大家可以动手试下, 并没有多难.

其实我们用到的最多的还是PdfPCell的setBackground来设置背景颜色, 也可以设置PdfPCell.setBorder来设置cell的边框.

    PdfPCell cell;
    ...
    // 一个红色的无边框的cell
    cell = new PdfPCell(new Phrase("red / no borders"));
    // setBorder其实是Rectangle的方法.
    cell.setBorder(Rectangle.NO_BORDER);
    // setBackgroundColor其实也是Rectangle的方法.
    cell.setBackgroundColor(BaseColor.RED);
    table.addCell(cell);
    ...
    // 一个青色的蓝色上边框+
    cell = new PdfPCell(new Phrase("cyan / blue top border + padding"));
    cell.setBorder(Rectangle.TOP);
    // 使用边框的padding,  这个与html的<table>中的<tr><th>的padding和margin很像大家可以参考下. 我觉得无须解释.
    cell.setUseBorderPadding(true);
    cell.setBorderWidthTop(5f);
    cell.setBorderColorTop(BaseColor.BLUE);
    cell.setBackgroundColor(BaseColor.CYAN);
    table.addCell(cell);
    ...
    // 添加一个灰色 无边框得文案为 0.6 的cell
    cell = new PdfPCell(new Phrase("0.6"));
    cell.setBorder(Rectangle.NO_BORDER);
    cell.setGrayFill(0.6f);
    table.addCell(cell);

接下来我们学习 table的header和footer的设置

    PdfPCell cell = new PdfPCell(new Phrase(day.toString(), f));
    cell.setBackgroundColor(BaseColor.BLACK);
    cell.setHorizontalAlignment(Element.ALIGN_CENTER);
    cell.setColspan(7);
    table.addCell(cell);
    table.getDefaultCell().setBackgroundColor(BaseColor.LIGHT_GRAY);
    for (int i = 0; i < 2; i++) {
        table.addCell("Location");
        table.addCell("Time");
        table.addCell("Run Length");
        table.addCell("Title");
        table.addCell("Year");
        table.addCell("Directors");
        table.addCell("Countries");
    }
    table.getDefaultCell().setBackgroundColor(null);
    table.setHeaderRows(3);
    table.setFooterRows(1);
    ...

代码其实并不难理解, 主要是最下边的两行. table.setHeaderRows(3); table.setFooterRows(1); 其实看完源码的都知道, 当设置一个具有两行header和1行footer的时候, 就是这样设置的, 具体为什么呢:

因为iText的PdfPTable 为了让我们可以像excel一样可以固定header和footer, 所以需要在添加其他内容的时候, 设置好header和footer, 以及都是几行, 也就是说这添加的三行中, footer为一行, header为 3 - 1 = 2 行.

这样我们可以在每一页能够看到都有table的header 和 footer, 当然如果后边内容不多了, 我们可以不添加footer, 只需要调用setSkipLastFooter(true), 就可以将最后的footer省略掉.

image.png

如果你还关注了PdfPTable的源码, 你会发现 他还实现了LargeElement接口, 因为我们的Table类可能确实内容较丰富的一个元素, 如果内容过多或者嵌套了好几个table的时候, 以及添加了N个图片, 当然也可以只是一个table就可以内容很多, 占用内存很大, 就是一个LargeElement.

这个接口需要我们实现3个方法:

    public void setComplete(boolean complete);
    public boolean isComplete();
    public void flushContent();

就是为了帮助我们解决大元素占用内存较多的情况. 设置完成的信号, 如果为true, 则等于告诉writer需要flushContent, 然后jvm也会将这些已经flush的实例然后用不到的作为 垃圾 回收掉.

好, 这就是这一篇的内容了.