Skip to main content

k2f_docx/
export.rs

1use crate::classify::classify_opened;
2use crate::ooxml;
3use crate::DocxError;
4use k2f_paint::OpenedDocument;
5use std::io::Cursor;
6use zip::ZipArchive;
7
8pub fn export_bytes(package_bytes: &[u8]) -> Result<Vec<u8>, DocxError> {
9    if looks_like_docx(package_bytes) {
10        return Err(DocxError::NotASource);
11    }
12    export_opened(&OpenedDocument::open(package_bytes)?)
13}
14
15pub fn export_opened(doc: &OpenedDocument) -> Result<Vec<u8>, DocxError> {
16    if doc.fonts().is_empty() {
17        return Err(DocxError::NoFont);
18    }
19    let ir = classify_opened(doc)?;
20    let files = ooxml::build_package(&ir);
21    ooxml::write_deterministic_zip(&files)
22}
23
24fn looks_like_docx(bytes: &[u8]) -> bool {
25    let Ok(zip) = ZipArchive::new(Cursor::new(bytes)) else {
26        return false;
27    };
28    let has_document = zip
29        .file_names()
30        .any(|n| n == "word/document.xml" || n == "word\\document.xml");
31    has_document
32}