itext5的水印方案许多年前掘金已有文章介绍(JAVA itextpdf 为PDF添加多种水印),但itext7已经问世许久,至今网络上还很难找到介绍这个巨大变革后的itext7相关文章,从包、类、方法到参数、流程都有了许多的不同,在开源的java库中,很难找到比itext对PDF操作更精细的库,唯一值得比较的pdfbox,在性能上也是落后的,所以其实选择空间很有限。
从5到7的升级并没有让这个库变得简单,许多地方的繁琐不亚于从前,且更不易控制了。即便如此,升级也是必须的,itext5隐藏的问题也非常的多,而且也停止更新很久了,安全漏洞也不会再更新。
首先就是包的引入,相信现在大多数人已经从maven转为了gradle,下面是gradle的dependencies:
dependencies {
implementation 'com.itextpdf:kernel:7.2.5'
implementation 'com.itextpdf:layout:7.2.5'
}
复制代码
参数设定
以前的itext5文章中第一个出现的类PdfStamper
在新版中已经不存在了,现在是围绕PdfDocument
来操作基础文件的。同时以前作为水印对象的PdfContentByte
也已不在,现在是使用Canvas
进行操作,下面来看一下基础的一些参数设置:
//水印文本
String text = "Computer Engineering";
//文字大小
int size = 32;
//出入的文档
PdfDocument pdfDoc = new PdfDocument(new PdfReader("EC0066761.pdf"), new PdfWriter("output.pdf"));
//水印旋转的角度
float angle = (float) Math.toRadians(35);
//字体
PdfFont font = PdfFontFactory.createFont(FontProgramFactory.createFont(StandardFonts.HELVETICA));
//段落
Paragraph paragraph = new Paragraph(text)
.setFont(font).setFontSize(size);
//图形状态参数
PdfExtGState gs = new PdfExtGState();
//水印自身透明度的设置
gs.setFillOpacity(0.2f);
//页面大小
PageSize pageSize = pdfDoc.getDefaultPageSize();
复制代码
对比以前,PdfDocument
的初始化看上去简单了些,两个参数看上去比较干净。不过紧接着就是一个坑,下面的旋转角度请注意,用的是弧度制,所以要用角度制就必须用Math.toRadians
转换一下。在其他地方可能也有这种问题,曾经的版本使用角度制,而新版改用了弧度制。用于扩展设定的PdfGState
改为了PdfExtGState
,这个改变主要是新版支持了ISO-320001标准,但移除了一些的方法,例如setOverPrintStroking(boolean op)
,toPdf(PdfWriter writer,OutputStream os)
,不过影响不大。
基本的参数设定完毕,接下来就是一个分叉口,是生成什么类型的水印,单个的居中水印,还是满屏的水印,无论是哪种,以上的参数设置都是需要的,下面先看一下单个水印:
单水印
使用下面这