# springboot-pdf **Repository Path**: fastsun666/springboot-pdf ## Basic Information - **Project Name**: springboot-pdf - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-01-21 - **Last Updated**: 2026-02-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # PDF电子签章系统 基于SpringBoot 2的PDF电子签章与生成服务,专为职称申报系统设计。 ## 核心功能 ### 📄 PDF生成功能(NEW) 根据申报材料自动生成格式化的PDF文档,并嵌入隐藏签名关键字 ### 🔖 PDF签章功能 使用图片水印方式对PDF文件进行电子盖章 ## 项目特性 ### PDF生成 ✅ **模板化生成**:支持默认、简洁、详细三种模板 ✅ **隐藏关键字**:自动在签名位置嵌入隐藏关键字,供后续签章定位 ✅ **完整信息**:支持基本信息、教育经历、工作经历、项目经历等 ✅ **格式美观**:专业的表格布局和排版 ### PDF签章 ✅ **多种位置策略**:支持最后一页、第一页、所有页、关键字定位、自定义坐标 ✅ **关键字定位**:解决PDF内容长度不一致导致的签名位置偏差问题(支持多页盖章) ✅ **自适应页面**:自动获取PDF页面尺寸,计算合适的签章位置 ✅ **灵活配置**:支持通过配置文件或API参数动态调整 ✅ **文件上传**:支持文件上传和本地路径两种方式 ## 技术栈 - SpringBoot 2.7.18 - iText 5.5.13.3(PDF处理) - Lombok - Maven ## 项目结构 ``` cn.lisens.pdf ├── config │ ├── PdfSealConfig.java # 签章配置类 │ └── PdfTemplateConfig.java # 模板配置类(NEW) ├── controller │ ├── PdfSealController.java # 签章控制器 │ └── PdfGenerateController.java # PDF生成控制器(NEW) ├── dto │ ├── PdfSealRequest.java # 签章请求参数 │ ├── PdfGenerateRequest.java # PDF生成请求(NEW) │ └── ApplicationMaterial.java # 申报材料DTO(NEW) ├── enums │ ├── SealPositionStrategy.java # 位置策略枚举 │ └── TemplateType.java # 模板类型枚举(NEW) ├── service │ ├── PdfSealService.java # 核心签章服务 │ └── PdfGenerateService.java # PDF生成服务(NEW) └── PdfSealApplication.java # 启动类 resources ├── seal │ └── seal.png # 签章图片(需自行准备) └── application.yml # 配置文件 ``` ## 快速开始 ### 1. 准备签章图片 在 `src/main/resources/seal/` 目录下放置签章图片 `seal.png` **签章图片要求:** - 格式:PNG(推荐带透明背景) - 尺寸:建议 200x200 或 300x300 像素 - 背景:透明背景效果更佳 ### 2. 修改配置(可选) 编辑 `src/main/resources/application.yml`: ```yaml pdf: seal: image-path: classpath:seal/seal.png # 签章图片路径 position-strategy: LAST_PAGE # 默认位置策略 keyword: "签字:" # 关键字定位使用 width: 100 # 签章宽度 height: 100 # 签章高度 right-margin: 100 # 右边距 bottom-margin: 100 # 下边距 ``` ### 3. 编译项目 ```bash mvn clean package ``` ### 4. 启动服务 ```bash mvn spring-boot:run ``` 或直接运行: ```bash java -jar target/springboot-pdf-1.0.0.jar ``` 服务启动后访问:http://localhost:8080/api/pdf/health ## 完整工作流程 ``` 1. 申报人填写材料 ↓ 2. 调用 /api/pdf/generate 生成PDF(自动嵌入隐藏关键字) ↓ 3. 申报人签字:调用 /api/pdf/seal/upload(使用隐藏关键字定位) ↓ 4. 院系审核盖章:调用 /api/pdf/seal/upload ↓ 5. 学校审核盖章:调用 /api/pdf/seal/upload ↓ 6. 评审专家签字:调用 /api/pdf/seal/upload(支持多页盖章) ↓ 7. 完成职称申报流程 ``` ## API接口说明 ### PDF生成接口 #### 1. 生成PDF文档 ```bash POST http://localhost:8080/api/pdf/generate Content-Type: application/json # 请求体见 example_request.json 文件 # 返回:PDF文件(二进制流) ``` #### 2. 生成PDF到指定路径 ```bash POST http://localhost:8080/api/pdf/generate/path Content-Type: application/json { "material": { ... }, "outputFileName": "D:/applications/zhangsan.pdf" } ``` #### 3. 获取支持的模板 ```bash GET http://localhost:8080/api/pdf/templates ``` 详细使用说明请查看:[PDF_GENERATE_GUIDE.md](PDF_GENERATE_GUIDE.md) ### PDF签章接口 #### 1. 健康检查 ```bash GET http://localhost:8080/api/pdf/health ``` ### 2. 上传PDF并添加签章 ```bash POST http://localhost:8080/api/pdf/seal/upload Content-Type: multipart/form-data 参数: - file: PDF文件(必填) - positionStrategy: 位置策略(可选) * LAST_PAGE - 最后一页(默认) * FIRST_PAGE - 第一页 * ALL_PAGES - 所有页 * KEYWORD - 关键字定位 * CUSTOM - 自定义坐标 - keyword: 关键字(KEYWORD策略时使用) - pageNumber: 页码(CUSTOM策略时使用,从1开始) - customX: X坐标(CUSTOM策略时使用) - customY: Y坐标(CUSTOM策略时使用) 返回:签章后的PDF文件(二进制流) ``` ### 3. 通过文件路径添加签章 ```bash POST http://localhost:8080/api/pdf/seal/path Content-Type: application/json { "sourcePdf": "/path/to/source.pdf", "positionStrategy": "LAST_PAGE", "keyword": "签字:", "pageNumber": 1, "customX": 200.0, "customY": 300.0 } 返回: { "success": true, "message": "签章成功", "targetPath": "/path/to/source_sealed.pdf" } ``` ### 4. 获取PDF页数 ```bash POST http://localhost:8080/api/pdf/pages Content-Type: multipart/form-data 参数: - file: PDF文件 返回: { "success": true, "pageCount": 5, "fileName": "document.pdf" } ``` ### 5. 获取支持的策略列表 ```bash GET http://localhost:8080/api/pdf/strategies 返回: { "success": true, "strategies": [...] } ``` ## 使用示例 ### 示例1:最后一页添加签章(默认) ```bash curl -X POST "http://localhost:8080/api/pdf/seal/upload?positionStrategy=LAST_PAGE" \ -F "file=@document.pdf" \ --output sealed_document.pdf ``` ### 示例2:关键字定位签章(推荐) **解决PDF内容长度不一致的问题** ```bash curl -X POST "http://localhost:8080/api/pdf/seal/upload?positionStrategy=KEYWORD&keyword=签字:" \ -F "file=@document.pdf" \ --output sealed_document.pdf ``` ### 示例3:在所有页添加签章 ```bash curl -X POST "http://localhost:8080/api/pdf/seal/upload?positionStrategy=ALL_PAGES" \ -F "file=@document.pdf" \ --output sealed_document.pdf ``` ### 示例4:自定义位置签章 ```bash curl -X POST "http://localhost:8080/api/pdf/seal/upload?positionStrategy=CUSTOM&pageNumber=3&customX=200&customY=300" \ -F "file=@document.pdf" \ --output sealed_document.pdf ``` ## 关键字定位说明 关键字定位策略(`KEYWORD`)特别适合解决**PDF内容长度不一致导致签名位置偏差**的问题: ### 工作原理 1. 从PDF最后一页开始向前搜索指定关键字 2. 找到关键字所在页面后,在该页添加签章 3. 如果未找到关键字,则默认在最后一页添加签章 ### 使用场景 - 职称申报表中的"签字:"字段 - 审批流程中的"审核:"标记 - 合同文档中的"甲方签字:"等固定文本 ### 配置建议 在 `application.yml` 中配置默认关键字: ```yaml pdf: seal: position-strategy: KEYWORD keyword: "签字:" ``` ## 坐标系说明 PDF坐标系: - 原点(0, 0)在**左下角** - X轴向右递增 - Y轴向上递增 签章位置计算: - 默认在右下角:`x = 页面宽度 - 右边距 - 签章宽度` - 距底部:`y = 下边距` ## 测试工具推荐 ### 使用Postman测试 1. 导入以下请求集合 2. 选择 `POST /api/pdf/seal/upload` 3. 在 Body 中选择 form-data 4. 添加 key 为 `file`,类型为 `File`,选择PDF文件 5. 添加其他参数(可选) 6. 点击 Send,在响应中保存返回的PDF文件 ### 使用curl测试 参考上面的使用示例。 ## 常见问题 ### Q1: 签章图片不显示? - 检查图片路径是否正确 - 确认图片文件存在于 `src/main/resources/seal/` 目录 - 检查图片格式是否为PNG ### Q2: 签章位置不对? - 检查配置的边距参数 - 尝试使用关键字定位策略 - 使用自定义坐标精确控制位置 ### Q3: 关键字定位找不到? - 确认PDF中存在该关键字 - 检查关键字拼写和格式(包括中英文标点) - 查看日志了解搜索过程 ### Q4: 文件上传大小限制? 修改 `application.yml`: ```yaml spring: servlet: multipart: max-file-size: 100MB max-request-size: 100MB ``` ## 注意事项 ⚠️ **法律效力说明** 本项目使用的是**图片水印方式**,不具备法律效力,仅适用于: - 内部流程审批 - 测试环境 - 演示用途 **如需具备法律效力的电子签章,请使用:** - 第三方电子签章平台(e签宝、上上签等) - CA数字证书签名 - 国产密码算法(SM2/SM3) ## 许可证 MIT License ## 作者 lisens - 2026年1月 ## 联系方式 如有问题,请提交Issue。