项目说明文档
项目简介
这是一个基于 Spring Boot 的多功能 Web 应用系统,主要提供以下两大核心功能:
- PDF拼版工具 - 可视化PDF页面编辑与拼接
- 公式计算系统 - 可视化拖拽式数学公式设计与计算
技术栈
后端
- Spring Boot 3.5.6 - Web应用框架
- Java 17 - 编程语言
- Apache PDFBox 3.0.5 - PDF处理库
- Aviator 5.4.3 - 表达式引擎
- Lombok - 简化Java代码
前端
- 原生 HTML5 + CSS3 + JavaScript
- 响应式设计,支持移动端访问
服务端口
- 默认端口:9999
功能一:PDF拼版工具
功能概述
PDF拼版工具是一个强大的可视化PDF编辑系统,允许用户上传多个PDF文件,通过拖拽、缩放、旋转、裁切等操作,将多个PDF页面拼接成一个新的PDF文档。
界面展示

功能特点
✅ 多文件上传 - 支持同时上传多个PDF文件
✅ 页面预览 - 自动生成页面缩略图
✅ 可视化编辑 - 拖拽式画布操作
✅ 灵活布局 - 自定义页面尺寸(支持A3、A4、A5等预设)
✅ 精确控制 - 支持毫米级精度的位置、缩放、旋转调整
✅ 页面裁切 - 支持四边距离裁切和矩形区域裁切
✅ 重叠模式 - 可选择允许或禁止页面元素重叠
✅ 实时预览 - 画布实时显示最终效果
✅ 批量处理 - 一次性配置多页PDF拼版
使用方法
1. 访问页面
打开浏览器访问:http://localhost:9999/pdf/index.html
2. 上传PDF文件
- 点击"选择文件"按钮或拖拽PDF文件到上传区域
- 系统自动解析PDF页面并生成缩略图
3. 设计PDF布局
- 点击"添加页面"创建目标PDF页面
- 设置页面尺寸(可选择A3、A4、A5预设或自定义)
- 从左侧拖拽源PDF页面到画布中
4. 调整页面元素
- 位置调整:拖拽元素到目标位置
- 缩放:调整元素的X/Y缩放比例
- 旋转:设置旋转角度(0-360度)
- 裁切:设置裁切区域和边距
5. 生成PDF
- 点击"生成并下载PDF"按钮
- 系统自动生成拼版后的PDF文件并下载
API接口说明
1. 上传PDF文件
POST /api/pdf/upload
Content-Type: multipart/form-data
参数:
- file: PDF文件(支持多文件)
响应:
{
"success": true,
"message": "文件上传成功",
"data": [
{
"fileId": "uuid",
"fileName": "原文件名.pdf",
"pageIndex": 0,
"widthMm": 210,
"heightMm": 297,
"rotation": 0,
"thumbnailBase64": "base64编码的缩略图"
}
]
}
2. 拼接PDF
POST /api/pdf/merge
Content-Type: application/json
请求体:
{
"outputFileName": "输出文件名",
"targetPages": [
{
"widthMm": 210,
"heightMm": 297,
"sourcePages": [
{
"sourceFileId": "文件ID",
"sourcePageIndex": 0,
"transform": {
"offsetX": 0,
"offsetY": 0,
"scaleX": 1.0,
"scaleY": 1.0,
"rotation": 0,
"cropTop": 0,
"cropBottom": 0,
"cropLeft": 0,
"cropRight": 0
}
}
]
}
]
}
响应:
返回生成的PDF文件(二进制流)
3. 清理缓存
DELETE /api/pdf/cache/{fileId} # 清理指定文件缓存
DELETE /api/pdf/cache # 清理所有缓存
响应:
{
"success": true,
"message": "缓存清理成功"
}
核心技术实现
- 坐标系转换:自动处理前端坐标系(左上角原点)与PDF坐标系(左下角原点)的转换
- 图形变换:使用变换矩阵实现平移、缩放、旋转的复合操作
- 裁切处理:支持基于四边距离的裁切和矩形区域裁切
- 内存管理:使用ConcurrentHashMap缓存PDF文档,支持主动清理
功能二:公式计算系统
功能概述
公式计算系统是一个可视化的数学表达式设计与计算平台。用户可以通过拖拽式流程图界面设计复杂的数学公式,系统自动编译为可执行的表达式,并支持保存、加载、管理公式库。
界面展示

功能特点
✅ 可视化设计 - 拖拽式流程图界面,无需编写代码
✅ 丰富的运算符 - 支持加减乘除、取整、最大最小值等
✅ 参数化输入 - 自定义输入参数及默认值
✅ 实时计算 - 即时验证公式正确性
✅ 公式管理 - 保存、加载、删除公式
✅ 公式库 - 统一管理所有已保存的公式
✅ 表达式缓存 - 提升计算性能
✅ 错误提示 - 友好的错误信息提示
使用方法
1. 访问公式管理页面
打开浏览器访问:http://localhost:9999/aviator/index.html
2. 创建新公式
- 点击"新建公式"按钮
- 进入可视化编辑器页面
3. 设计公式(编辑器页面)
- 定义参数:设置输入参数名称、类型、默认值
- 拖拽节点:从工具栏拖拽运算节点到画布
- 连接节点:连接输入和输出端口构建计算流程
- 设置属性:为每个节点配置属性(如运算符类型)
- 生成表达式:系统自动生成计算表达式
4. 测试公式
- 在测试面板输入参数值
- 点击"计算"按钮查看结果
- 验证公式是否正确
5. 保存公式
- 填写公式名称和描述
- 点击"保存"按钮
- 公式自动保存到本地JSON文件
6. 管理公式
- 返回公式管理页面查看所有已保存的公式
- 支持编辑、删除操作
- 按更新时间倒序显示
API接口说明
1. 计算公式
POST /api/formula/calculate
Content-Type: application/json
请求体:
{
"expression": "a + b * 2",
"inputs": {
"a": 10,
"b": 5
}
}
响应:
{
"success": true,
"message": "计算成功",
"data": {
"success": true,
"outputs": {
"result": 20
},
"executionTime": 5
}
}
2. 保存公式
POST /api/formula/save
Content-Type: application/json
请求体:
{
"name": "公式名称",
"description": "公式描述",
"expression": "a + b * 2",
"parameters": {
"a": {
"id": "a",
"name": "参数A",
"type": "number",
"defaultValue": 0
}
},
"nodes": [...],
"connections": [...]
}
响应:
{
"success": true,
"message": "公式保存成功: 公式名称"
}
3. 获取公式列表
GET /api/formula/list
响应:
{
"success": true,
"message": "获取成功",
"data": [
{
"name": "公式名称",
"description": "公式描述",
"expression": "a + b * 2",
"createTime": 1697468400000,
"updateTime": 1697468400000,
"parameters": {...},
"nodes": [...],
"connections": [...]
}
]
}
4. 加载指定公式
GET /api/formula/load/{formulaName}
响应:
{
"success": true,
"message": "加载成功",
"data": {
"name": "公式名称",
"description": "公式描述",
"expression": "a + b * 2",
...
}
}
5. 删除公式
DELETE /api/formula/delete/{formulaName}
响应:
{
"success": true,
"message": "公式删除成功: 公式名称"
}
核心技术实现
- 表达式引擎:基于 Aviator 5.4.3,支持复杂的数学表达式计算
- 表达式缓存:使用 ConcurrentHashMap 缓存编译后的表达式,提升性能
- 文件存储:公式保存为JSON格式,存储在
./formulas目录 - 文件名处理:自动清理非法字符,支持中文文件名
- 异常处理:完善的错误捕获和友好的错误提示
公式存储位置
公式以JSON格式存储在项目根目录的 formulas 文件夹中:
demo/
├── formulas/
│ ├── 公式名称1.json
│ ├── 公式名称2.json
│ └── ...
快速开始
环境要求
- JDK 17+
- Maven 3.6+
- 现代浏览器(Chrome、Firefox、Edge等)
启动步骤
1. 克隆或下载项目
cd demo
2. 编译项目
mvn clean package
3. 运行项目
java -jar target/demo-0.0.1-SNAPSHOT.jar
或者直接运行主类:
mvn spring-boot:run
4. 访问应用
启动成功后,访问以下地址:
- 首页:http://localhost:9999/
- PDF拼版工具:http://localhost:9999/pdf/index.html
- 公式计算系统:http://localhost:9999/aviator/index.html
配置说明
application.yml
server:
port: 9999 # 服务端口
spring:
servlet:
multipart:
max-file-size: 1000MB # 最大文件上传大小
max-request-size: 1000MB # 最大请求大小
公式存储路径
默认公式存储路径为 ./formulas,可通过配置修改:
formula:
storage:
path: ./formulas # 公式存储目录
项目结构
demo/
├── src/main/java/com/example/
│ ├── pdfSplice/ # PDF拼版模块
│ │ ├── controller/ # 控制器
│ │ │ └── PdfController.java
│ │ ├── service/ # 服务层
│ │ │ └── PdfService.java
│ │ └── model/ # 数据模型
│ │ ├── PdfMergeRequest.java
│ │ ├── PdfPageInfo.java
│ │ ├── TargetPageConfig.java
│ │ ├── MergePageConfig.java
│ │ └── PageTransform.java
│ │
│ ├── aviatorCount/ # 公式计算模块
│ │ ├── controller/ # 控制器
│ │ │ └── FormulaController.java
│ │ ├── service/ # 服务层
│ │ │ └── DynamicFormulaCalculator.java
│ │ └── model/ # 数据模型
│ │ ├── CalculateRequest.java
│ │ ├── FormulaResult.java
│ │ └── SavedFormula.java
│ │
│ └── DemoApplication.java # 应用入口
│
├── src/main/resources/
│ ├── static/ # 静态资源
│ │ ├── pdf/ # PDF拼版前端
│ │ │ ├── index.html
│ │ │ ├── css/
│ │ │ └── js/
│ │ └── aviator/ # 公式计算前端
│ │ ├── index.html
│ │ ├── edit.html
│ │ ├── css/
│ │ └── js/
│ └── application.yml # 配置文件
│
├── formulas/ # 公式存储目录
├── img/ # 文档图片
│ ├── pdf.png # PDF拼版工具截图
│ └── 公式.png # 公式计算系统截图
├── pom.xml # Maven配置
└── README.md # 说明文档
注意事项
PDF拼版工具
- 上传的PDF文件缓存在内存中,长时间运行建议定期清理缓存
- 大文件处理可能需要较长时间,请耐心等待
- 确保浏览器支持现代JavaScript特性
- 坐标单位统一使用毫米(mm)
公式计算系统
- 公式以JSON格式存储在本地文件系统
- 公式名称支持中文,但会自动清理特殊字符
- 表达式遵循Aviator语法规则
- 计算结果会缓存,提升性能
常见问题
1. 端口被占用
如果9999端口被占用,请修改 application.yml 中的端口配置。
2. 文件上传失败
检查文件大小是否超过1000MB限制,可在配置文件中调整。
3. 公式保存失败
确保 formulas 目录存在且有写入权限。
4. PDF生成失败
检查浏览器控制台是否有错误信息,确认所有源PDF文件已正确上传。
技术支持
如有问题或建议,请联系开发团队。
许可证
本项目仅供学习和内部使用。
祝使用愉快! 🎉
存在内存中,长时间运行建议定期清理缓存
2. 大文件处理可能需要较长时间,请耐心等待
3. 确保浏览器支持现代JavaScript特性
4. 坐标单位统一使用毫米(mm)
公式计算系统
- 公式以JSON格式存储在本地文件系统
- 公式名称支持中文,但会自动清理特殊字符
- 表达式遵循Aviator语法规则
- 计算结果会缓存,提升性能
常见问题
1. 端口被占用
如果9999端口被占用,请修改 application.yml 中的端口配置。
2. 文件上传失败
检查文件大小是否超过1000MB限制,可在配置文件中调整。
3. 公式保存失败
确保 formulas 目录存在且有写入权限。
4. PDF生成失败
检查浏览器控制台是否有错误信息,确认所有源PDF文件已正确上传。
技术支持
如有问题或建议,请联系开发团队。
许可证
本项目仅供学习和内部使用。
祝使用愉快! 🎉
1104

被折叠的 条评论
为什么被折叠?



