k2f_docx 0.2.2

K2F lock → DOCX exporter
Documentation
use crate::classify::classify_opened;
use crate::ooxml;
use crate::DocxError;
use k2f_paint::OpenedDocument;
use std::io::Cursor;
use zip::ZipArchive;

pub fn export_bytes(package_bytes: &[u8]) -> Result<Vec<u8>, DocxError> {
    if looks_like_docx(package_bytes) {
        return Err(DocxError::NotASource);
    }
    export_opened(&OpenedDocument::open(package_bytes)?)
}

pub fn export_opened(doc: &OpenedDocument) -> Result<Vec<u8>, DocxError> {
    if doc.fonts().is_empty() {
        return Err(DocxError::NoFont);
    }
    let ir = classify_opened(doc)?;
    let files = ooxml::build_package(&ir);
    ooxml::write_deterministic_zip(&files)
}

fn looks_like_docx(bytes: &[u8]) -> bool {
    let Ok(zip) = ZipArchive::new(Cursor::new(bytes)) else {
        return false;
    };
    let has_document = zip
        .file_names()
        .any(|n| n == "word/document.xml" || n == "word\\document.xml");
    has_document
}