关于java:Java-给PDF添加文本水印

39次阅读

共计 3691 个字符,预计需要花费 10 分钟才能阅读完成。

水印个别用于标注文档的版权信息、作者、所属机构或者文档属性等。不同于文本批注等,文字水印是绘制到页面中的元素,所以不能轻易被删除。因而,水印也是一种很好的防伪伎俩。水印又分为文本水印和图片水印两种。这里,以 Java 代码为例,我将分享通过代码给 PDF 文档 增加文本水印 的具体方法和示例代码。应用到的工具是 Free Spire.PDF for Java(免费版),有趣味的敌人也能够试用下。

程序环境

IntelliJ IDEA 2018 (jdk 1.8.0)
在进行操作之前先导入 JAR 包,请参考以下两种导入形式:
办法一:如果您应用的是 maven,先创立 maven 我的项目。而后通过增加以下代码来配置 pom.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,则能够从此链接下载 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() 办法将更改保留到文件中。

残缺代码:

import com.spire.pdf.*;
import com.spire.pdf.graphics.*;

import java.awt.*;

public class insertSingleTextWaterMark {public static void main(String[] args) {

        // 创立 PdfDocument 类的对象
        PdfDocument pdf = new PdfDocument();

        // 载入 PDF 文档
        pdf.loadFromFile("sample.pdf");

        // 循环遍历 PDF 文档中的所有页面以一一增加水印
        String text = "秘密";
        PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("黑体", Font.BOLD, 50));
        float set1 = (float) (font.measureString(text).getWidth() * Math.sqrt(2)/4);
        float set2 = (float) (font.measureString(text).getHeight() * Math.sqrt(2)/4);
        for (int i = 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 {public static void main(String[] args) {

        // 创立 PdfDocument 类的对象
        PdfDocument pdf = new PdfDocument();

        // 载入 PDF 文件
        pdf.loadFromFile("sample.pdf");

        // 循环遍历 PDF 文档中的所有页面以一一增加水印
        PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("黑体", Font.BOLD, 20));
        for (int i = 0; i < pdf.getPages().getCount(); i++){PdfPageBase pageBase = pdf.getPages().get(i);
            insertTextWatermark(pageBase, font, "秘密", 3, 3);
        }

        // 保存文档
        pdf.saveToFile("result2.pdf");
    }

    static void insertTextWatermark(PdfPageBase page, PdfTrueTypeFont font, String watermark, int row, int column) {

        // 计算两个偏移变量的值以用于计算坐标的平移量
        float set1 = (float)(font.measureString(watermark).getWidth() * Math.sqrt(2)/4);
        float set2 = (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()))));
    }
}

效果图

正文完
 0