水印一般用于标注文档的版权信息、作者、所属机构或者文档属性等。与文档批注等不同,水印是绘制到页面中的元素,所以不能轻易被删除。因此,水印也是一种很好的防伪手段。水印又分为文本水印和图片水印两种。这里,以Java代码为例,我将分享通过代码给PDF文档添加文本水印的具体方法和示例代码。使用到的工具是Free Spire.PDF for Java(免费版),有兴趣的朋友也可以试用下。
程序环境
IntelliJ IDEA 2018 (jdk 1.8.0) 在进行操作之前先导入JAR包,请参考以下两种导入方式: 方法一:如果您使用的是 maven,先创建maven项目。然后通过添加以下代码来配置pom.xml 文件,再点击Import Changes将 JAR文件导入到应用程序中。
1 <repositories> 2 <repository> 3 <id>com.e-iceblue</id> 4 <name>e-iceblue</name> 5 <url>https://repo.e-iceblue.cn/repository/maven-public/</url> 6 </repository> 7</repositories> 8<dependencies> 9 <dependency> 10 <groupId>e-iceblue</groupId> 11 <artifactId>spire.pdf.free</artifactId> 12 <version>5.1.0</version> 13 </dependency> 14</dependencies>
方法二:如果您没有使用 maven,则可以从此链接下载Free Spire.PDF for Java,找到lib文件夹下的Spire.Pdf.jar并进行解压;然后在IDEA中创建一个新项目,依次点击“文件”(File),“项目结构”(Project Structure),“组件”(Modules),“依赖项”(Dependencies),再点击右方绿色“+”下的第一个选项“JAR文件或路径”(JARs or Directories),找到解压后的Spire.Pdf.jar 文件,点击确认,将其导入到项目中。
单个文本水印
代码介绍:
首先,创建一个PdfDocument类的对象并加载PDF示例文档。然后,循环遍历所有页面,并在每个页面上添加水印。设置了水印文字透明度,坐标偏移量和旋转角度。通过调用translateTransform()方法和rotateTransform()方法对水印进行位置和旋转调整,然后将其绘制到该页面上。最后,使用saveToFile()方法将更改保存到文件中。
完整代码:
1 import com.spire.pdf.*; 2import com.spire.pdf.graphics.*; 3 4import java.awt.*; 5 6public class insertSingleTextWaterMark { 7 public static void main(String[] args) { 8 9 //创建PdfDocument类的对象 10 PdfDocument pdf = new PdfDocument(); 11 12 //载入PDF文档 13 pdf.loadFromFile("sample.pdf"); 14 15 //循环遍历 PDF 文档中的所有页面以逐个添加水印 16 String text = "机密"; 17 PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("黑体", Font.BOLD, 50)); 18 float set1 = (float) (font.measureString(text).getWidth() * Math.sqrt(2)/4); 19 float set2 = (float) (font.measureString(text).getHeight() * Math.sqrt(2)/4); 20 for (int i = 0; i < pdf.getPages().getCount(); i++){ 21 //获取一个页面 22 PdfPageBase page = pdf.getPages().get(i); 23 //设置水印文字的透明度 24 page.getCanvas().setTransparency(0.8f); 25 //设置坐标的偏移量 26 page.getCanvas().translateTransform(page.getCanvas().getSize().getWidth()/2 - set1 - set2, page.getCanvas().getSize().getHeight()/2 + set1 - set2); 27 //设置水印文字的旋转角度 28 page.getCanvas().rotateTransform(-45); 29 //将水印绘制在该页面上 30 page.getCanvas().drawString(text, font, PdfBrushes.getDarkRed(), 0, 0); 31 } 32 33 //保存文档 34 pdf.saveToFile("result1.pdf"); 35 } 36}
示例图

平铺文本水印
代码解释:
与添加单个水印类似,也是创建一个PdfDocument类的对象并加载PDF示例文档。然后,循环遍历所有页面,并在每个页面上添加水印。然后通过PdfTilingBrush类创建一个平铺画刷,并设置其透明度。然后,对画刷进行平移和旋转以获得想要的位置和方向,然后再使用该画刷将水印绘制到每一页中。
完整代码:
1 import com.spire.pdf.*; 2import com.spire.pdf.graphics.*; 3import com.spire.pdf.htmlconverter.qt.Size; 4 5import java.awt.*; 6import java.awt.geom.*; 7 8 9public class insertTiledTextWatermark { 10 public static void main(String[] args) { 11 12 //创建PdfDocument类的对象 13 PdfDocument pdf = new PdfDocument(); 14 15 //载入PDF文件 16 pdf.loadFromFile("sample.pdf"); 17 18 //循环遍历PDF文档中的所有页面以逐个添加水印 19 PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("黑体", Font.BOLD, 20)); 20 for (int i = 0; i < pdf.getPages().getCount(); i++){ 21 PdfPageBase pageBase = pdf.getPages().get(i); 22 insertTextWatermark(pageBase, font, "机密", 3, 3); 23 } 24 25 //保存文档 26 pdf.saveToFile("result2.pdf"); 27 } 28 29 static void insertTextWatermark(PdfPageBase page, PdfTrueTypeFont font, String watermark, int row, int column) { 30 31 //计算两个偏移变量的值以用于计算坐标的平移量 32 float set1 = (float)(font.measureString(watermark).getWidth() * Math.sqrt(2)/4); 33 float set2 = (float)(font.measureString(watermark).getHeight() * Math.sqrt(2)/4); 34 35 //创建一个平铺画刷 36 PdfTilingBrush brush = new PdfTilingBrush(new Dimension((int) (page.getActualSize().getWidth()/column), (int) (page.getActualSize().getHeight()/row))); 37 brush.getGraphics().setTransparency(0.8f); 38 brush.getGraphics().save(); 39 brush.getGraphics().translateTransform(brush.getSize().getWidth()/2 - set1 - set2, brush.getSize().getHeight()/2 + set1 - set2); 40 brush.getGraphics().rotateTransform(-45); 41 42 //绘制水印文本到平铺画刷 43 brush.getGraphics().drawString(watermark, font, PdfBrushes.getViolet(), 0, 0); 44 brush.getGraphics().restore(); 45 46 //使用该平铺画刷绘制水印 47 page.getCanvas().drawRectangle(brush, new Rectangle(new Point(0, 0), new Dimension((int)(page.getActualSize().getWidth()), (int)(page.getActualSize().getHeight())))); 48 } 49}
示例图

