Skip to content

Миграция с 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. Тривиально перезапускается, изолирует сбои.

И тот и другой путь быстрее, чем запускать 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×.

См. также