Миграция с Apache Tika
Apache Tika — де-факто JVM-библиотека для извлечения текста из огромного числа форматов — включая DOCX, XLSX, PPTX и устаревшие DOC, XLS, PPT. Если ваш пайплайн работает только с Office-документами, Office Oxide — правильная замена: те же шесть форматов, без JVM, нативная скорость, более простое развёртывание.
Когда мигрировать
Переходите, если что-то из этого про вас:
- Ваш инжест имеет дело только с Office-документами (вам не нужны PDF, EPUB, RTF, ODT и пр., которые также умеет Tika)
- Вы не хотите тащить и тюнить JVM в контейнер / Lambda / десктоп-приложение
- Вам нужны нативные биндинги для Python, Node.js, Go, C#, Rust — а не только Java-JAR
- Важна задержка на файл; старт JVM и прогрев Tika бьют по короткоживущим воркерам
- Хочется структурированного вывода Markdown / IR для пайплайнов LLM и RAG
Останьтесь на Tika, если:
- Вы переваривайте длинный хвост форматов, который Office Oxide не покрывает (Tika поддерживает ~1 400 типов)
- У вас уже есть JVM-сервис инжеста, и добавлять нативные биндинги — не та цена, что стоит архитектурных изменений
- Вы полагаетесь на MIME-детекцию Tika по этому длинному хвосту
Частый компромисс: оставить Tika для хвоста, а .docx / .xlsx / .pptx / .doc / .xls / .ppt (которые в большинстве корпоративных корпусов доминируют по объёму) отдать Office Oxide.
Установка
Python
pip install office-oxide
(Заменяет Python-обёртки tika или apache-tika плюс саму JVM, на которой они работали.)
Rust
[dependencies]
office_oxide = "0.1.0"
Java
Если вы на JVM всерьёз, используйте Office Oxide через его C-FFI плюс JNA / JNR-FFI. Либо запускайте office_oxide_cli как sidecar-процесс, общающийся через stdio — тот же движок, без JVM-мостового кода.
Сравнительная шпаргалка — Python
Обычный текст
Tika (REST-режим)
import tika
from tika import parser
tika.initVM() # старт JVM; ~1-2s на первом вызове
parsed = parser.from_file("report.docx")
text = parsed["content"]
metadata = parsed["metadata"]
office_oxide
from office_oxide import Document
with Document.open("report.docx") as doc:
text = doc.plain_text()
props = doc.as_docx().core_properties() # author, modified и т. д.
Ни старта JVM, ни REST-раундтрипа, извлечение за доли миллисекунды.
Входные байты (без временного файла)
Tika
import io, requests
from tika import parser
data = requests.get(url).content
parsed = parser.from_buffer(io.BytesIO(data))
office_oxide
import requests
from office_oxide import Document
data = requests.get(url).content
with Document.from_bytes(data, "docx") as doc:
print(doc.plain_text())
Сервер / пакетная обработка
Tika — обычно запускается в режиме tika-server за HTTP.
java -jar tika-server.jar -h 0.0.0.0 -p 9998
import requests
text = requests.put("http://localhost:9998/tika",
data=open("report.docx", "rb"),
headers={"Accept": "text/plain"}).text
office_oxide — выбрасывайте JVM и сервер, просто вызывайте библиотеку напрямую. Если нужна sidecar-архитектура (клиенты на разных языках), используйте MCP-сервер или CLI через stdio.
Сравнение — для пользователей JVM
Если у вас Java/Kotlin/Scala-пайплайн и отказываться от JVM не хочется:
- Оставьте Tika для всего, что не Office.
- Для Office-форматов вызывайте
office-oxide. Два варианта:- JNA / JNR-FFI поверх
liboffice_oxideи C-заголовкаinclude/office_oxide_c/office_oxide.h. Тот же C-API, что и у Go- и C#-биндингов. - Sidecar
office_oxide_cliчерезProcessBuilder. Стримите вход через stdin, читайте вывод со stdout. Тривиально перезапускается, изолирует сбои.
- JNA / JNR-FFI поверх
И тот и другой путь быстрее, чем запускать Tika на Office-форматах — и избавляет от странностей «JVM поверх JVM».
Что вы получаете по сравнению с Tika
| Tika | Office Oxide | |
|---|---|---|
| DOCX, XLSX, PPTX | ✓ | ✓ |
| Устаревшие DOC, XLS, PPT | ✓ | ✓ |
| PDF, EPUB, RTF, ODT и т. д. | ✓ | ✗ (для PDF см. pdf_oxide) |
| Извлечение обычного текста | ✓ | ✓ |
| Вывод в Markdown | частично | ✓ (встроенный to_markdown) |
| Структурированный IR / JSON | XHTML-SAX-события | ✓ (типизированный DocumentIR) |
| Поиск-и-замена для шаблонов | ✗ | ✓ (EditableDocument) |
| Запись ячеек (XLSX) | ✗ | ✓ (set_cell) |
| Конвертация legacy → modern | ✗ | ✓ (save_as) |
| Нужна JVM | ✓ | ✗ |
| Нативная скорость | накладные расходы JVM | <1 мс на файл |
Производительность (только Office-форматы)
Инжест миллиона Office-документов (смесь DOCX, XLSX, PPTX, DOC, XLS, PPT), измеренный против tika-server:
| Пайплайн | Wall time | Заметки |
|---|---|---|
| tika-server (REST), 8 воркеров | ~3 ч 40 мин | Включает накладные расходы HTTP |
| tika-app (in-process JVM), 8 воркеров | ~1 ч 50 мин | Лучший случай Tika |
| office_oxide, 8 воркеров | ~3 мин | Нативный парсинг |
Цифры зависят от микса форматов; для инжест-ориентированных Office-нагрузок разрыв обычно 30–60×.
См. также
- Бенчмарки производительности — полные числа по форматам
- Office для RAG — RAG-паттерны на замену Tika
- MCP-сервер — sidecar для кроссязычных пайплайнов