Skip to main content

docparser_sdk/
lib.rs

1//! `docparser-sdk`:docparser 的一体化入口。
2//!
3//! 只想「给个路径,拿回结构化文档」时用本 crate;需要按需裁剪依赖时直接用
4//! `docparser-core` + 对应后端 crate。
5//!
6//! ```no_run
7//! // 默认特性 = pdf + office,已注册全部内置后端
8//! let doc = docparser_sdk::parse("report.docx").unwrap();
9//! println!("{} blocks", doc.pages.iter().map(|p| p.blocks.len()).sum::<usize>());
10//! println!("{}", docparser_sdk::emit::to_markdown(&doc));
11//! ```
12//!
13//! 运行时依赖(不随 crate 分发):
14//! * PDF:需要 PDFium 动态库,见 [`pdf::find_library`](`DOCPARSER_PDFIUM_LIB` 显式指定最稳);
15//! * 扫描件 OCR:需要 `docparser-ocr` 可执行文件(`DOCPARSER_OCR_BIN`)与模型目录
16//!   (`DOCPARSER_OCR_MODELS`),缺失时纯文本层解析不受影响。
17
18pub use docparser_core as core;
19
20pub use docparser_core::emit;
21pub use docparser_core::engine::DocumentEngine;
22pub use docparser_core::error::{DocError, ErrorCode, Result};
23pub use docparser_core::model::{
24    Block, BlockKind, DocMeta, Document, Image, Page, Rect, TableData,
25};
26pub use docparser_core::plugin::{
27    BackendKind, FormatPlugin, ParseCapability, ProcessCapability, RawDoc, RawImage, RawPage,
28    RawTextItem,
29};
30pub use docparser_core::policy::{BackendPolicy, Profile};
31pub use docparser_core::registry::{Registry, RegistryError};
32
33#[cfg(feature = "pdf")]
34pub use docparser_pdf as pdf;
35
36#[cfg(any(
37    feature = "office",
38    feature = "docx",
39    feature = "xlsx",
40    feature = "pptx"
41))]
42pub use docparser_office as office;
43
44#[cfg(feature = "epub")]
45pub use docparser_epub as epub;
46
47/// 组装默认引擎:纯文本插件 + 已启用特性对应的后端(PDF / Office / EPUB)。
48///
49/// Office 侧只注册实际编译进来的格式(`office::FORMATS`),未启用的格式按 `unsupported` 返回。
50pub fn engine() -> DocumentEngine {
51    let mut reg = Registry::new();
52    docparser_core::plugins::text::register_defaults(&mut reg);
53    #[cfg(feature = "epub")]
54    docparser_epub::register_defaults(&mut reg);
55    #[cfg(feature = "pdf")]
56    docparser_pdf::register_defaults(&mut reg);
57    #[cfg(any(
58        feature = "office",
59        feature = "docx",
60        feature = "xlsx",
61        feature = "pptx"
62    ))]
63    docparser_office::register_defaults(&mut reg);
64    DocumentEngine::new(reg)
65}
66
67/// 组装默认引擎并指定策略(后端链、超时、OCR 开关等)。
68pub fn engine_with(policy: BackendPolicy) -> DocumentEngine {
69    engine().with_policy(policy)
70}
71
72/// 解析单个文件为统一 IR(等价于 `engine().parse(path)`)。
73pub fn parse(path: &str) -> Result<Document> {
74    engine().parse(path)
75}
76
77/// 解析并直接输出 Markdown。
78pub fn parse_markdown(path: &str) -> Result<String> {
79    engine().parse(path).map(|d| emit::to_markdown(&d))
80}
81
82/// 解析并直接输出纯文本。
83pub fn parse_text(path: &str) -> Result<String> {
84    engine().parse(path).map(|d| emit::to_text(&d))
85}
86
87/// 解析并直接输出 JSON(与 CLI `--format json` 同构)。
88pub fn parse_json(path: &str) -> Result<String> {
89    let doc = engine().parse(path)?;
90    serde_json::to_string(&doc).map_err(|e| DocError::corrupt(format!("序列化 IR 失败: {e}")))
91}