Конвертация Office-документов в Markdown
У каждого handle Office Oxide есть метод to_markdown(), который выдаёт GitHub-flavored Markdown — заголовки, таблицы, списки и код-подобные блоки — из любого из шести поддерживаемых форматов. Это правильная точка входа для большинства LLM и RAG-пайплайнов.
Одноразовый вызов
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"));
Переиспользуемый handle
Python
from office_oxide import Document
with Document.open("deck.pptx") as doc:
md = doc.to_markdown()
Rust
let doc = office_oxide::Document::open("deck.pptx")?;
let md = doc.to_markdown();
JavaScript
using doc = Document.open('deck.pptx');
const md = doc.toMarkdown();
Что попадёт в вывод
| Исходный элемент | Markdown |
|---|---|
Заголовок DOCX (<w:pStyle w:val="Heading1"/> …) |
# Заголовок (уровень соответствует стилю) |
| Абзац DOCX | Один параграф, soft-hyphen вырезается |
| Пункт списка DOCX | - пункт или 1. пункт (нумерация сохраняется) |
| Таблица DOCX | GFM pipe-таблица |
| Лист XLSX | ## Имя листа + pipe-таблица на каждый диапазон |
| Объединённые ячейки XLSX | Содержимое первой ячейки, span отбрасывается |
| Слайд PPTX | ## Слайд N + body, заметки приклеиваются как blockquote |
| Таблица PPTX | GFM pipe-таблица inline в слайде |
| Гиперссылки | [текст](url) |
| Изображения | плейсхолдер  — см. «Изображения» ниже |
Изображения
to_markdown() выдаёт плейсхолдеры с именем (например, ), но не извлекает байты — Markdown это текстовый формат. Чтобы вытащить изображения, используйте IR или формат-специфичный доступ:
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"]))
Полная схема — IR-извлечение.
Сценарии
- RAG-ингест — Markdown самый дружественный к LLM формат. Один проход на документ, детерминированная структура, без HTML-шума.
- Индексация — заголовки задают естественные границы чанков, таблицы остаются queryable.
- Миграции — DOCX → Markdown для статических генераторов (Hugo, Astro, MkDocs).
- Diff контента — Markdown-диффы куда читаемее бинарных
.docx-диффов.
Производительность
to_markdown() стоит примерно того же порядка, что и plain_text() — обычно 1–2× на медианном документе. Полные числа — в Производительности.
Смотрите также
- HTML-извлечение — когда нужен стилизованный вывод
- IR-извлечение — структурированный JSON для богатых пайплайнов
- PDF for RAG — для PDF используйте библиотеку-компаньон
pdf_oxide