企业打印场景的痛点是什么?模板散落在各系统、打印机对接复杂、批量打印需要手写逻辑、Excel 数据还要手动搬运。iPrint 把这些全部收进一个平台:模板管理 → 数据渲染 → CUPS 打印 → 任务追踪,全链路自动化。

8
核心功能模块
2
认证通道
5000
单批次最大任务数
MIT
开源协议

一、核心问题:企业打印为什么难?

没有统一平台之前,每个业务系统各自对接打印机、各自管理模板、各自处理 Excel 数据——重复劳动、风格不统一、出错难追溯

传统打印架构 — 各自为战
📦
ERP 系统
自己写打印逻辑
🛒
电商平台
自己管模板
🏭
WMS 仓储
自己对接 CUPS
📄
模板 A
JSON 散落
📄
模板 B
格式不统一
📄
模板 C
版本混乱
🖨️
打印机 A
各自对接
🖨️
打印机 B
重复代码
🖨️
打印机 C
无任务追踪
⚠️ 问题:模板改一次要改 N 个系统;打印任务失败了无处追溯;Excel 数据手动复制粘贴容易出错;新业务接入打印要重新写一套对接代码。

二、iPrint 架构:一个平台,统一打印

iPrint 统一打印架构
🌐
Vue 3 SPA
管理后台 UI
🤖
第三方系统
API Key 接入
📊
Excel 导入
批量数据源
🖨️
iPrint 平台
模板 · 渲染 · 打印 · 追踪
🐘
PostgreSQL
数据持久化
📄
wkhtmltopdf
HTML → PDF
🖨️
CUPS Server
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 格式
+
📊
打印数据
JSON / Excel
⚙️
HipRenderService
模板合并
🌐
HTML 预览
流式返回
📕
PDF 文件
wkhtmltopdf

4.3 CUPS 打印 — 单次与批量,异步任务追踪

通过 cups4j 库直接与 CUPS 服务器通信(IPP 协议),支持单次打印和批量打印。每个打印任务独立追踪状态,失败可重试。

任务状态流转
📥
QUEUED
已入队
⚙️
RENDERING
渲染中
🖨️
SUBMITTED
已提交 CUPS
COMPLETED
打印完成
失败时 → FAILED(可重试)
批量打印并行调度
📤
批量请求
N 条数据
📋
创建 Batch
+ N 个 Task
🧵
线程池
4 线程并行
🖨️
逐个渲染
+ 提交 CUPS
📊
进度追踪
成功/失败计数

4.4 Excel 导入 — 上传即解析,直接打印

上传 .xlsx / .xls 文件,自动识别表头和数据行,解析结果可直接作为批量打印的数据源。典型流程:上传 Excel → 解析 → 提交批量打印 → 查询进度。

Excel 解析结果示例
{
  "headers": ["姓名", "年龄", "城市"],
  "totalRows": 2,
  "dataList": [
    { "姓名": "张三", "年龄": 25, "城市": "北京" },
    { "姓名": "李四", "年龄": 30, "城市": "上海" }
  ]
}

4.5 双通道认证 — Session + API Key

管理后台通过用户名密码登录(Session 认证),第三方系统通过 X-API-Key 请求头接入。API Key 认证走 Caffeine 缓存加速,先查缓存再查数据库。

认证流程
📥
请求进入
HTTP
🔑
ApiKeyFilter
检查 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. 配置说明

config/application-prod.yaml 关键配置
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 表
📄
sys_print_template
打印模板表
📋
cups_print_batch
打印批次表
📝
cups_print_task
打印任务表(多对一)

十、设计总结

🎯 一句话总结:iPrint 让「模板设计 → 数据渲染 → 打印输出 → 任务追踪」全链路自动化。业务系统只需调一个 API,打印的一切由 iPrint 接管。