小技巧分享:使用itext7在PDF中实现多种文字水印效果

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),不过影响不大。

基本的参数设定完毕,接下来就是一个分叉口,是生成什么类型的水印,单个的居中水印,还是满屏的水印,无论是哪种,以上的参数设置都是需要的,下面先看一下单个水印:

单水印

使用下面这

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是一个使用iText7将HTML转换为PDF并添加页数和水印的简单示例: ```java import com.itextpdf.html2pdf.ConverterProperties; import com.itextpdf.html2pdf.HtmlConverter; import com.itextpdf.kernel.colors.ColorConstants; import com.itextpdf.kernel.font.PdfFont; import com.itextpdf.kernel.font.PdfFontFactory; import com.itextpdf.kernel.geom.Rectangle; import com.itextpdf.kernel.pdf.PdfDocument; import com.itextpdf.kernel.pdf.PdfPage; import com.itextpdf.kernel.pdf.PdfWriter; import com.itextpdf.kernel.pdf.canvas.PdfCanvas; import com.itextpdf.kernel.pdf.xobject.PdfFormXObject; import java.io.File; import java.io.IOException; public class HtmlToPdfConverter { public static void main(String[] args) throws IOException { String html = "<html><body><h1>Hello, World!</h1></body></html>"; String pdfPath = "output.pdf"; PdfWriter writer = new PdfWriter(pdfPath); PdfDocument pdfDoc = new PdfDocument(writer); pdfDoc.setDefaultPageSize(new Rectangle(PageSize.A4.getLeft(), PageSize.A4.getBottom(), PageSize.A4.getRight(), PageSize.A4.getTop())); PdfFont font = PdfFontFactory.createFont("path/to/font.ttf", PdfEncodings.IDENTITY_H, true); PdfCanvas canvas = new PdfCanvas(pdfDoc.addNewPage()); canvas.beginText() .setFontAndSize(font, 12) .moveText(pdfDoc.getDefaultPageSize().getRight() - 72, 36) .showText("Page 1") .endText(); ConverterProperties props = new ConverterProperties(); HtmlConverter.convertToPdf(html, pdfDoc, props); int n = pdfDoc.getNumberOfPages(); for (int i = 2; i <= n; i++) { PdfPage page = pdfDoc.getPage(i); canvas = new PdfCanvas(page); canvas.beginText() .setFontAndSize(font, 12) .moveText(pdfDoc.getDefaultPageSize().getRight() - 72, 36) .showText(String.format("Page %d", i)) .endText(); } PdfFormXObject watermark = new PdfFormXObject(new Rectangle(0, 0, 100, 100)); canvas = new PdfCanvas(watermark, pdfDoc); canvas.setFillColor(ColorConstants.LIGHT_GRAY); canvas.setStrokeColor(ColorConstants.LIGHT_GRAY); canvas.rectangle(0, 0, 100, 100); canvas.fill(); canvas.beginText() .setFontAndSize(font, 24) .moveText(20, 50) .showText("Confidential") .endText(); for (int i = 1; i <= n; i++) { PdfPage page = pdfDoc.getPage(i); canvas = new PdfCanvas(page); canvas.addXObject(watermark, 0, 0); } pdfDoc.close(); } } ``` 在上面的示例,我们首先创建一个PdfWriter和PdfDocument对象,然后设置默认页面大小为A4纸张大小。接下来,我们添加第一页,并在页面右下角添加“Page 1”文本。然后使用iText7的HtmlConverter将HTML字符串转换为PDF文档。使用循环遍历文档的每个页面,并在每个页面的右下角添加页码。最后,我们创建一个PdfFormXObject对象,添加水印文本“Confidential”,并将其添加到每个页面。 请注意,上面的示例的代码片段是未经测试的,仅供参考。您需要根据您自己的需求进行修改和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值