Rust 中使用 anydoc - cargo 文档转 Markdown
API 参考Rust
anydoc 的 Rust crate 就叫 anydoc,它是整个库的原生形态——其他语言绑定(Node/Python/WASM)都是它的编译产物。Rust 里用,性能是天花板。
安装
cargo add anydoc三个核心 API
use anydoc::ConvertError;
fn main() -> Result<(), ConvertError> {
// 1. 从路径转
let markdown = anydoc::to_markdown("report.docx")?;
println!("{markdown}");
// 2. 从字节转
let bytes = std::fs::read("slides.pptx")?;
let md = anydoc::to_markdown_bytes(&bytes, None)?;
// 3. 停在文档模型(保留嵌入资源)
let document = anydoc::to_document(&bytes, None)?;
// document 上保留图片/嵌入对象的原始字节与媒体类型
Ok(())
}错误处理
match anydoc::to_markdown("scanned.pdf") {
Ok(md) => println!("{md}"),
Err(ConvertError::Unsupported) => println!("不支持的格式或扫描版 PDF"),
Err(ConvertError::Malformed) => println!("文件损坏"),
Err(e) => println!("其他错误: {e:?}"),
}ConvertError 枚举六种变体:Unsupported、Malformed、Encrypted、ResourceLimit、MissingPart、Io,含义见错误处理与限制。
嵌入资源怎么落盘
let document = anydoc::to_document(&bytes, None)?;
// 遍历文档模型的资源节点(示意)
for asset in document.assets() {
// asset.bytes: 原始字节
// asset.media_type: 媒体类型,如 "image/png"
std::fs::write(format!("assets/{}", asset.name), &asset.bytes)?;
}Markdown 输出中这些资源以 alt 文本呈现,原始字节只在文档模型上。
常见场景
CLI 工具
let args: Vec<String> = std::env::args().collect();
let md = anydoc::to_markdown(&args[1])?;
print!("{md}"); // 管道友好,配合 shell 直接重定向WebAssembly 背后的 Rust 代码
Rust 版编译成 wasm 就是浏览器版 @firecrawl/anydoc-wasm。想自定义 wasm 行为(比如改资源策略),直接从源码编译你自己的版本。
小提示
to_markdown_bytes/to_document的第二个参数是配置项,先传None用默认- 编译产物同时覆盖原生库与 wasm,Rust 是"一处实现、处处分发"的源头
- 在服务端并发场景,
rayon或tokio::spawn_blocking配合任意使用