「这是我参与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省略掉.
如果你还关注了PdfPTable的源码, 你会发现 他还实现了LargeElement接口, 因为我们的Table类可能确实内容较丰富的一个元素, 如果内容过多或者嵌套了好几个table的时候, 以及添加了N个图片, 当然也可以只是一个table就可以内容很多, 占用内存很大, 就是一个LargeElement.
这个接口需要我们实现3个方法:
public void setComplete(boolean complete);
public boolean isComplete();
public void flushContent();
就是为了帮助我们解决大元素占用内存较多的情况. 设置完成的信号, 如果为true, 则等于告诉writer需要flushContent, 然后jvm也会将这些已经flush的实例然后用不到的作为 垃圾 回收掉.
好, 这就是这一篇的内容了.