😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~
🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志
🎐 个人CSND主页——Micro麦可乐的博客
🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战
🌺《RabbitMQ》专栏主要介绍使用JAVA开发RabbitMQ的系列教程,从基础知识到项目实战
🌸《设计模式》专栏以实际的生活场景为案例进行讲解,让大家对设计模式有一个更清晰的理解
💕《Jenkins实战》专栏主要介绍Jenkins+Docker的实战教程,让你快速掌握项目CI/CD,是2024年最新的实战教程
🌞《Spring Boot》专栏主要介绍我们日常工作项目中经常应用到的功能以及技巧,代码样例完整
如果文章能够给大家带来一定的帮助!欢迎关注、评论互动~
Spring Boot 集成 PDFBox 实现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 文件的签章逻辑
importorg.apache.pdfbox.pdmodel.PDDocument;importorg.apache.pdfbox.pdmodel.PDPage;importorg.apache.pdfbox.pdmodel.PDPageContentStream;importorg.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;importorg.springframework.stereotype.Service;importjava.io.File;importjava.io.IOException;@ServicepublicclassPdfSignatureService{publicvoidsignPdf(String inputPdfPath,String outputPdfPath,String signatureImagePath)throwsIOException{// 加载要签章的 PDF 文档try(PDDocument document =PDDocument.load(newFile(inputPdfPath))){// 获取第一页,假设签章放在第一页PDPage page = document.getPage(0);// 加载签章图片PDImageXObject signatureImage =PDImageXObject.createFromFile(signatureImagePath, document);// 创建一个内容流对象,用于在页面上绘制内容try(PDPageContentStream contentStream =newPDPageContentStream(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 文件
importcom.example.pdf.service.PdfSignatureService;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.http.HttpHeaders;importorg.springframework.http.HttpStatus;importorg.springframework.http.MediaType;importorg.springframework.http.ResponseEntity;importorg.springframework.web.bind.annotation.PostMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.RestController;importorg.springframework.web.multipart.MultipartFile;importjava.io.File;importjava.io.IOException;@RestControllerpublicclassPdfController{@AutowiredprivatePdfSignatureService pdfSignatureService;@PostMapping("/sign-pdf")publicResponseEntity<byte[]>signPdf(@RequestParam("pdfFile")MultipartFile pdfFile,@RequestParam("signatureImage")MultipartFile signatureImage)throwsIOException{// 临时保存上传的 PDF 文件和签章图片String inputPdfPath ="temp_input.pdf";String signatureImagePath ="temp_signature.png";String outputPdfPath ="signed_output.pdf";
pdfFile.transferTo(newFile(inputPdfPath));
signatureImage.transferTo(newFile(signatureImagePath));// 执行签章操作
pdfSignatureService.signPdf(inputPdfPath, outputPdfPath, signatureImagePath);// 读取签章后的 PDF 文件并返回File signedPdf =newFile(outputPdfPath);byte[] pdfBytes =java.nio.file.Files.readAllBytes(signedPdf.toPath());HttpHeaders headers =newHttpHeaders();
headers.setContentType(MediaType.APPLICATION_PDF);
headers.setContentDispositionFormData("attachment","signed_output.pdf");returnnewResponseEntity<>(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处理时要确保生成的文件符合目标规范。
如果本文对您有所帮助,希望 一键三连 给博主一点点鼓励,如果您有任何疑问或建议,请随时留言讨论!
版权归原作者 Micro麦可乐 所有, 如有侵权,请联系我们删除。