MrSrsen/rpt-rs
GitHub: MrSrsen/rpt-rs
一个纯 Rust 编写的 SAP Crystal Reports(.rpt)文件解析库与 CLI 工具,无需 SAP 运行时或 Windows 环境即可跨平台读取、解码和导出报表定义。
Stars: 6 | Forks: 0
# rpt-rs
[](LICENSE)

一个纯 Rust 库和命令行工具,用于在无需 SAP runtime、数据库连接或任何 Windows 组件的情况下读取 **SAP Crystal Reports (`.rpt`)** 文件。
`.rpt` 是一种未公开的加密二进制格式。`rpt-rs` 可以打开文件,解密并解压其 stream,解码内部 record 结构,并将其投射到一个可供您检查或导出的类型化报表模型中。
## 它的功能
- **直接读取 `.rpt`** — 打开 OLE/CFB 复合文件,解密报表 stream,将其解压并解码内部 record。无需 SAP DLL,无需数据库,跨平台支持。
- **构建类型化模型** — 将 record 投射到结构化的报表模型中:数据源和表、参数、公式、分组、节以及布局好的报表对象。
- **导出为 XML** — 将模型序列化为结构化的 XML 文档,以便检查或在版本控制中对比报表定义。
- **通过 CLI 检查** — 总结报表,列出其参数,并以文本或 JSON 格式转储 stream 和恢复的字符串。
- **无损往返** — 精确保留每一个 record,包括尚未建模的 record 类型,因此在读取时不会丢失任何内容。
## Workspace
| Crate | 功能描述 |
| ------------ | ------------------------------------------------------------------------------------ |
| `rpt` | 核心库:container → 解密 → record → 类型化模型。 |
| `rpt-engine` | 基于模型计算的派生分析(例如字段使用计数、公式分析)。 |
| `rpt-to-xml` | XML 导出器(二进制)。 |
| `rpt-cli` | 检查 CLI(二进制文件:`rpt`)。 |
## 从源码构建
该 crate 尚未发布到 crates.io,因此请从源码构建(或使用下文的 Docker)。在安装了 Rust 工具链的情况下:
```
cargo build --release
```
这会将两个独立的二进制文件写入 `target/release/`:
- `rpt` — 检查 CLI
- `rpt-to-xml` — XML 导出器
## 用法
直接运行构建好的二进制文件 — 运行时无需 cargo:
```
# Inspect 一个 report
./target/release/rpt inspect report.rpt
# 以 JSON 格式列出 report 的参数
./target/release/rpt inputs report.rpt --json
# Export 为 XML
./target/release/rpt-to-xml report.rpt out.xml
```
作为库使用:
```
let rpt = rpt::Rpt::open("report.rpt")?;
let report = rpt.report();
println!("{}", report.summary_info.title.as_deref().unwrap_or(""));
```
## Docker
没有 Rust 环境?多阶段构建会生成一个小巧的镜像(约 14 MB),其中仅包含两个静态链接的二进制文件 —
没有工具链、shell 或 OS 包。
```
docker build -t rpt-rs .
# Inspect 一个 report(将其所在的目录挂载为 /data)
docker run --rm -v "$PWD:/data" rpt-rs rpt inspect report.rpt
# Export 为 XML
docker run --rm -v "$PWD:/data" rpt-rs rpt-to-xml report.rpt out.xml
```
`rpt` 和 `rpt-to-xml` 都在镜像的 `PATH` 中;您可以覆盖命令来运行其中任意一个。
每次发布时,预构建的镜像都会发布到 GitHub Container Registry:
```
docker pull ghcr.io/mrsrsen/rpt-rs:latest
```
## 文档
完整的技术文档位于 [`docs/`](docs/):
- [文档索引](docs/README.md)
- [格式概述](docs/01-format-overview.md) — `.rpt` 是什么以及解码是如何端到端工作的
- [Container](docs/02-container.md) — CFB 复合文件及其 stream
- [Stream 解码](docs/03-stream-decoding.md) — 加密、压缩和 record 帧
- [Record 树](docs/04-record-tree.md) — record 嵌套、掩码和无损基底
- [语义模型](docs/05-semantic-model.md) — 将 record 投射到报表模型中
- [Block 目录](docs/06-block-catalog.md) — 每个已解码的 record 类型、其含义及其布局
- [代码库](docs/07-codebase.md) — crate 和模块
- [用法](docs/08-usage.md) — CLI 工具和库 API
- [支持矩阵](docs/09-support-matrix.md) — 支持和不支持的内容
## 贡献
有关如何构建、测试和构建更改结构的信息,请参阅 [CONTRIBUTING.md](CONTRIBUTING.md)。
## License
MPL-2.0。
标签:Rust, SAP Crystal Reports, XML导出, 可视化界面, 数据提取, 文件解析, 文档结构分析, 网络流量审计, 请求拦截, 通知系统