Convertir documentos Office a Markdown
Cada handle de Office Oxide incluye el método to_markdown(), que genera Markdown estilo GitHub — títulos, tablas, listas y bloques tipo código — desde cualquiera de los seis formatos soportados. Es el punto de entrada que la mayoría de los pipelines de LLM y RAG debería usar.
Llamada única
Rust
use office_oxide::to_markdown;
let md = to_markdown("report.docx")?;
std::fs::write("report.md", md)?;
Python
import office_oxide
md = office_oxide.to_markdown("report.docx")
open("report.md", "w").write(md)
JavaScript
import { toMarkdown } from 'office-oxide';
import { writeFileSync } from 'node:fs';
writeFileSync('report.md', toMarkdown('report.docx'));
Go
md, err := officeoxide.ToMarkdown("report.docx")
os.WriteFile("report.md", []byte(md), 0o644)
C#
File.WriteAllText("report.md", OfficeOxide.ToMarkdown("report.docx"));
C
int err = 0;
char *md = office_to_markdown("report.docx", &err); /* open + render in one call */
if (md) {
FILE *f = fopen("report.md", "w");
fputs(md, f);
fclose(f);
office_oxide_free_string(md);
}
Handle reutilizable
Rust
let doc = office_oxide::Document::open("deck.pptx")?;
let md = doc.to_markdown();
Python
from office_oxide import Document
with Document.open("deck.pptx") as doc:
md = doc.to_markdown()
JavaScript
using doc = Document.open('deck.pptx');
const md = doc.toMarkdown();
C
int err = 0;
OfficeDocumentHandle *doc = office_document_open("deck.pptx", &err);
if (doc) {
char *md = office_document_to_markdown(doc, &err);
if (md) { /* use md */ office_oxide_free_string(md); }
office_document_free(doc);
}
WASM
import { WasmDocument } from 'office-oxide-wasm';
// WASM has no file I/O — read the bytes yourself, then open from bytes
const data = new Uint8Array(await (await fetch('/deck.pptx')).arrayBuffer());
using doc = new WasmDocument(data, 'pptx');
const md = doc.toMarkdown();
Qué se genera
| Elemento origen | Markdown |
|---|---|
Título DOCX (<w:pStyle w:val="Heading1"/> …) |
# Heading (nivel según el estilo) |
| Párrafo DOCX | Un párrafo, guiones suaves eliminados |
| Ítem de lista DOCX | - item o 1. item (numeración preservada) |
| Tabla DOCX | Tabla en pipes GFM |
| Hoja XLSX | ## Sheet name + tabla en pipes por rango |
| Celdas combinadas XLSX | Contenido de la primera celda, span descartado |
| Diapositiva PPTX | ## Slide N + cuerpo, notas añadidas como blockquote |
| Tabla PPTX | Tabla en pipes GFM dentro de la diapositiva |
| Hyperlinks | [text](url) |
| Imágenes | placeholder  — ver “Imágenes” abajo |
Imágenes
to_markdown() emite placeholders con el nombre del archivo (p. ej. ), pero no extrae los bytes de la imagen — Markdown es un formato de texto. Para obtener las imágenes, usa el IR o el acceso por formato:
from office_oxide import Document
with Document.open("report.docx") as doc:
ir = doc.to_ir()
for section in ir["sections"]:
for el in section["elements"]:
if el["kind"] == "Image":
print(el["filename"], len(el["data"]))
Esquema completo en Extracción IR.
Casos de uso
- Ingesta para RAG — Markdown es el formato de entrada más amigable para LLMs. Una sola pasada por documento, estructura determinista, sin ruido HTML.
- Indexación de documentos — los títulos marcan fronteras naturales de chunk; las tablas siguen siendo consultables.
- Migraciones — DOCX → Markdown para generadores de sitio estático (Hugo, Astro, MkDocs).
- Diff de contenido — los diffs en Markdown son mucho más legibles que los diffs binarios de
.docx.
Rendimiento
to_markdown() corre en el mismo orden de magnitud que plain_text() — normalmente 1–2× el coste en el documento mediano. Cifras completas en Rendimiento.
Véase también
- Extracción HTML — cuando necesitas salida con estilos
- Extracción IR — JSON estructurado para pipelines más complejos
- PDF for RAG — librería compañera
pdf_oxidepara PDF