水印一般用于标注文档的版权信息、作者、机构或文档属性。与文档注释不同,水印是在页面上绘制的元素,因此不能轻易删除。因此,水印也是一种很好的防伪手段。水印分为文本水印和图片水印。以Java代码为例,我将分享通过代码向PDF文档添加文本水印的具体方法和示例代码。Freeeee用的工具是Freeee Spire.PDF for Java(免费版),感兴趣的朋友也可以试试。
程序环境IntelliJIDEA 2018 (jdk 1.8.0)
操作前先导入JAR包,请参考以下两种导入方法:
方法一:假如你用的是 maven,首先创建maven项目。然后添加以下代码配置pomen.xml 点击Import文件 Changes将 将JAR文件导入应用程序。
<repositories> <repository> <id>com.e-iceblue</id> <name>e-iceblue</name> <url>https://repo.e-iceblue.cn/repository/maven-public/</url> </repository></repositories><dependencies> <dependency> <groupId>e-iceblue</groupId> <artifactId>spire.pdf.free</artifactId> <version>5.1.0</version> </dependency></dependencies>
方法二:如果不使用 maven,则可以从此链接下载Frespirespire.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()方法将变更保存在文件中。
完整代码:
import com.spire.pdf.*;import com.spire.pdf.graphics.*; import java.awt.*; public class insertSingleTextWaterMark { publicstatic void main(String[] args) { ////创建Pdfdocument类的对象 PdfDocument pdf = new PdfDocument(); //加载PDF文档 pdf.loadFromFile("sample.pdf"); ///循环遍历 PDF 文档中的所有页面逐个添加水印 Stringtext = "机密"; PdfTrueTypeFont font = new PdfTrueTypeFont(new Font(“黑体”,Font.BOLD, 50)); floatset1 = (float) (font.measureString(text).getWidth() * Math.sqrt(2)/4); float set2= (float) (font.measureString(text).getHeight() * Math.sqrt(2)/4); for (inti = 0; i < pdf.getPages().getCount(); i++){ //获取页面 PdfPageBase page = pdf.getPages().get(i); ////设置水印文本的透明度 page.getCanvas().setTransparency(0.8f); ///设置坐标的偏移量 page.getCanvas().translateTransform(page.getCanvas().getSize().getWidth()/2- set1 - set2, page.getCanvas().getSize().getHeight()/2 + set1 - set2); ////设置水印文字的旋转角度 page.getCanvas().rotateTransform(-45); ////在页面上绘制水印 page.getCanvas().drawString(text, font, PdfBrushes.getDarkRed(), 0, 0); } //保存文档 pdf.saveToFile(result1.pdf"); }}
效果图:
平铺文本水印代码解释:
类似于添加单个水印,它还创建了一个Pdfdocument对象,并加载了PDF示例文档。然后,循环到所有页面,并在每个页面上添加水印。然后通过PdftilingBrush创建一个铺装刷,并设置其透明度。然后,平移和旋转刷子以获得所需的位置和方向,然后用刷子在每个页面上绘制水印。
完整代码:
import com.spire.pdf.*;import com.spire.pdf.graphics.*;import com.spire.pdf.htmlconverter.qt.Size; import java.awt.*;import java.awt.geom.*; public class insertTiledTextWatermark { publicstatic void main(String[] args) { ////创建Pdfdocument类的对象 PdfDocument pdf = new PdfDocument(); //加载PDF文件 pdf.loadFromFile("sample.pdf"); ///循环遍历PDF文档中的所有页面,逐个添加水印 PdfTrueTypeFontfont = new PdfTrueTypeFont(new Font(“黑体”,Font.BOLD, 20)); for (inti = 0; i < pdf.getPages().getCount(); i++){ PdfPageBase pageBase = pdf.getPages().get(i); insertTextWatermark(pageBase, font, “机密”,3, 3); } //保存文档 pdf.saveToFile(result2.pdf"); } static voidinsertTextWatermark(PdfPageBase page, PdfTrueTypeFont font, String watermark,int row, int column) { ///计算两个偏移变量值计算坐标的平移量 floatset1 = (float)(font.measureString(watermark).getWidth() * Math.sqrt(2)/4); floatset2 = (float)(font.measureString(watermark).getHeight() * Math.sqrt(2)/4); ///创建平铺画刷 PdfTilingBrush brush = new PdfTilingBrush(new Dimension((int)(page.getActualSize().getWidth()/column), (int)(page.getActualSize().getHeight()/row))); brush.getGraphics().setTransparency(0.8f); brush.getGraphics().save(); brush.getGraphics().translateTransform(brush.getSize().getWidth()/2 -set1 - set2, brush.getSize().getHeight()/2 + set1 - set2); brush.getGraphics().rotateTransform(-45); ///画水印文本,平铺画 brush.getGraphics().drawString(watermark, font, PdfBrushes.getViolet(),0, 0); brush.getGraphics().restore(); ///用平铺画画水印 page.getCanvas().drawRectangle(brush,new Rectangle(new Point(0, 0), new Dimension((int)(page.getActualSize().getWidth()),(int)(page.getActualSize().getHeight()))); }}
效果图: