Skip to content
Public template

About

FantasyCube · 本地 PDF 工作台 — 27 种工具、智能压缩、OCR、任务队列、自动化流水线。React 19 + Flask,完全本地运行。

Topics

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

19 Commits

Folders and files

Repository files navigation

FantasyCube · PDF 工作台

Version Python React Flask License Tests PRs Welcome

React 19 + Flask PDF 工具箱,支持本机自托管和公开服务器部署。公开站点会通过 HTTPS 上传文件到服务器临时处理,并使用匿名会话隔离后台任务。

中文文档 · 贡献指南 · 更新日志


目录


为什么选择 FantasyCube

  • 部署方式透明 — 本机部署时文件留在设备;在线站点会明确提示上传服务器临时处理
  • 27 种工具 — 合并、拆分、旋转、水印、加密、OCR、压缩、格式转换...
  • 智能压缩 — 多候选竞赛 + 清晰度守门,在体积和质量间自动寻找最优解
  • 自动化流水线 — 像搭积木一样组合处理步骤,一键批量执行
  • 任务队列 — 异步后台处理,可取消、重试,结果自动过期清理
  • AI Agent 友好 — 完整的 AGENTS.md 指引,让 AI 助手理解你的项目

快速启动

1. 克隆并安装

git clone https://github.com/ImyoungF/FantasyCube.git
cd FantasyCube/app
python -m venv .venv

2. 安装依赖

Windows:

.venv\Scripts\activate
pip install -r requirements.txt
python server.py

macOS / Linux:

source .venv/bin/activate
pip install -r requirements.txt
python server.py

3. 打开浏览器

在启动服务的这台电脑上访问:

http://127.0.0.1:8082

127.0.0.1 仅代表当前电脑,其他设备无法通过这个地址访问。公开站点请使用 https://fantasycube.top;如需让局域网设备访问,请按部署与安全配置说明设置服务监听和访问控制,不要直接暴露本机开发端口。

使用 Docker 或把服务监听到非回环地址时,必须设置至少 24 字符的 FANTASYCUBE_API_TOKEN。公开部署还必须设置 FANTASYCUBE_PUBLIC_MODE=1、至少 32 字符的 FANTASYCUBE_SESSION_SECRET 和 HTTPS 安全 Cookie。网页令牌仅保存在当前标签页的 sessionStorage。

管理员后台位于 /admin。首次启动前只在服务器环境设置 FANTASYCUBE_ADMIN_USERNAME 和 FANTASYCUBE_ADMIN_PASSWORD;系统会仅保存密码哈希。管理员会话要求 HTTPS,后台不提供用户任务产物下载。

4. 可选:安装高级引擎

pip install -r requirements-advanced.txt
引擎 作用 安装方式
Tesseract OCR 扫描件文字识别 apt install tesseract-ocr
Ghostscript 智能压缩 / PDF/A apt install ghostscript
LibreOffice Office 高保真转 PDF apt install libreoffice-core

未安装时自动回退基础模式,不影响核心功能。


架构

graph LR
    A[React 19 + Vite] --> B[Flask REST API]
    B --> C[PDF 引擎层]
    C --> D[pypdf / PyMuPDF]
    C --> E[Tesseract OCR]
    C --> F[Ghostscript]
    C --> G[LibreOffice]
    B --> H[任务队列]
    H --> I[SQLite 持久化]
    H --> J[隔离 Worker 子进程]
Loading

前端:React 19 + Vite 8 + TailwindCSS 4 + Zustand 状态管理 后端:Flask + 5 蓝图(25+ REST 端点) 任务引擎:异步 Worker、并发控制、资源隔离、超时保护 存储:SQLite 用户数据目录;后台任务以签名的匿名浏览器会话隔离


功能一览

分类 工具
页面编辑 合并 PDF、拆分、旋转、裁剪、删除页面、提取页面
水印标记 添加水印、添加页码
安全保护 加密、解密、涂抹修订、隐私清理
格式转换 PDF 转图片/Word/Excel/文本、图片转 PDF、Office 转 PDF、PDF/A 归档
压缩修复 智能压缩(4 种模式)、PDF 修复
提取分析 OCR 文字识别、提取图片、PDF 属性查看
效率工具 去空白页

智能压缩

FantasyCube 的压缩不是简单的参数调节,而是一个多候选竞赛系统:

原始文件
  ├── 无损结构优化
  ├── 300 DPI 候选
  ├── 240 DPI 候选
  ├── 200 DPI 候选
  └── 积极图片压缩候选

       ↓ 清晰度守门 ↓

  页面数不变?  尺寸不变?  文字层保留?
  亮度相似度 > 阈值?  边缘清晰度 > 阈值?
  颜色还原度 > 阈值?  体积确实缩小?

       ↓ 通过的候选 ↓

  选择体积最小 + 质量最优 → 输出
  全部未通过 → 回退无损结果或原始文件

四种模式:无损优化 | 智能压缩(推荐) | 均衡压缩 | 强力压缩


API 概览

任务系统(统一异步接口)

POST   /api/v1/jobs/{operation}     提交任务
GET    /api/v1/jobs                  查询历史
GET    /api/v1/jobs/{id}             查询进度
POST   /api/v1/jobs/{id}/cancel      取消任务
POST   /api/v1/jobs/{id}/retry       重试任务
GET    /api/v1/jobs/{id}/download    下载结果
DELETE /api/v1/jobs/{id}             删除任务
GET    /api/v1/jobs/capabilities     引擎能力检测

实时同步接口

POST /api/v1/general/merge-pdfs     POST /api/v1/security/add-watermark
POST /api/v1/general/split-pages    POST /api/v1/security/add-password
POST /api/v1/general/rotate-pdf     POST /api/v1/security/redact
POST /api/v1/convert/pdf/img        POST /api/v1/misc/compress-pdf
POST /api/v1/convert/img/pdf        POST /api/v1/misc/add-page-numbers
... 共 25 个端点

本机服务的 API 文档访问 http://127.0.0.1:8082/api/docs;公开站点的 API 文档访问 https://fantasycube.top/api/docs。


环境变量

变量 默认值 说明
FANTASYCUBE_HOST 127.0.0.1 监听地址
FANTASYCUBE_DATA_DIR 用户数据目录 SQLite 与持久任务数据的根目录
FANTASYCUBE_JOB_ROOT <data-dir>/jobs 任务输入、输出和日志目录(0700)
FANTASYCUBE_MAX_CONCURRENT_JOBS 2 并行任务数
FANTASYCUBE_JOB_TIMEOUT 1800 任务超时(秒)
FANTASYCUBE_JOB_MEMORY_MB 2048 Worker 内存上限
FANTASYCUBE_JOB_TTL_HOURS 24 结果保留时长
FANTASYCUBE_JOB_HISTORY_LIMIT 200 保留的终态任务记录上限
FANTASYCUBE_JOB_RECORD_RETENTION_DAYS 7 终态任务记录最长保留天数
FANTASYCUBE_MAX_PENDING_JOBS 100 排队及运行任务总上限
FANTASYCUBE_MAX_PENDING_JOBS_PER_OWNER 10 单匿名会话待处理任务上限
FANTASYCUBE_JOB_STORAGE_LIMIT_MB 4096 任务目录总容量上限
FANTASYCUBE_JOB_STORAGE_LIMIT_MB_PER_OWNER 1024 单匿名会话任务存储上限
FANTASYCUBE_JOB_MIN_FREE_MB 512 接受新任务所需最小磁盘余量
FANTASYCUBE_API_TOKEN 空 非回环监听时必须设置,至少 24 字符
FANTASYCUBE_ADMIN_TOKEN 空 管理员专用令牌,不得与普通 API Token 相同
FANTASYCUBE_ADMIN_USERNAME 空 首次启动时创建的管理员账号,仅在服务器环境设置
FANTASYCUBE_ADMIN_PASSWORD 空 首次启动时创建的管理员密码,仅保存哈希,至少 12 位

公网部署脚本不会把管理员 Token 注入普通浏览器请求。管理员操作必须携带 FANTASYCUBE_ADMIN_TOKEN,应通过服务器本机、SSH 隧道或单独受保护的管理入口执行;未配置该令牌时,删除留言等管理员操作会被禁用。 | FANTASYCUBE_PUBLIC_MODE | 0 | 公开服务器模式;启用后强制要求会话签名密钥 | | FANTASYCUBE_SESSION_SECRET | 空 | 签名匿名会话 Cookie,公开模式至少 32 字符 | | FANTASYCUBE_SESSION_COOKIE_SECURE | 0 | HTTPS 公网部署必须设为 1 |


前端开发

cd pdf-toolbox-pro
npm ci
npm run dev        # 开发模式 → localhost:5173
npm run build      # 生产构建 → dist/

构建后使用原子同步脚本复制到 Flask 静态目录:

cd ..
python scripts/build_frontend.py

首次安装前端依赖时使用 python scripts/build_frontend.py --install。


测试

pip install -r app/requirements-dev.txt
python scripts/verify_release.py --install-frontend

该命令会执行 Python 编译、前端 lint/build、51 项 pytest、Ruff、静态文件同步、两次确定性打包和 ZIP 完整性校验。可在安装 Docker 后追加 --docker。

tests/
├── test_core_regressions.py    # 核心功能回归
├── test_background_jobs.py     # 任务系统端到端
├── test_quality_compression.py # 压缩质量守卫
├── test_second_release.py      # Office/PDFA/工作流
├── test_core_fixes.py          # 独立 smoke test
└── conftest.py                 # 共享 fixtures

项目结构

FantasyCube/
├── app/                    # Flask 后端
│   ├── server.py           # 入口
│   ├── utils.py            # PDF 处理核心
│   ├── compression_engine.py  # 智能压缩
│   ├── job_store.py        # 任务持久化
│   ├── job_worker.py       # 隔离 Worker
│   ├── job_operations.py   # 任务执行逻辑
│   ├── blueprints/         # API 蓝图(6 模块)
│   ├── static/             # 前端构建产物
│   └── requirements.txt
├── pdf-toolbox-pro/        # React 前端
│   ├── src/
│   │   ├── components/     # UI 组件
│   │   ├── data/           # 工具定义 + 图标
│   │   ├── hooks/          # 自定义 Hooks
│   │   ├── stores/         # Zustand 状态
│   │   └── utils/
│   └── package.json
├── tests/                  # pytest 测试
├── integration/            # 补丁 + 报告
├── deploy/                 # 部署脚本
├── AGENTS.md               # AI Agent 指南
├── CONTRIBUTING.md         # 贡献指南
├── CHANGELOG.md            # 更新日志
├── SECURITY.md             # 安全策略
├── LICENSE                 # MIT
└── README.md

给 AI Agent 的说明

本项目包含完整的 AGENTS.md,告诉 AI 编程助手如何:

  • 理解代码结构和架构
  • 添加新的 PDF 工具
  • 遵循编码规范和测试流程
  • 构建和部署

如果你使用 Codex、Claude Code、Cursor 或其他 AI 编程工具,直接把项目交给它即可。


贡献

欢迎贡献!请先阅读 AGENTS.md 和 CONTRIBUTING.md。

  1. Fork 本项目
  2. 创建特性分支 (git checkout -b feature/amazing-feature)
  3. 提交更改 (git commit -m "feat: Add some amazing feature")
  4. 推送到分支 (git push origin feature/amazing-feature)
  5. 创建 Pull Request

安全声明

子进程隔离和资源限制属于应用级保护,不适合处理来自完全不可信来源的恶意 PDF。生产部署建议配合容器或虚拟机沙箱。详见 SECURITY.md。


许可证

MIT © 2026 FantasyCube

About

FantasyCube · 本地 PDF 工作台 — 27 种工具、智能压缩、OCR、任务队列、自动化流水线。React 19 + Flask,完全本地运行。

Topics

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages