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

210 阅读2分钟

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

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

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

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

一. 前言

你上班了吗? 上山打工(虎)

今天是初七, 也是法定上班日. 星期一, 我们终于迎来了安全的上班. 疫情后的第一个功能齐全的过年终于圆满结束. 你亲戚肯定走好了吧. 那就开始长达一年的辛苦工作吧.

此次更文也已经过半, 还有10天就挑战成功第四关. 也在这里与其他更友一起共勉. 加油.

二.正文.

继续详解其他的事件方法的使用

首先补充一下上篇中提到的doc.newPage(), 当我们添加一个空白页时, 需要一些操作才可以添加好一个空白页

// 第一页
document.add(new Paragraph("This page will NOT be followed by a blank page!"));
// 这两个添加不了新页.
document.newPage();
document.newPage();
// 第二页
document.add(new Paragraph("This page will be followed by a blank page!"));
// 第三页
document.newPage();
// 当调用setPageEmpty 并传入 false, 才可添加成功一个空页
writer.setPageEmpty(false);
// 第四页
document.newPage();
document.add(new Paragraph("The previous page was a blank page!"));

接下来我们就学习剩下的这几个方法的使用. 实现页眉页脚和页码的实现.

public void onOpenDocument(PdfWriter writer, Document document); 
public void onStartPage(PdfWriter writer, Document document); 
public void onEndPage(PdfWriter writer, Document document); 
public void onCloseDocument(PdfWriter writer, Document document);

下边即是添加页眉页脚和页码格式为 'page %d'的示例.

public class HeaderFooterEventHelper extends PdfPageEventHelper {
   // 页头为一个图片
   private Image header;
   private int pagenumber = 1;
   
   @Override
   public void onStartPage(PdfWriter writer, Document document) {
      // 设置为幻灯片 溶解方式的过度
      writer.setTransition(new PdfTransition(PdfTransition.DISSOLVE, 3));
      // 设置过渡间隔为5秒
      writer.setDuration(5);
   }
   
   @Override
   public void onOpenDocument(PdfWriter writer, Document doc) {
      try {
         // 加载资源中的图片. 并设置相关属性. 
         ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
         Resource[] resources = resourcePatternResolver.getResources(ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + "/pdf/header/pageHeader.png");
         Image pageHeader = Image.getInstance(resources[0].getURL());
         pageHeader.setBackgroundColor(BaseColor.WHITE);
         pageHeader.setOriginalType(Image.ORIGINAL_PNG);
         pageHeader.setTransparency(new int[]{3});
         header = pageHeader;
      } catch (BadElementException | IOException e) {
         e.printStackTrace();
      }
   }
   
   @Override
   public void onEndPage(PdfWriter writer, Document document) {
      // 设置页码
      Rectangle rect = writer.getBoxSize(HeaderFooterEventHelper.RECTANGLE_DEFAULT);
      ColumnText.showTextAligned(writer.getDirectContent(),
            Element.ALIGN_CENTER, new Phrase(
                  String.format("page %d", pagenumber)),
            (rect.getLeft() + rect.getRight()) / 2,
            rect.getBottom() - 18, 0);
      // 页头使用table来实现. 方便格式化相关内容.
      PdfPTable headerTable = new PdfPTable(new float[]{1F});
      headerTable.setSpacingBefore(5F);
      headerTable.setTotalWidth(PageSize.A4.getWidth() - 64);
      headerTable.getDefaultCell().setFixedHeight(40F);
      headerTable.setWidthPercentage(100F);
      headerTable.getDefaultCell().setBorder(Rectangle.NO_BORDER);
      headerTable.getDefaultCell().setHorizontalAlignment(
            Element.ALIGN_CENTER);
      PdfPCell headerCell = new PdfPCell();
      headerCell.addElement(header);
      headerCell.setBorder(Rectangle.NO_BORDER);
      headerCell.setHorizontalAlignment(Element.ALIGN_CENTER);
      headerTable.addCell(headerCell);
      // 写入到directContent中. 
      headerTable.writeSelectedRows(0, -1,
            32, PageSize.A4.getHeight() - 10, writer.getDirectContent());
   }

}

这篇基本就完成了我们这一章节的学习, 我们这一章主要学习了各个事件的设计和使用, 并都做了相关实例的分析. 大家可以多尝试一些, 因为这些关键节点的事件处理非常适合我们扩展, 希望大家可以运用到我们实际的开发当中. 但是一定要注重合理抽象, 切莫抽象过度, 造成扭曲.

下一章节我们主要学习处理已有Pdf文件的处理.