📦 项目地址
| 资源类型 | 地址 |
|---|---|
| 源码仓库 | https://github.com/developer0hye/office2pdf |
| crates.io | https://crates.io/crates/office2pdf |
| 文档地址 | https://docs.rs/office2pdf |
🏗️ 项目结构
根据 Cargo.toml 配置,项目采用 Cargo Workspace 管理,包含两个核心成员:
| 成员 | 路径 | 说明 |
|---|---|---|
| 核心库 | crates/office2pdf |
提供转换功能的 Rust 库,可嵌入其他项目 |
| 命令行工具 | crates/office2pdf-cli |
基于核心库构建的 CLI 工具,独立使用 |
🔧 依赖管理(Patch 机制)
项目通过 [patch.crates-io] 精确控制关键依赖,确保转换质量和稳定性:
| 依赖库 | 作用 | Patch 来源 | 修复目的 |
|---|---|---|---|
umya-spreadsheet |
XLSX 文件解析 | developer0hye/umya-spreadsheet fix/panic-safety-v2 |
修复 panic 安全性问题,增强条件格式(DataBar、IconSet)解析 |
docx-rs |
DOCX 文件解析 | developer0hye/docx-rs fix/parse-tolerance |
增强解析容错性,处理格式不规范的 Word 文档,支持嵌入式字体提取 |
这种设计保证了底层解析库的稳定性,同时不影响使用 office2pdf 作为依赖的外部项目。
✨ 核心特性
纯 Rust 实现 · 零外部依赖 · 无需 LibreOffice/Chromium/Docker
| 格式 | 支持的功能 |
|---|---|
| DOCX | 段落、行内格式(粗体/斜体/下划线/颜色)、表格、图片、列表、页眉/页脚、页面设置 |
| PPTX | 幻灯片、文本框、形状、表格(含主题样式)、图片、幻灯片母版、演讲者备注、渐变背景、阴影/反射效果 |
| XLSX | 工作表、单元格格式、合并单元格、列宽/行高、条件格式(数据条、图标集) |
🎯 高级功能
- PDF/A-2b --- 归档级 PDF 输出支持
- 嵌入式字体提取 --- 自动提取 DOCX/PPTX 中嵌入的字体并用于转换
- macOS Office 字体自动发现 --- 自动搜索 PowerPoint/Word/Excel 捆绑字体和 Office 云字体缓存
- WASM 支持 --- 可在浏览器和 Node.js 中运行(通过可选
wasm特性) - 跨平台 --- Windows / Linux / macOS 原生支持
📋 版本与兼容性
根据 Cargo.toml 配置:
| 配置项 | 值 | 说明 |
|---|---|---|
| Rust Edition | 2024 | 使用最新的 Rust 语言标准 |
| MSRV | 1.89 | 最低支持的 Rust 编译器版本 |
| 最新版本 | v0.5.0(2026-03-15) | 持续迭代更新 |
📥 安装方式
作为 Rust 库
在 Cargo.toml 中添加:
toml
[dependencies]
office2pdf = "0.4"
💡 注意 :如果您的项目与
office2pdf使用相同的依赖(如umya-spreadsheet、docx-rs),Cargo 会自动合并依赖版本,无需额外配置。
命令行工具
bash
cargo install office2pdf-cli
浏览器/WASM
bash
wasm-pack build crates/office2pdf --target web --features wasm
🚀 快速上手
库使用示例
rust
// 最简单的转换
use office2pdf::convert;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let result = convert("report.docx")?;
std::fs::write("report.pdf", result.pdf)?;
Ok(())
}
rust
// 带选项的转换
use office2pdf::config::{ConvertOptions, PaperSize};
let options = ConvertOptions {
paper_size: Some(PaperSize::A4),
..Default::default()
};
let result = office2pdf::convert_with_options("slides.pptx", &options)?;
std::fs::write("slides.pdf", result.pdf)?;
rust
// 内存转换(字节流)
use office2pdf::config::Format;
let docx_bytes = std::fs::read("report.docx")?;
let result = office2pdf::convert_bytes(
&docx_bytes,
Format::Docx,
&ConvertOptions::default(),
)?;
std::fs::write("report.pdf", result.pdf)?;
CLI 使用示例
bash
# 单文件转换
office2pdf report.docx
# 指定输出路径
office2pdf report.docx -o output.pdf
# 批量转换
office2pdf *.docx --outdir pdfs/
# 高级选项
office2pdf slides.pptx --paper a4 --landscape # A4 横版
office2pdf spreadsheet.xlsx --sheets "Sheet1,Summary" # 指定工作表
office2pdf document.docx --pdf-a # PDF/A-2b 格式
office2pdf report.docx --font-path /usr/share/fonts/custom # 自定义字体
WASM 使用示例(浏览器)
javascript
import init, { convertDocxToPdf, convertToPdf } from './pkg/office2pdf.js';
await init();
// 转换 DOCX
const docxBytes = new Uint8Array(await file.arrayBuffer());
const pdfBytes = convertDocxToPdf(docxBytes);
// 或使用通用 API
const pdfBytes2 = convertToPdf(xlsxBytes, "xlsx");
// 下载 PDF
const blob = new Blob([pdfBytes], { type: 'application/pdf' });
const url = URL.createObjectURL(blob);
window.open(url);
⚙️ CLI 选项完整列表
| 选项 | 说明 |
|---|---|
-o, --output <PATH> |
输出文件路径(仅单文件输入) |
--outdir <DIR> |
批量转换时的输出目录 |
--paper <SIZE> |
纸张大小:a4、letter、legal |
--landscape |
强制横向布局 |
--pdf-a |
生成 PDF/A-2b 合规输出 |
--sheets <NAMES> |
XLSX 工作表过滤(逗号分隔) |
--slides <RANGE> |
PPTX 幻灯片范围(如 1-5 或 3) |
--font-path <DIR> |
额外字体目录(可重复使用) |
📊 项目信息
| 项目属性 | 值 |
|---|---|
| 最新版本 | v0.5.0(2026-03-15) |
| 开源协议 | Apache License 2.0 |
| Stars / Forks | 39 / 2 |
| 编程语言 | Rust 99.5% |
| 作者 | Yonghye Kwon (developer0hye) |
| Rust Edition | 2024 |
| MSRV | 1.89 |
💡 适用场景
- 后端服务 --- 部署为独立 PDF 转换微服务,无需额外依赖
- 桌面应用 --- 集成到 Rust 桌面软件中提供原生转换能力
- Web 应用 --- 通过 WASM 在浏览器端直接转换,无需上传服务器
- 批处理脚本 --- 使用 CLI 工具批量处理大量 Office 文档
🔧 技术实现亮点
Workspace 架构
通过 Cargo Workspace 分离核心库和 CLI 工具,实现:
- 代码复用:CLI 直接依赖核心库,避免重复实现
- 独立发布:两个 crate 可分别发布到 crates.io
- 统一配置 :共享
edition、rust-version、license等元数据
依赖修补策略
使用 [patch.crates-io] 确保关键依赖的稳定性:
- 精准控制:在不发布上游新版本的情况下应用修复
- 临时方案:待上游合并后可移除 patch
- 透明性:用户无感知,但保证转换质量
字体处理
- 嵌入式字体提取:自动从 PPTX/DOCX 中提取并去混淆
- macOS 智能发现:自动搜索 Office 应用字体和云字体缓存
- 跨平台字体回退:统一的多平台字体处理逻辑
📄 许可证
Licensed under Apache License, Version 2.0.
总结 :
office2pdf是一个纯 Rust 实现的 Office 文档转 PDF 库,通过 Workspace 管理核心库和 CLI,使用 Patch 机制精确控制关键依赖,支持 DOCX、PPTX、XLSX 格式,并提供库、CLI 和 WASM 三种使用方式。其零外部依赖、高保真转换和跨平台特性,使其成为 Rust 生态中 Office 文档处理的优秀选择。