docparser-sdk 0.1.0

docparser 一体化入口:一次依赖拿到 core + PDF + Office 后端,输出统一 IR
Documentation
//! `docparser-sdk`:docparser 的一体化入口。
//!
//! 只想「给个路径,拿回结构化文档」时用本 crate;需要按需裁剪依赖时直接用
//! `docparser-core` + 对应后端 crate。
//!
//! ```no_run
//! // 默认特性 = pdf + office,已注册全部内置后端
//! let doc = docparser_sdk::parse("report.docx").unwrap();
//! println!("{} blocks", doc.pages.iter().map(|p| p.blocks.len()).sum::<usize>());
//! println!("{}", docparser_sdk::emit::to_markdown(&doc));
//! ```
//!
//! 运行时依赖(不随 crate 分发):
//! * PDF:需要 PDFium 动态库,见 [`pdf::find_library`](`DOCPARSER_PDFIUM_LIB` 显式指定最稳);
//! * 扫描件 OCR:需要 `docparser-ocr` 可执行文件(`DOCPARSER_OCR_BIN`)与模型目录
//!   (`DOCPARSER_OCR_MODELS`),缺失时纯文本层解析不受影响。

pub use docparser_core as core;

pub use docparser_core::emit;
pub use docparser_core::engine::DocumentEngine;
pub use docparser_core::error::{DocError, ErrorCode, Result};
pub use docparser_core::model::{
    Block, BlockKind, DocMeta, Document, Image, Page, Rect, TableData,
};
pub use docparser_core::plugin::{
    BackendKind, FormatPlugin, ParseCapability, ProcessCapability, RawDoc, RawImage, RawPage,
    RawTextItem,
};
pub use docparser_core::policy::{BackendPolicy, Profile};
pub use docparser_core::registry::{Registry, RegistryError};

#[cfg(feature = "pdf")]
pub use docparser_pdf as pdf;

#[cfg(any(
    feature = "office",
    feature = "docx",
    feature = "xlsx",
    feature = "pptx"
))]
pub use docparser_office as office;

#[cfg(feature = "epub")]
pub use docparser_epub as epub;

/// 组装默认引擎:纯文本插件 + 已启用特性对应的后端(PDF / Office / EPUB)。
///
/// Office 侧只注册实际编译进来的格式(`office::FORMATS`),未启用的格式按 `unsupported` 返回。
pub fn engine() -> DocumentEngine {
    let mut reg = Registry::new();
    docparser_core::plugins::text::register_defaults(&mut reg);
    #[cfg(feature = "epub")]
    docparser_epub::register_defaults(&mut reg);
    #[cfg(feature = "pdf")]
    docparser_pdf::register_defaults(&mut reg);
    #[cfg(any(
        feature = "office",
        feature = "docx",
        feature = "xlsx",
        feature = "pptx"
    ))]
    docparser_office::register_defaults(&mut reg);
    DocumentEngine::new(reg)
}

/// 组装默认引擎并指定策略(后端链、超时、OCR 开关等)。
pub fn engine_with(policy: BackendPolicy) -> DocumentEngine {
    engine().with_policy(policy)
}

/// 解析单个文件为统一 IR(等价于 `engine().parse(path)`)。
pub fn parse(path: &str) -> Result<Document> {
    engine().parse(path)
}

/// 解析并直接输出 Markdown。
pub fn parse_markdown(path: &str) -> Result<String> {
    engine().parse(path).map(|d| emit::to_markdown(&d))
}

/// 解析并直接输出纯文本。
pub fn parse_text(path: &str) -> Result<String> {
    engine().parse(path).map(|d| emit::to_text(&d))
}

/// 解析并直接输出 JSON(与 CLI `--format json` 同构)。
pub fn parse_json(path: &str) -> Result<String> {
    let doc = engine().parse(path)?;
    serde_json::to_string(&doc).map_err(|e| DocError::corrupt(format!("序列化 IR 失败: {e}")))
}