Converter documentos Office para Markdown
Todo handle do Office Oxide tem o método to_markdown(), que produz Markdown estilo GitHub — títulos, tabelas, listas e blocos parecidos com código — a partir de qualquer um dos seis formatos suportados. É o ponto de entrada que a maioria dos pipelines de LLM e RAG deveria usar.
Chamada ú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 reutilizável
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();
O que é gerado
| Elemento de origem | Markdown |
|---|---|
Título DOCX (<w:pStyle w:val="Heading1"/> …) |
# Heading (nível conforme o estilo) |
| Parágrafo DOCX | Um parágrafo, hífens suaves removidos |
| Item de lista DOCX | - item ou 1. item (numeração preservada) |
| Tabela DOCX | Tabela em pipes GFM |
| Planilha XLSX | ## Sheet name + tabela em pipes por intervalo |
| Células mescladas em XLSX | Conteúdo da primeira célula, span descartado |
| Slide PPTX | ## Slide N + corpo, notas anexadas como blockquote |
| Tabela PPTX | Tabela em pipes GFM dentro do slide |
| Hyperlinks | [text](url) |
| Imagens | placeholder  — veja “Imagens” abaixo |
Imagens
to_markdown() emite placeholders com o nome do arquivo (ex.: ), mas não extrai os bytes da imagem — Markdown é um formato de texto. Para puxar as imagens, use o IR ou o acesso específico 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 em Extração IR.
Casos de uso
- Ingestão para RAG — Markdown é o formato de entrada mais amigável para LLMs. Uma passagem por documento, estrutura determinística, sem ruído de HTML.
- Indexação de documentos — títulos criam fronteiras naturais para chunks; tabelas continuam consultáveis.
- Migrações — DOCX → Markdown para geradores de site estático (Hugo, Astro, MkDocs).
- Diff de conteúdo — diffs em Markdown são muito mais legíveis do que diffs binários de
.docx.
Performance
to_markdown() roda na mesma ordem de grandeza de plain_text() — tipicamente 1–2× o custo no documento mediano. Números completos em Performance.
Veja também
- Extração HTML — quando você precisa de saída estilizada
- Extração IR — JSON estruturado para pipelines mais ricos
- PDF for RAG — biblioteca companheira
pdf_oxidepara PDF