Java在 PDF 中添加数字签名、水印与权限控制的详细过程

 更新时间:2025年06月09日 09:54:58   作者:E-iceblue  
通过在PDF中添加数字签名、水印以及权限控制,不仅可以防止文档被擅自修改或打印,还能提升文档的法律效力与专业性,下面给大家介绍Java在PDF中添加数字签名、水印与权限控制的详细过程,感兴趣的朋友一起看看吧

一、为什么需要数字签名、水印和权限控制?

在日常的合同管理、发票开具、文件审批等场景中,PDF 文件已经成为企业传递和保存资料的标准格式。但如果缺乏有效的保护机制,PDF 内容容易被篡改、复制或非法传播,可能会带来法律与安全风险。

通过在 PDF 中添加数字签名、水印以及权限控制,不仅可以防止文档被擅自修改或打印,还能提升文档的法律效力与专业性,帮助企业实现数字化管理的安全闭环。

二、添加数字签名:为 PDF 文件嵌入带图像的身份认证签章

在合同签署、报表确认等场景中,数字签名是一种常用且可信的认证方式。与传统的盖章或手写签名不同,数字签名依赖于加密证书,可以验证文档是否被篡改,并具备法律效力。借助 Spire.PDF for Java,我们可以创建既包含图章图像,又具备身份认证能力的可视化数字签名。

(1)签名文件准备

  • 需要一份扩展名为 .pfx 的数字证书文件(可向 CA 机构申请,也可自行生成测试证书)。
  • 准备一张签名图(如公司章或手写签名),建议使用透明背景的 PNG 。

(2)核心步骤概览

  • 读取目标 PDF 文件。
  • 载入 .pfx 证书,创建 PdfSignature 对象。
  • 设定签名在页面上的位置与尺寸。
  • 填写签名人信息并插入签名图片。
  • (可选)设置禁止修改等权限。
  • 保存为新 PDF 文件。

(3)完整代码示例(可直接复制到 IDEA 编辑和使用)

import com.spire.pdf.*;
import com.spire.pdf.graphics.*;
import com.spire.pdf.security.*;
import java.awt.*;
import java.awt.geom.*;
public class AddVisibleSignature {
    public static void main(String[] args) {
        // 创建 PDF 文档对象
        PdfDocument doc = new PdfDocument();
        // 载入要签名的 PDF 文件
        doc.loadFromFile("/示例PDF.pdf");
        // 加载证书(包含私钥)
        PdfCertificate cert = new PdfCertificate(
            "/gary.pfx", 
            "e-iceblue");
        // 创建签名对象,并指定位置和大小
        PdfSignature signature = new PdfSignature(
            doc, doc.getPages().get(0), cert, "我的签名");
        Rectangle2D rect = new Rectangle2D.Float();
        rect.setFrame(
            new Point2D.Float(
                (float) doc.getPages().get(0).getActualSize().getWidth() - 320,
                (float) doc.getPages().get(0).getActualSize().getHeight() - 140),
            new Dimension(270, 100));
        signature.setBounds(rect);
        // 设置签章显示模式:图像 + 签章详情
        signature.setGraphicMode(GraphicMode.Sign_Image_And_Sign_Detail);
        // 填写签章信息(会显示在页面上)
        signature.setNameLabel("签名:");
        signature.setName("我");
        signature.setContactInfoLabel("联系方式:");
        signature.setContactInfo("02881705109");
        signature.setDateLabel("日期:");
        signature.setDate(new java.util.Date());
        signature.setLocationInfoLabel("地址:");
        signature.setLocationInfo("成都");
        signature.setReasonLabel("原因:");
        signature.setReason("文件签署确认");
        signature.setDistinguishedNameLabel("DN:");
        signature.setDistinguishedName(
            signature.getCertificate().get_IssuerName().getName());
        // 设置签名图像(如公司印章或签字)
        signature.setSignImageSource(
            PdfImage.fromFile("/签名.png"));
        // 设置签名文字字体
        signature.setSignDetailsFont(
            new PdfFont(PdfFontFamily.Helvetica, 10f, PdfFontStyle.Regular));
        // 设置文档权限:禁止修改
        signature.setDocumentPermissions(PdfCertificationFlags.Forbid_Changes);
        signature.setCertificated(true); // 标记为已签名
        // 保存为新文件
        doc.saveToFile("/电子签名.pdf");
        doc.close();
    }
}

(4)效果预览:

(Java 在 PDF 中添加电子签名)

注意事项:

  • .pfx 证书需提前准备,可由 CA 机构颁发,也可自行生成测试用证书。
  • 签名图片支持 PNG、JPG 等常见格式。
  • 签名位置坐标以 PDF 页面左下角为原点,注意单位是磅(point)。

三、添加文本水印:为 PDF 文档标注身份标识

在企业内部资料、报表、审阅稿等文档中,添加水印是一种常见做法,既可防止文件被误用,又能在视觉上标明文档用途(如“仅供内部使用”、“样稿”、“机密”等)。相较于手工添加图层,使用程序批量插入文字水印更高效、统一。

借助 Spire.PDF for Java,我们可以在所有页面中居中插入带旋转角度和透明度的文本水印,字体、颜色、位置均可自定义。

(1)操作步骤概览

  • 读取目标 PDF 文件;
  • 创建字体对象并计算水印偏移;
  • 遍历每一页,设置透明度、旋转角度和绘图位置;
  • 绘制文本水印;
  • 保存为新 PDF 文件。

(2)完整代码示例(可直接复制到 IDEA 使用)

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("/示例PDF.pdf");
       // 遍历每一页以便插入水印
       String text = "示例文档";
       PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("FangSong", 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.getDarkGray(), 0, 0);
       }
       // 保存文档
       pdf.saveToFile("/添加文本水印1.pdf");
   }
}

(3)效果预览:

(Java 在 PDF 中添加文本水印)

温馨提示:如果只是处理简单任务或者测试 Spire.PDF,你可以尝试 Spire.PDF for Java 的免费版。它生成的文件没有水印,对于处理轻量化文件或项目很合适。

四、设置权限:限制 PDF 文件的打印与修改

在信息敏感或需要控制分发范围的场景中,仅添加签名和水印往往还不够。为了进一步保护 PDF 文件内容,我们可以通过加密和设置权限,限制用户的打印、复制、编辑等操作。

Spire.PDF for Java 支持为 PDF 添加密码,并灵活设定各类操作权限,保障文档在分发过程中的安全性与合规性。

(1)操作步骤概览

  • 读取原始 PDF 文件;
  • 设置打开密码和权限密码(可选是否设定打开密码);
  • 指定允许的操作类型(如仅允许打印);
  • 选择加密强度;
  • 保存加密后的 PDF 文件。

(2)完整代码示例(可直接复制到 IDEA 使用)

import com.spire.pdf.PdfDocument;
import com.spire.pdf.security.PdfEncryptionKeySize;
import com.spire.pdf.security.PdfPermissionsFlags;
import java.util.EnumSet;
public class ChangeSecurityPermissions {
    public static void main(String[] args) {
        // 创建 PDF 文档对象
        PdfDocument doc = new PdfDocument();
        // 载入原始 PDF 文件
        doc.loadFromFile("/示例文档.pdf");
        // 设置打开密码(留空表示无需打开密码)
        String openPsd = "";
        // 设置权限密码(修改权限需输入该密码)
        String permissionPsd = "PDF密码";
        // 设置允许的操作权限(这里只允许打印和高质量打印)
        EnumSet permissionsFlags = EnumSet.of(
            PdfPermissionsFlags.Print,
            PdfPermissionsFlags.Full_Quality_Print);
        // 加密文档,设定密码、权限和加密方式(128 位加密)
        doc.getSecurity().encrypt(
            openPsd, permissionPsd, permissionsFlags, PdfEncryptionKeySize.Key_128_Bit);
        // 保存加密后的 PDF 文件
        doc.saveToFile("/添加安全权限.pdf");
    }
}

(3)效果预览:

(Java 在 PDF 中添加权限限制)

五、总结与扩展:构建更安全、专业的 PDF 工作流

通过前文的操作,我们已经掌握了在 Java 中使用 Spire.PDF 添加数字签名、水印和权限控制的完整流程。这三项功能常用于企业日常的电子合同、内部报表、政策文档等关键文件处理场景,帮助实现:

  • 签名认证:保证文档来源可信、内容未被篡改;
  • 视觉提示:通过水印强化保密意识,防止误用或泄漏;
  • 操作权限管理:限制打印、复制或编辑,防止内容被随意篡改或外泄。

如果你在使用 Spire.PDF for Java 的过程中遇到问题,或有定制化的开发需求,欢迎留言交流。

到此这篇关于Java在 PDF 中添加数字签名、水印与权限控制的文章就介绍到这了,更多相关java pdf数字签名内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 手把手教你如何搭建SpringBoot+Vue前后端分离

    手把手教你如何搭建SpringBoot+Vue前后端分离

    这篇文章主要介绍了手把手教你如何搭建SpringBoot+Vue前后端分离,前后端分离是目前开发中常用的开发模式,达成充分解耦,需要的朋友可以参考下
    2023-03-03
  • @Value如何设置默认值

    @Value如何设置默认值

    这篇文章主要介绍了@Value如何设置默认值问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • Spring cloud alibaba之Gateway网关功能特征详解

    Spring cloud alibaba之Gateway网关功能特征详解

    spring cloud gateway是spring cloud推出的第二代网关,是由WebFlux+Netty+Reactor实现的响应式的API网关,它不能在传统的servlet容器中工作,也不能构建成war包,接下来通过本文给大家分享Spring cloud alibaba--Gateway网关,需要的朋友可以参考下
    2021-08-08
  • SpringBoot使用Nacos动态配置数据源的方法

    SpringBoot使用Nacos动态配置数据源的方法

    这篇文章主要介绍了SpringBoot使用Nacos动态配置数据源的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • springboot 监控管理模块搭建的方法

    springboot 监控管理模块搭建的方法

    本篇文章主要介绍了springboot 监控管理模块搭建的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • Java实现一键获取Mysql所有表字段设计和建表语句的工具类

    Java实现一键获取Mysql所有表字段设计和建表语句的工具类

    这篇文章主要为大家详细介绍了如何利用Java编写一个工具类,可以实现一键获取Mysql所有表字段设计和建表语句,感兴趣的小伙伴可以了解一下
    2023-05-05
  • 解决SpringBoot使用@Value获取不到yaml中配置值的问题

    解决SpringBoot使用@Value获取不到yaml中配置值的问题

    在最近的开发中遇到一个问题,使用@Value获取yml文件中配置的属性时始终获取不到值,所以本文给大家详细介绍了SpringBoot使用@Value获取不到yaml中值的问题分析及解决方法,需要的朋友可以参考下
    2024-01-01
  • SpringBoot yml配置敏感信息加密的实现

    SpringBoot yml配置敏感信息加密的实现

    本文主要介绍了SpringBoot yml配置敏感信息加密的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-08-08
  • Mybatis操作Clickhouse数组的最佳实践分享

    Mybatis操作Clickhouse数组的最佳实践分享

    ClickHouse 的 Array(T) 数据类型支持任意有效数据类型作为元素,包括基本类型、嵌套数组和可空类型,本文给大家分享了Mybatis操作Clickhouse数组的最佳实践,需要的朋友可以参考下
    2025-09-09
  • 深入理解Java设计模式之装饰模式

    深入理解Java设计模式之装饰模式

    这篇文章主要介绍了JAVA设计模式之装饰模式的的相关资料,文中示例代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下
    2021-11-11

最新评论