当前位置: 首页 > article >正文

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 常见应用场景
  • 实战开始
    • ❶ 项目初始化
    • ❷ 电子签章的实现
    • ❸ 签章图片的加载与应用
    • ❹ 编写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 文件中添加相关依赖

<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 文件的签章逻辑

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 文件

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 文件

请求示例:

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

总结

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

实践建议:

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

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


在这里插入图片描述


http://www.kler.cn/news/366913.html

相关文章:

  • mac 上使用 cmake 构建包含 OpenMP 的项目
  • 等保测评:安全计算环境的详细讲解
  • 大数据-190 Elasticsearch - ELK 日志分析实战 - 配置启动 Filebeat Logstash
  • 【Jenkins】解决在Jenkins Agent节点容器内无法访问物理机的docker和docker compose的问题
  • 富格林:察觉欺诈有效追损措施
  • 批量修改YOLO格式的标注类别
  • AI大模型开发架构设计(16)——ChatGPT Code Interpreter应用场景和技术原理动手实践
  • 【Python爬虫实战】Selenium自动化网页操作入门指南
  • 数据结构------手撕链表(一)【不带头单向非循环】
  • 掌握预测的准确性——使用 VAEneu 和 CRPS 的概率方法
  • PMP–一、二、三模–分类–11.风险管理–机会风险应对策略
  • 【C++笔记】内存管理
  • 实现简道云与企业微信的自动化数据集成
  • [C#][winform]基于yolov8的道路交通事故检测系统C#源码+onnx模型+评估指标曲线+精美GUI界面
  • Java-图书管理系统
  • LeetCode105. 从前序与中序遍历序列构造二叉树(2024秋季每日一题 49)
  • 地磁传感器(学习笔记上)
  • 微信小程序文字转语音播报案例
  • 基于Java SpringBoot和Vue社区医院诊所医疗挂号管理系统设计
  • 【超大数据】数字的拆分——int128数据类型的使用方法
  • Spring Cloud微服务:构建现代应用的新基石
  • 【笔记】软件测试09——接口测试
  • 图文深入理解Oracle Total Recall
  • Ubuntu虚拟机无法启动,无U盘拯救
  • GoogleChrome和Edge浏览器闪屏问题
  • 图片懒加载