Skip to main content

rust_docx/
lib.rs

1//! Native and WebAssembly-compatible Word document parsing, modeling, and serialization.
2
3pub mod bundle;
4pub mod chart;
5pub mod doc;
6pub mod emf;
7pub mod export;
8pub mod model;
9pub mod package;
10pub mod parse;
11pub mod review;
12pub mod revision_inlines;
13pub mod revisions;
14pub mod serialize;
15pub mod source_graph;
16pub mod structured;
17pub mod table_grid;
18mod wmf;
19pub mod xml;
20mod xml_index;
21pub mod zip;
22
23pub use bundle::{
24    extract_document_assets, extract_document_bundle, parse_document_bundle, DocumentBundle,
25    ExtractDocumentBundleOptions,
26};
27pub use export::{
28    export_document, ContentOverride, ExportOptions, ExportRequest, ExportedDocument, TableFormat,
29};
30pub use revision_inlines::{revision_inlines, InlineChange, RevisionInline};
31pub use chart::{extract_chart_data, ChartCategory, ChartData, ChartPoint, ChartSeries};
32pub use doc::{is_doc_format, parse_doc};
33pub use model::*;
34pub use package::*;
35pub use parse::{build_doc_model, build_doc_model_with_options};
36pub use rust_office_art::ParseOptions;
37pub use review::{extract_document_review, DocumentReview, DocumentComment, CommentTarget};
38pub use revisions::{
39    DocumentRevision, ReviewedDocument, RevisionKind, RevisionProperties, RevisionScope,
40    WordProperty,
41};
42pub use source_graph::{document_source_graph, DocumentSourceGraph};
43pub use structured::{
44    extract_document_blocks, extract_document_blocks_with_options,
45    extract_document_blocks_with_revisions, BlockDetails, BlockType, DocumentBlock, DocumentWord,
46    ExtractDocumentBlocksOptions, ParagraphDetails, ParagraphInline, SourceRef, StructuredDocument,
47    TableCellDetails,
48};
49
50pub fn parse_document_blocks(bytes: &[u8]) -> Result<StructuredDocument, String> {
51    parse_document_blocks_with_options(bytes, ExtractDocumentBlocksOptions::default())
52}
53
54pub fn parse_document_blocks_with_options(
55    bytes: &[u8],
56    options: ExtractDocumentBlocksOptions,
57) -> Result<StructuredDocument, String> {
58    let package = parse_document_bytes(bytes)?;
59    Ok(extract_document_blocks_with_options(
60        &build_doc_model_with_options(
61            &package,
62            &ParseOptions {
63                include_3d_models: options.include_3d_models,
64            },
65        ),
66        options,
67    ))
68}
69
70/// Parse Word bytes and return current blocks together with their tracked revisions.
71pub fn parse_document_blocks_with_revisions(
72    bytes: &[u8],
73    options: ExtractDocumentBlocksOptions,
74) -> Result<ReviewedDocument, String> {
75    let package = parse_document_bytes(bytes)?;
76    Ok(extract_document_blocks_with_revisions(
77        &build_doc_model_with_options(
78            &package,
79            &ParseOptions {
80                include_3d_models: options.include_3d_models,
81            },
82        ),
83        options,
84    ))
85}
86
87pub use serialize::{
88    can_preserve_image_paint_source, model_to_document_xml, serialize_doc_model, serialize_docx,
89    try_serialize_doc_model, validate_image_paint_bounds,
90};
91pub use zip::{create_minimal_docx_package, package_to_bytes, parse_docx};
92
93/// Parses either a DOCX (OOXML zip) or a legacy Word 97-2003 binary `.doc`
94/// file, detected by magic bytes, into the same in-memory package shape.
95pub fn parse_document_bytes(bytes: &[u8]) -> Result<OoxmlPackage, String> {
96    if is_doc_format(bytes) {
97        parse_doc(bytes)
98    } else {
99        parse_docx(bytes)
100    }
101}