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}