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

170 阅读3分钟

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

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

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

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

一. 前言

时间飞逝, 开心每一分钟, 充实每一分钟

今天已经初五了, 还依稀记得昨天刚放假, 就马上就要该上班了.

做人嘛, 最主要的是开心, 你现在是否开心啊? 那你现在是否充实呢? 正月的开心, 总是一年的劳苦换来的, 中国的年就是这样让中国人在这正月里犒劳自己. 而且正月里也有很多的禁忌, 正月里不能生气打架, 正月里不能拿剪刀, 正月里不能理发等等. 这些其实大家对于新的一年的一些彩头和期望, 也给自己留了时间来思考今年要做哪些事情, 希望明年的正月能过得更好. 在这里还是希望大家心想事成.

二.正文.

我们来研究其他得事件.

当我们向document添加一些基本得块等元素得时候, 我们其实是使用PdfWriter转换为了Pdf的语法, 然后写入到了一个Pdf文件中, 但是呢, 前面章节也提到了, 其实调用的是PdfDocument来实现的所有结果. 但是我们很难直接操作这个重要的类. 他还有一个重要的作用就是触发PdfPageEvent事件. 我们先来看下这个PdfPageEvent接口

// 
public interface PdfPageEvent {
    // 当doc已经打开后立即触发的一个事件方法
    public void onOpenDocument(PdfWriter writer, Document document);

    // 当第一页初始化好后立即触发的一个事件方法
    public void onStartPage(PdfWriter writer, Document document);
    
    // 当每页完成, 但还没有写入到doc的时候触发的一个事件方法.
    public void onEndPage(PdfWriter writer, Document document);
    
    // 当文档关闭时调用。 注意,调用此方法时,页码等于最后一页加一。 
    public void onCloseDocument(PdfWriter writer, Document document);
   
    // 在编写段落时调用。 paragraphPosition将保存段落将被写入的高度。 这对于插入具有更多控制权的书签很有用。
    public void onParagraph(PdfWriter writer, Document document, float paragraphPosition);
    
    // 在编写段落时调用。 paragraphPosition将保持段落结尾的高度。
    public void onParagraphEnd(PdfWriter writer,Document document,float paragraphPosition);
    
    // 在编写章节时调用。 position将保持章节将被写入的高度。
    public void onChapter(PdfWriter writer,Document document,float paragraphPosition, Paragraph title);
  
    // 到达章节结尾时调用。 position将保持章节结尾的高度。
    public void onChapterEnd(PdfWriter writer,Document document,float paragraphPosition);
    
    // 在编写 Section 时调用。 position将保持该部分将被写入的高度。
    public void onSection(PdfWriter writer,Document document,float paragraphPosition, int depth, Paragraph title);
   
    // 当达到一个部分的结尾时调用。 position将保持截面末端的高度
    public void onSectionEnd(PdfWriter writer,Document document,float paragraphPosition);
 
    // 在写入具有通用标签的Chunk时调用。 如,精确定位Chunk位置以生成书签很有用。
    public void onGenericTag(PdfWriter writer, Document document, Rectangle rect, String text);
}

如果我们不想都实现这些方法, 我们可以实现 PdfPageEventHelper类, 这个类就是已经将所有的方法都空实现了. 我们只需要重写我们关心的方法就好了.

这节呢, 我们主要看一下最后一个GenericTag方法的使用. 他其实chunk的一个对应方法, 因为chunk是我们最常用的一个高级元素, 可以使用他更好的实现我们的想法.

首先我们要在doc.open() 调用之前, writer初始化之后, 调用writer.setPageEvent(event);将我们自定义的PdfPageEventHelper的子类传入进去. 这样就将event和doc绑定了. 然后我们在需要一些处理Chunk的时候, 调用chunk.setGenericTag()来添加一些text其实更多的使用方式就是在onGenericTag()中text作为key来进行区分处理.

    // 其实对应的就是pageEvent的genericTag的 最后一个参数text.
    public Chunk setGenericTag(final String text) {

本篇先讲到合理, 我们后边章节, 再继续详解其他的pageEvent事件方法.