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

相关推荐
E_ICEBLUE3 小时前
在 Python 中转换 XML 为 PDF 文档:基础转换与转换设置
xml·python·pdf
洛依尘3 小时前
深入浅出 Rust 生命周期:它不是语法负担,而是借用关系的说明书
后端·rust
Rust研习社3 小时前
通过示例学习 Rust 模式匹配
rust
PaytonD4 小时前
基于 GPUI 实现 WebScoket 服务端之服务篇
后端·rust
开开心心就好4 小时前
模拟真人手写软件,支持随机调节
运维·服务器·windows·gitee·pdf·开源·excel
予你@。4 小时前
vue 使用html2canvas + jsPDF 将html导出为pdf (延伸问题)
vue.js·pdf·html
Lana学习中4 小时前
[AI编程]纯前端JS实现评论区自动截图&生成 PDF
前端·javascript·pdf·vibe coding
Source.Liu4 小时前
【Acadrust】Rust 语言的高性能 CAD 库
rust·acadrust
dy17175 小时前
前端PDF下载、打印界面
前端·pdf