😄 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 的指定位置绘制签章图片。具体的位置可以根据需求调整。
imageX
和imageY
用于设置签章图片在 PDF 页面上的 X 和 Y 坐标。imageWidth
和imageHeight
用于设置签章图片的宽度和高度。
❹ 编写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处理时要确保生成的文件符合目标规范。
如果本文对您有所帮助,希望 一键三连 给博主一点点鼓励,如果您有任何疑问或建议,请随时留言讨论!