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