Skip to content

Конвертация 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)
Изображения плейсхолдер ![alt](filename) — см. «Изображения» ниже

Изображения

to_markdown() выдаёт плейсхолдеры с именем (например, ![](image1.png)), но не извлекает байты — 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