【office2pdf】office2pdf 纯 Rust 实现的 Office 转 PDF 库

📦 项目地址

资源类型 地址
源码仓库 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-spreadsheetdocx-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> 纸张大小:a4letterlegal
--landscape 强制横向布局
--pdf-a 生成 PDF/A-2b 合规输出
--sheets <NAMES> XLSX 工作表过滤(逗号分隔)
--slides <RANGE> PPTX 幻灯片范围(如 1-53
--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

💡 适用场景

  1. 后端服务 --- 部署为独立 PDF 转换微服务,无需额外依赖
  2. 桌面应用 --- 集成到 Rust 桌面软件中提供原生转换能力
  3. Web 应用 --- 通过 WASM 在浏览器端直接转换,无需上传服务器
  4. 批处理脚本 --- 使用 CLI 工具批量处理大量 Office 文档

🔧 技术实现亮点

Workspace 架构

通过 Cargo Workspace 分离核心库和 CLI 工具,实现:

  • 代码复用:CLI 直接依赖核心库,避免重复实现
  • 独立发布:两个 crate 可分别发布到 crates.io
  • 统一配置 :共享 editionrust-versionlicense 等元数据

依赖修补策略

使用 [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 文档处理的优秀选择。

相关推荐
好家伙VCC7 小时前
# 发散创新:用 Rust实现高性能物理引擎的底层架构设计与实战在游戏开发、虚拟仿真和机器人控
java·开发语言·python·rust·机器人
优化控制仿真模型7 小时前
2026年初中英语大纲词汇表1600词
经验分享·pdf
优化控制仿真模型8 小时前
方正小标宋简体、仿宋GB2312和楷体_GB2312办公字体安装包下载安装教程
经验分享·pdf
代码羊羊8 小时前
Rust所有权与引用:核心要点速记
rust
王莎莎-MinerU8 小时前
MinerU 生态全景:Skills、RAG、MCP、Cursor Rules
人工智能·深度学习·计算机视觉·chatgpt·pdf·软件工程
浪客川9 小时前
【百例RUST - 009】容器 Vector
开发语言·rpc·rust
包子源10 小时前
React-PDF 与 Web 预览「像素级」对齐实践
前端·react.js·pdf
Rust研习社11 小时前
Rust Default 特征详解:轻松实现类型默认值
开发语言·后端·rust
Rust研习社11 小时前
Rust Copy 特征详解|新手必看!再也不与 Clone 混淆
后端·rust·编程语言