Spring Boot 集成 PDFBox 实现PDF电子签章的简单应用

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~

🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志

🎐 个人CSND主页------Micro麦可乐的博客

🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战

🌺《RabbitMQ》专栏主要介绍使用JAVA开发RabbitMQ的系列教程,从基础知识到项目实战

🌸《设计模式》专栏以实际的生活场景为案例进行讲解,让大家对设计模式有一个更清晰的理解

💕《Jenkins实战》专栏主要介绍Jenkins+Docker的实战教程,让你快速掌握项目CI/CD,是2024年最新的实战教程

🌞《Spring Boot》专栏主要介绍我们日常工作项目中经常应用到的功能以及技巧,代码样例完整

如果文章能够给大家带来一定的帮助!欢迎关注、评论互动~

Spring Boot 集成 PDFBox 实现PDF电子签章

  • 前言
  • 概述
    • [PDFBox 的核心功能](#PDFBox 的核心功能)
    • [PDFBox 常见应用场景](#PDFBox 常见应用场景)
  • 实战开始
    • [❶ 项目初始化](#❶ 项目初始化)
    • [❷ 电子签章的实现](#❷ 电子签章的实现)
    • [❸ 签章图片的加载与应用](#❸ 签章图片的加载与应用)
    • [❹ 编写Controller实现PDF签章](#❹ 编写Controller实现PDF签章)
    • [❺ 测试与运行](#❺ 测试与运行)
  • 总结

前言

在前面的Spring Boot专栏中,博主写了一篇【Spring Boot集成OpenPDF和Freemarker实现PDF导出功能并附水印】 有关于PDF导出的文章,有小伙伴私信问我,公司需要做电子签章的功能,是否有其它工具推荐?答案是肯定的!

本篇文章我们就介绍另外一个操作PDF的工具 PDFBox, PDFBox 是一个强大的 Java PDF 库,支持 PDF 文档的创建、编辑和签章等操作。

概述


Apache PDFBox 是一个开源的 Java PDF 库,用于操作 PDF 文档。它支持创建、编辑、渲染和签名 PDF 文件,并且可以将 PDF 文件解析为文本或图像。PDFBox 的灵活性使其成为处理 PDF 文档的强大工具,无论是用于生成报告、解析数据,还是用于实现文档的数字签名功能。它也是 Java 开发者在处理 PDF 文件时最常使用的库之一

PDFBox 的核心功能

  • 创建 PDF 文件: PDFBox 提供了丰富的 API,可以动态生成包含文本、图像、表格等内容的 PDF 文件。

  • 读取和编辑 PDF 文件: PDFBox 可以加载现有的 PDF 文档,并对其进行修改,如插入文本、添加图片或修改已有的内容。

  • 渲染 PDF 文档: PDFBox 可以将 PDF 文件转换为图片,从而实现 PDF 的渲染,支持多页的 PDF 文档转换。

  • 解析 PDF 文档: PDFBox 支持从 PDF 文件中提取文本内容、图像及其他资源。通过解析功能,可以将 PDF 文档中的文本提取出来,便于数据处理和分析。

  • 签名 PDF 文档: PDFBox 支持为 PDF 文件添加电子签章和数字签名,确保文档的真实性和不可篡改性。

  • 表单处理: PDFBox 支持处理 PDF 表单字段,可以读取、填写和修改 PDF 文件中的表单数据。

PDFBox 常见应用场景

  • PDF 文档生成:生成包含文本、表格、图片等内容的 PDF 文档,常用于生成发票、报表、合同等。

  • PPDF 文档解析:将 PDF 文件中的内容提取出来,用于数据分析、文本挖掘等场景。

  • 数字签名与电子签章:为重要的 PDF 文档添加电子签章或数字签名,保证文档的真实性和完整性。

  • PDF 文档渲染:将 PDF 文件转换为图像进行显示,或者将 PDF 文件渲染成网页可展示的格式。

  • PDF 表单处理:处理带有表单的 PDF 文档,可以填充表单或读取用户填写的内容。

实战开始

本文主要介绍PDFBox 实现电子签章的功能,具体其他更多功能可以查阅GitHub项目,地址:https://github.com/apache/pdfbox

或者小伙伴需要PDFBox实现其它功能的可以留言,博主将根据小伙伴们的问题,再单独做一篇讲解!

❶ 项目初始化

首先,创建一个新的 Spring Boot 项目,在在 pom.xml 文件中添加相关依赖

xml 复制代码
<dependencies>
    <!-- Spring Boot Starter Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- Apache PDFBox -->
    <dependency>
        <groupId>org.apache.pdfbox</groupId>
        <artifactId>pdfbox</artifactId>
        <version>2.0.27</version>
    </dependency>
</dependencies>

❷ 电子签章的实现

创建一个 PdfSignatureService 类,用于处理 PDF 文件的签章逻辑

java 复制代码
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import org.springframework.stereotype.Service;

import java.io.File;
import java.io.IOException;

@Service
public class PdfSignatureService {

    public void signPdf(String inputPdfPath, String outputPdfPath, String signatureImagePath) throws IOException {
        // 加载要签章的 PDF 文档
        try (PDDocument document = PDDocument.load(new File(inputPdfPath))) {

            // 获取第一页,假设签章放在第一页
            PDPage page = document.getPage(0);

            // 加载签章图片
            PDImageXObject signatureImage = PDImageXObject.createFromFile(signatureImagePath, document);

            // 创建一个内容流对象,用于在页面上绘制内容
            try (PDPageContentStream contentStream = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, true)) {

                // 设置签章图片的位置和大小(假设在左下角签章)
                float imageX = 50;
                float imageY = 50;
                float imageWidth = 150;
                float imageHeight = 50;

                // 绘制签章图片
                contentStream.drawImage(signatureImage, imageX, imageY, imageWidth, imageHeight);
            }

            // 保存签章后的文档
            document.save(outputPdfPath);
        }
    }
}

❸ 签章图片的加载与应用

在上面的代码中,我们使用了 PDImageXObject 来加载签章图片。我们通过 PDPageContentStream 在 PDF 的指定位置绘制签章图片。具体的位置可以根据需求调整。

  • imageXimageY 用于设置签章图片在 PDF 页面上的 X 和 Y 坐标。
  • imageWidthimageHeight 用于设置签章图片的宽度和高度。

❹ 编写Controller实现PDF签章

创建一个 PdfController 控制器,提供接口供用户上传 PDF 文件和签章图片,并返回签章后的 PDF 文件

java 复制代码
import com.example.pdf.service.PdfSignatureService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;

@RestController
public class PdfController {

    @Autowired
    private PdfSignatureService pdfSignatureService;

    @PostMapping("/sign-pdf")
    public ResponseEntity<byte[]> signPdf(
            @RequestParam("pdfFile") MultipartFile pdfFile,
            @RequestParam("signatureImage") MultipartFile signatureImage) throws IOException {

        // 临时保存上传的 PDF 文件和签章图片
        String inputPdfPath = "temp_input.pdf";
        String signatureImagePath = "temp_signature.png";
        String outputPdfPath = "signed_output.pdf";

        pdfFile.transferTo(new File(inputPdfPath));
        signatureImage.transferTo(new File(signatureImagePath));

        // 执行签章操作
        pdfSignatureService.signPdf(inputPdfPath, outputPdfPath, signatureImagePath);

        // 读取签章后的 PDF 文件并返回
        File signedPdf = new File(outputPdfPath);
        byte[] pdfBytes = java.nio.file.Files.readAllBytes(signedPdf.toPath());

        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_PDF);
        headers.setContentDispositionFormData("attachment", "signed_output.pdf");

        return new ResponseEntity<>(pdfBytes, headers, HttpStatus.OK);
    }
}

❺ 测试与运行

启动 Spring Boot 应用程序,使用调试工具PostMan、ApiFox等工具,发送 POST 请求到 /sign-pdf,并上传PDF文件签章图片,服务器会返回签章后的 PDF 文件

请求示例:

bash 复制代码
POST http://localhost:8080/sign-pdf
Content-Type: multipart/form-data
pdfFile: [选择要签章的PDF文件]
signatureImage: [选择签章图片]

总结

通过 Spring Boot 集成 PDFBox 实现电子签章的过程非常简单,本文演示了如何将签章图片添加到 PDF 文件中。PDFBox 提供了灵活的 API,可以用于各种 PDF 处理任务,包括创建、编辑、解析和签章等。开发者可以根据需求调整签章的位置、大小,甚至在多个页面上添加签章。

实践建议:

  • 对于安全要求较高的场景,可以考虑结合数字证书实现更加安全的数字签名。
  • 注意 PDF 文件的兼容性,使用 PDFBox处理时要确保生成的文件符合目标规范。

如果本文对您有所帮助,希望 一键三连 给博主一点点鼓励,如果您有任何疑问或建议,请随时留言讨论!


相关推荐
尘浮生1 小时前
Java项目实战II基于Spring Boot的火锅店管理系统设计与实现(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·后端·微信小程序·旅游
码农白衣2 小时前
后端Java学习:springboot之文件上传(阿里云OSS存储)
spring boot·学习·阿里云
码农爱java2 小时前
Kafka 客户端工具使用分享【offsetexplorer】
spring boot·分布式·微服务·中间件·kafka·mq·offset explorer
苹果醋32 小时前
springboot-springboot官方文档架构
java·运维·spring boot·mysql·nginx
Southern Wind2 小时前
H5页面在线预览pdf
javascript·pdf
waterHBO3 小时前
python 制作 发货单 (生成 html, pdf)
python·pdf·html
马剑威(威哥爱编程)3 小时前
Java如何实现PDF转高质量图片
java·开发语言·pdf·1024程序员节
CoderJia程序员甲4 小时前
重学SpringBoot3-Spring WebFlux之HttpHandler和HttpServer
java·spring boot·reactor·1024程序员节
菜菜-plus5 小时前
微服务技术,SpringCloudAlibaba,Redis,RocketMQ,Docker,分库分表
java·spring boot·redis·spring cloud·docker·微服务·java-rocketmq
除了菜一无所有!6 小时前
基于SpringBoot技术的教务管理
java·spring boot·后端