企业打印场景的痛点是什么?模板散落在各系统、打印机对接复杂、批量打印需要手写逻辑、Excel 数据还要手动搬运。iPrint 把这些全部收进一个平台:模板管理 → 数据渲染 → CUPS 打印 → 任务追踪,全链路自动化。
8
核心功能模块
2
认证通道
5000
单批次最大任务数
MIT
开源协议
一、核心问题:企业打印为什么难?
没有统一平台之前,每个业务系统各自对接打印机、各自管理模板、各自处理 Excel 数据——重复劳动、风格不统一、出错难追溯。
📦
ERP 系统
自己写打印逻辑
自己写打印逻辑
🛒
电商平台
自己管模板
自己管模板
🏭
WMS 仓储
自己对接 CUPS
自己对接 CUPS
📄
模板 A
JSON 散落
JSON 散落
📄
模板 B
格式不统一
格式不统一
📄
模板 C
版本混乱
版本混乱
🖨️
打印机 A
各自对接
各自对接
🖨️
打印机 B
重复代码
重复代码
🖨️
打印机 C
无任务追踪
无任务追踪
⚠️ 问题:模板改一次要改 N 个系统;打印任务失败了无处追溯;Excel 数据手动复制粘贴容易出错;新业务接入打印要重新写一套对接代码。
二、iPrint 架构:一个平台,统一打印
🌐
Vue 3 SPA
管理后台 UI
管理后台 UI
🤖
第三方系统
API Key 接入
API Key 接入
📊
Excel 导入
批量数据源
批量数据源
🖨️
iPrint 平台
模板 · 渲染 · 打印 · 追踪
模板 · 渲染 · 打印 · 追踪
🐘
PostgreSQL
数据持久化
数据持久化
📄
wkhtmltopdf
HTML → PDF
HTML → PDF
🖨️
CUPS Server
IPP 打印协议
IPP 打印协议
🎯 核心理念:所有业务系统通过 iPrint 统一管理模板、统一渲染、统一提交打印。新增业务 = 调一个 API,打印侧零改动。
三、技术栈全景
☕
Spring Boot
4.0.2
🔒
Spring Security
7.x
💚
Vue 3 + Vite
TypeScript
🐘
PostgreSQL
15+
🖨️
CUPS / IPP
cups4j 0.7.6
📊
Apache POI
5.2.5
🎨
Hiprint
模板引擎
☕
Java
17+
📦
Maven
3.9+
四、核心功能模块
4.1 模板管理 — 可视化设计,版本化管理
基于 Hiprint 的 JSON 模板格式,支持拖拽式可视化设计。模板定义了纸张大小、布局、数据绑定(文本、表格、二维码、条形码等),存储在数据库中统一管理。
{
"code": "TPL-001",
"name": "销售单模板",
"templateData": {
"panels": [{
"paperType": "A4",
"width": 210,
"height": 297,
"printElements": [
{ "options": { "field": "name", "title": "姓名" } },
{ "options": { "field": "table", "columns": [...] } }
]
}]
}
}
4.2 渲染引擎 — 模板 + 数据 → HTML / PDF
渲染引擎是 iPrint 的核心能力。将 Hiprint 模板 JSON 与打印数据合并,生成 HTML 预览或通过 wkhtmltopdf 转换为 PDF 文件。
📄
模板 JSON
Hiprint 格式
Hiprint 格式
📊
打印数据
JSON / Excel
JSON / Excel
⚙️
HipRenderService
模板合并
模板合并
🌐
HTML 预览
流式返回
流式返回
📕
PDF 文件
wkhtmltopdf
wkhtmltopdf
4.3 CUPS 打印 — 单次与批量,异步任务追踪
通过 cups4j 库直接与 CUPS 服务器通信(IPP 协议),支持单次打印和批量打印。每个打印任务独立追踪状态,失败可重试。
📥
QUEUED
已入队
已入队
⚙️
RENDERING
渲染中
渲染中
🖨️
SUBMITTED
已提交 CUPS
已提交 CUPS
✅
COMPLETED
打印完成
打印完成
失败时 → FAILED(可重试)
📤
批量请求
N 条数据
N 条数据
📋
创建 Batch
+ N 个 Task
+ N 个 Task
🧵
线程池
4 线程并行
4 线程并行
🖨️
逐个渲染
+ 提交 CUPS
+ 提交 CUPS
📊
进度追踪
成功/失败计数
成功/失败计数
4.4 Excel 导入 — 上传即解析,直接打印
上传 .xlsx / .xls 文件,自动识别表头和数据行,解析结果可直接作为批量打印的数据源。典型流程:上传 Excel → 解析 → 提交批量打印 → 查询进度。
{
"headers": ["姓名", "年龄", "城市"],
"totalRows": 2,
"dataList": [
{ "姓名": "张三", "年龄": 25, "城市": "北京" },
{ "姓名": "李四", "年龄": 30, "城市": "上海" }
]
}
4.5 双通道认证 — Session + API Key
管理后台通过用户名密码登录(Session 认证),第三方系统通过 X-API-Key 请求头接入。API Key 认证走 Caffeine 缓存加速,先查缓存再查数据库。
📥
请求进入
HTTP
HTTP
🔑
ApiKeyFilter
检查 X-API-Key
检查 X-API-Key
💾
Caffeine 缓存
快速命中
快速命中
✅
ROLE_API_KEY
认证通过
认证通过
无 API Key → 走 Session 认证 → 用户名密码登录
五、API 端点一览
认证与用户
POST /api/auth/login
用户名密码登录,返回 Session
GET /api/auth/info
获取当前登录用户信息
PUT /api/auth/password
修改密码
模板管理
GET /api/templates
模板列表(分页 + 关键字搜索)
POST /api/templates
创建打印模板(Hiprint JSON 格式)
PUT /api/templates/{id}
更新模板
渲染引擎
POST /api/engine/generateHtml
模板 JSON + 数据 → HTML(流式返回)
POST /api/engine/generatePdf
模板 JSON + 数据 → PDF(流式下载)
POST /api/engine/render/html
模板编码 + 数据 → HTML(通过模板编码引用)
POST /api/engine/render/pdf
模板编码 + 数据 → PDF
CUPS 打印
GET /api/cups/printers
获取 CUPS 打印机列表(公开接口)
POST /api/cups/print
提交单次打印任务
POST /api/cups/batch/submit
提交批量打印(自动拆分为 N 个并行任务)
POST /api/cups/excel/parse
上传 Excel 解析为打印数据
GET /api/cups/tasks/{id}
查询单次打印任务状态
GET /api/cups/batch/{id}
查询批量打印进度
六、调用示例
单次打印
curl -X POST http://localhost:58080/api/cups/print \
-H "Content-Type: application/json" \
-H "X-API-Key: your-api-key" \
-d '{
"templateCode": "TPL-001",
"data": { "name": "张三", "amount": "1000" },
"printerName": "HP-LaserJet",
"copies": 1,
"paperSize": "A4"
}'
批量打印(Excel → 打印)
# 1. 上传 Excel 解析数据
curl -X POST http://localhost:58080/api/cups/excel/parse \
-H "X-API-Key: your-api-key" \
-F "file=@data.xlsx"
# 2. 将解析结果提交批量打印
curl -X POST http://localhost:58080/api/cups/batch/submit \
-H "Content-Type: application/json" \
-H "X-API-Key: your-api-key" \
-d '{
"templateCode": "TPL-001",
"dataList": [
{ "姓名": "张三", "金额": "1000" },
{ "姓名": "李四", "金额": "2000" }
],
"printerName": "HP-LaserJet"
}'
# 3. 查询批次进度
curl http://localhost:58080/api/cups/batch/1 \
-H "X-API-Key: your-api-key"
渲染 HTML 预览
curl -X POST http://localhost:58080/api/engine/render/html \
-H "Content-Type: application/json" \
-H "X-API-Key: your-api-key" \
-d '{
"code": "TPL-001",
"printData": [{ "name": "张三", "amount": "1000" }]
}'
七、本地构建与运行
项目是标准的 Spring Boot + Vue 前后端分离结构,本地开发只需 Java 17 + Maven + PostgreSQL。
环境要求
☕
Java
17+
📦
Maven
3.9+
🐘
PostgreSQL
15+
🟢
Node.js
18+(前端构建)
1. 初始化数据库
# 创建数据库
createdb iboot_iprint
# 导入初始化脚本(含表结构 + 示例数据)
psql -d iboot_iprint -f DatabaseScripts/postgres-init.sql
2. 后端构建运行
# 编译打包(跳过测试加速)
mvn clean package -DskipTests
# 直接运行
java -jar target/iboot-iprint-0.0.1-SNAPSHOT.jar
# 或指定生产配置
java -jar target/iboot-iprint-0.0.1-SNAPSHOT.jar \
--spring.config.location=config/application-prod.yaml
3. 前端构建
# 进入前端目录
cd iboot-iprint-ui
# 安装依赖
pnpm install
# 开发模式(热更新)
pnpm dev
# 生产构建(输出到后端 static 目录)
pnpm build
4. 配置说明
server:
port: 58080 # 服务端口
spring:
datasource:
url: jdbc:postgresql://localhost:5432/iboot_iprint
username: postgres
password: your-password
cups:
host: localhost # CUPS 服务器地址
port: 631 # CUPS 端口
batch:
thread-pool-size: 4 # 并行打印线程数
task-interval-ms: 500 # 任务提交间隔
max-batch-size: 5000 # 单批次上限
5. 运行测试
# 全量测试(使用 H2 内存数据库,无需 PostgreSQL)
mvn test
# 访问
# http://localhost:58080
# 默认管理员:admin / 123456
💡 测试环境:测试用 H2 内存数据库 + PostgreSQL 兼容模式,无需外部依赖。
application-test.yaml 配置了 ddl-auto: create-drop,每次测试自动建表清表。
八、项目结构
iprint-cups/
├── pom.xml # Maven 配置(Spring Boot 4.0.2)
├── DatabaseScripts/
│ └── postgres-init.sql # PostgreSQL 初始化脚本
├── src/main/java/com/iboot/iprint/
│ ├── IbootIprintApplication.java # 启动类
│ ├── config/ # Security / Cache / Web 配置
│ ├── controller/ # Auth / User / Template / Render
│ ├── cups/ # CUPS 打印模块(独立子包)
│ │ ├── controller/ # Print / Batch / Excel
│ │ ├── service/ # CupsPrint / BatchPrint / ExcelParser
│ │ ├── entity/ # PrintTask / PrintBatch
│ │ └── repository/ # JPA Repository
│ ├── service/ # 模板渲染 / 用户 / API Key
│ ├── security/ # ApiKeyAuthFilter
│ └── entity/ # User / ApiKey / PrintTemplate
├── iboot-iprint-ui/ # Vue 3 前端 SPA
└── vue-plugin-hiprint/ # Hiprint 打印设计插件
九、数据模型
👤
sys_user
用户表
用户表
🔑
sys_api_key
API Key 表
API Key 表
📄
sys_print_template
打印模板表
打印模板表
📋
cups_print_batch
打印批次表
打印批次表
📝
cups_print_task
打印任务表(多对一)
打印任务表(多对一)
十、设计总结
- 统一模板管理:Hiprint JSON 格式,可视化设计器,版本化存储,一处修改全局生效
- 统一渲染引擎:模板 + 数据 → HTML 预览 / PDF 文件,支持编码引用和直接 JSON
- 统一打印通道:CUPS/IPP 协议直连,单次/批量打印,异步任务追踪,失败可重试
- Excel 数据桥接:上传即解析,解析结果直接作为批量打印数据源,零手动搬运
- 双通道认证:Session(管理后台)+ API Key(第三方集成),Caffeine 缓存加速
- 本地构建运行:Maven 一键打包,Java 直接运行,配置外部化,开箱即用
🎯 一句话总结:iPrint 让「模板设计 → 数据渲染 → 打印输出 → 任务追踪」全链路自动化。业务系统只需调一个 API,打印的一切由 iPrint 接管。