「这是我参与2022首次更文挑战的第16天,活动详情查看:2022首次更文挑战」
PDF神器iText英文版翻译与学习
作者: 薛大郎.
英文原版: iText in Action 2nd Edition.pdf
坚持. 分享. 成长. 利他 !
一. 前言
能耐得住寂寞, 才能成功
这两天又看了下士兵突击, 许三多 在三连五班这个全国可能只有的一个班里边, 对于大多数人来说可能都会沉沦, 而他还能说答出班长的 大多数人的一生都在做一些没有意义的事情
, 他说, 我要好好的活, 好好的活就是做有意义的事.
从此他知道了这个所谓的命令
, 就是有意义的事情. 在其他人的无情辱骂下, 寂寞的一个人在做那个只有自己认为有意义的事情.
我们来想说踏实耐得住寂寞, 其实他更多的是 偏执
, 成功的人也都有一个特性, 就是偏执. 对一件事情与他人想法不一致的执着.
正是偏执所以才寂寞, 但他又乐在其中, 这个乐在其中, 我想才是能够耐得住寂寞的 诀窍.
二.正文.
继续学习PdfPCell的事件PdfPCellEvent.
// 与 PdfPTableEvent的设计基本相似.
public interface PdfPCellEvent {
/**
* 在单元格渲染结束时调用此方法。 文本或图形被添加到canvases中包含的 4 个PdfContentByte之一。
* 这四个 canvases的索引(即对应key)是:
* PdfPTable.BASECANVAS - 原始PdfContentByte 。 放置在这里的任何东西都将在单元格下方。
* PdfPTable.BACKGROUNDCANVAS - 背景所在的层。
* PdfPTable.LINECANVAS - 线条所在的层。
* PdfPTable.TEXTCANVAS - 文本所在的层。 放置在这里的任何东西都将在单元格上方。
* 这些层按顺序放置在彼此的顶部。
*
* 参数:
* cell — 每一个单元格
* position – 单元格的坐标
* canvases – PdfContentByte数组
*
*/
public void cellLayout(PdfPCell cell, Rectangle position, PdfContentByte[] canvases);
}
那我们就是实现自己的event, 然后设置调用需要使用此事件的单元格即可, 即 cell.setCellEvent(customEvent); 我们再来看下书中的例子一起学习下, 也相当的典型, 就是给一些单元格添加颜色进度条.
// 进度条长度事件实现类
class RunLength implements PdfPCellEvent {
// 要展示的区间, 稍后转化
public int duration;
public RunLength(int duration) {
this.duration = duration;
}
// 实现此方法即可.
public void cellLayout(PdfPCell cell, Rectangle rect, PdfContentByte[] canvas) {
// 需要在文本下边, 使用此层即可 ---PdfPTable.BACKGROUNDCANVAS
PdfContentByte cb = canvas[PdfPTable.BACKGROUNDCANVAS];
// 查看源码可知 需要先存下状态, 即文本是否结束了, 如果没有结束, 防止乱码, 需要先结束下.
cb.saveState();
// 按照等级划分, 来区分颜色.
if (duration < 90) {
cb.setRGBColorFill(0x7C, 0xFC, 0x00);
} else if (duration > 120) {
cb.setRGBColorFill(0x8B, 0x00, 0x00);
} else {
cb.setRGBColorFill(0xFF, 0xA5, 0x00);
}
// 开始画这个进度条了. rectangle(final float x起点, final float y起点, final float w宽度, final float h高度)
// 所以主要关注的是到哪里, 即宽度.
cb.rectangle(rect.getLeft(), rect.getBottom(), rect.getWidth() * duration / 240, rect.getHeight());
// 填充动作
cb.fill();
// 在重新回复状态, 要与 saveState对应, *原理就犹如 线程切换时的cpu上下文记录状态.*
cb.restoreState();
}
}
这样我们就学完了table和cell的事件. 在书中还有一个组合两个事件的一个例子, 其实比较简单, 就不详细讲解了.
但是对于事件的设计, 我想在这里多说两句, 抽象对于java语言不仅是三大特性, 最重要的是实现代码的一个很重要的指标, 如果抽象的合理, 设计的合理, 将让我们的实现事半功倍, 扩展性和可维护性大大提高. 抽象又是个技术活, 对于包的抽象, 对于类的抽象, 对于方法的抽象, 当然更多的还是对于接口的抽象, 还有方法的访问级别的控制, 都是我们要下功夫去权衡的.
**下一篇我们重点讲解基本块元素的事件. **