「这是我参与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文件的处理.