开发者

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

开发者 https://www.devze.com 2025-06-28 15:02 出处:网络 作者: E-iceblue
目录一、为什么需要数字签名、水印和权限控制?二、添加数字签名:为 PDF 文件嵌入带图像的身份认证签章(1)签名文件准备(2)核心步骤概览(3)完整代码示例(可直接复制到 IDEA 编辑和使用)(4)效果预览:三、添
目录
  • 一、为什么需要数字签名、水印和权限控制?
  • 二、添加数字签名:为 PDF 文件嵌入带图像的身份认证签章
    • (1)签名文件准备
    • (2)核心步骤概览
    • (3)完整代码示例(可直接复制到 IDEA 编辑和使用)
    • (4)效果预览:
  • 三、添加文本水印:为 PDF 文档标注身份标识
    • (1)操作步骤概览
    • (2)完整代码示例(可直接复制到 IDEA 使用)
    • (3)效果预览:
  • 四、设置权限:限制 PDF 文件的打印与修改
    • (1)操作步骤概览
    • (2)完整代码示例(可直接复制到 IDEA 使用)
    • (3)效果预览:
  • 五、总结与扩展:构建更安全、专业的 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.setSignIm编程客栈ageSource(
                PdfImage.fromFile("/签名.png"));
            // 设置签名文字字体
            signature.setSignDetailsFont(
                new PdfFont(PdfFontFamily.Helvetica, 10f, PdfFontStyle.Regular));
            // 设置文档权限:禁止修改
            signature.setDocumentPermissions(PdfCertificationFlags.For编程客栈bid_Changes);
            signature.setCertificated(true); // 标记为已签名
            // 保存为新文件
            doc.saveToFile("/电子签名.pdf");
            doc.close();
        }
    }

    (4)效果预览:

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

    (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()xGZoKwSZ.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 中添加数字签名、水印与权限控制的详细过程

    (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密码";
            // 设置允许的操作权限(这里只允许打印和高质量打印js)
            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 中添加数字签名、水印与权限控制的详细过程

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

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

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

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

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

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

    0

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    关注公众号