# 一凡OFD 批量转换工具（ofd-batch）

基于一凡OFD 内核（Rust）的桌面批量转换工具，文件全程在本机处理、不上传服务器。

## 功能

- **OFD → PDF**：真实文本 + 嵌入字体（可检索），支持页范围与注释外观保留
- **PDF → OFD**：矢量转换（语料实测 98%+ 成功率），自动/仅嵌入/全轮廓三种文本模式
- **OFD → OFD/A 归档**：合规检测免费不限量；修复（嵌合规字体、GBIG2 等图像转码、
  设归档标识）需授权。加密件与多文档包不支持（逐行报错），已签名件默认跳过（可强制）
- **元数据编辑**（v0.22.0）：按模板批量改写国标 DocInfo 字段 + 自定义键值（可承载档号、
  保管期限等 DA/T 46 档案著录字段）；行内「编辑」免费修改单份（弹窗回显当前值，
  diff 保存到原文件）。**批量双模式**（v0.4.0）：「统一设置」按模板预填页面表单（可微调，
  所有文件同一套元数据）；「按文件设置」走 Excel 闭环——导出逐行填写表（含模板自定义键列）
  → 在 Excel 中填写 → 导入回填 → 批量编辑，未匹配的文件自动跳过。模板在「设置」中
  统一管理（新建/编辑/删除/导入导出）。已签名件默认跳过（可勾选包含），DocID 只读

## 本地配置（v0.4.0）

- 配置存于 SQLite（`%APPDATA%\ofd-batch\config.db`）：元数据模板、自定义字体目录、
  输出目录记忆——重启保留
- 设置页可**导出/导入配置**（JSON 文件，含全部模板与设置；导入按名覆盖、可跨机器迁移）
- **字体索引缓存**：首次扫描后索引落盘（`font-index-cache.json`，仅元数据），
  之后启动目录指纹未变化时直接加载（亚秒级就绪）；字体文件增删或自定义目录变更自动重扫

## 免费与授权（0.3.0 口径：单文件免费 / 批量付费）

- **单文件操作免费不限次**（文件行内按钮，一次一份）：OFD↔PDF 转换、OFD/A 检测与修复、
  元数据读取与编辑（就地保存）。不占额度、无需授权
- **批量操作**：OFD/A 批量检测免费不限量；其余批量免费试用为每批 5 份、每日 20 份
  （四种模式统一口径），桌面授权后不限量。额度不足时点击批量按钮才提示，不做前置拦截
- **桌面授权（scope=desktop）**：批量不限量，离线激活码绑定机器指纹
  （有效期最长 400 天，到期重新购买激活码）
- 激活方式：把「授权」面板中的机器指纹发给供应商，收到激活码后粘贴或选择文件激活
- 所有限制只作用于本工具；付费 SDK（wasm/CLI）产物无任何此类限制

## 使用

双击 `start.cmd`（或直接运行 `ofd-batch.exe`）：

1. 顶部页签选处理模式（OFD→PDF / PDF→OFD / OFD→OFD/A / 元数据编辑）；
2. 拖入/添加文件或文件夹（输出目录未选时自动预填首个文件所在目录，并记忆上次选择）；
3. **行内单文件操作（免费）**：互转模式「转换」、OFD/A「检测/转换」（先检测后修复，
   检测报告内可直接「修复此文件」）、元数据「编辑」（弹窗回显当前值，diff 保存到原文件）；
   单文件输出默认写源文件所在目录，无需选目录；
4. **头部批量操作**：OFD/A 模式为「批量检测（免费）+ 批量修复」，其余模式「开始转换」；
   批量需选输出目录，免费额度不足时点击后提示。

批量断点续跑：不勾选「覆盖已有输出」时，输出目录中已存在且较新的同名产物自动跳过。

批量断点续跑：不勾选「覆盖已有输出」时，输出目录中已存在且较新的同名产物自动跳过。

## 构建开发版

```bash
cd examples/ofd-batch
node scripts/build.mjs            # release 构建（开发构建，无授权公钥）
node scripts/build.mjs --debug    # debug（带控制台）
node scripts/build.mjs --zip      # 附打便携 zip（dist/）
node scripts/build.mjs --keys <.license-keys/备忘.md> --zip   # 授权闭环构建（对外分发）
```

Windows 前置：Rust (MSVC)、`D:\tools\llvm\bin`（clang-cl / llvm-rc，脚本自动注入 PATH）、
WebView2 Runtime（Win10/11 自带）。

## 目录结构

```
ui/            纯 HTML/JS/CSS 前端（无构建步骤；样式与交互动画规范见 ui/SPEC.md）
src-tauri/     Tauri 2 应用（独立 workspace，path 依赖仓库内核 crates）
scripts/       build.mjs 构建脚本
```
