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数字签名内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • spring boot启动后直接关闭了的问题解决

    spring boot启动后直接关闭了的问题解决

    本文主要介绍了spring boot启动后直接关闭了的问题解决,SpringBoot项目启动后自动关闭的原因是未引入web依赖,导致以普通Java项目运行,下面就来介绍一下解决方法,感兴趣的可以了解一下
    2025-02-02
  • mybatis使用foreach标签进行嵌套插入

    mybatis使用foreach标签进行嵌套插入

    数据库插入操作常见于多层架构设计中,本文提供了一个具体的实现方案,涉及三层实体类结构,第一层实体类负责基本数据结构的定义,第二层和第三层实体类则提供更详细的业务逻辑处理,同时,文章还介绍了相应的mapper接口和配置文件设置
    2024-09-09
  • Java的web开发中SSH框架的协作处理应用笔记

    Java的web开发中SSH框架的协作处理应用笔记

    这篇文章主要介绍了Java的web开发中SSH框架的协作处理应用笔记,SSH是指Struts和Spring以及Hibernate的框架搭配,需要的朋友可以参考下
    2015-12-12
  • Java实现优雅停止线程的有效方法详解

    Java实现优雅停止线程的有效方法详解

    这篇文章主要为大家详细如何安全有效停止 Java 线程的,确保多线程应用程序平稳运行并实现最佳资源管理,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-12-12
  • 基于Java class对象说明、Java 静态变量声明和赋值说明(详解)

    基于Java class对象说明、Java 静态变量声明和赋值说明(详解)

    下面小编就为大家带来一篇基于Java class对象说明、Java 静态变量声明和赋值说明(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • java中 IO 常用IO操作类继承结构分析

    java中 IO 常用IO操作类继承结构分析

    本篇文章小编为大家介绍,java中 IO 常用IO操作类继承结构分析。需要的朋友参考下
    2013-04-04
  • 详解Java中NullPointerException异常的原因详解以及解决方法

    详解Java中NullPointerException异常的原因详解以及解决方法

    这篇文章主要介绍了详解Java中NullPointerException异常的原因详解以及解决方法。文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • 浅谈Java 将图片打包到jar中的路径问题

    浅谈Java 将图片打包到jar中的路径问题

    下面小编就为大家分享一篇浅谈Java 将图片打包到jar中的路径问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-02-02
  • java Zookeeper简述

    java Zookeeper简述

    ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。下面通过本文给大家分享java 中 zookeeper简单使用,需要的朋友参考下吧
    2021-09-09
  • 深入理解Java中的HashMap的实现机制

    深入理解Java中的HashMap的实现机制

    这篇文章主要介绍了深入理解Java中的HashMap的实现机制,同时也有助于理解Java中对于哈希函数的相关处理方式,需要的朋友可以参考下
    2015-07-07

最新评论