Skip to content

Migración desde Apache Tika

Apache Tika es la biblioteca JVM de referencia para extraer texto de una enorme variedad de formatos — incluidos DOCX, XLSX, PPTX y los formatos heredados DOC, XLS, PPT. Si tu pipeline solo procesa documentos Office, Office Oxide es el reemplazo adecuado: los mismos seis formatos, sin JVM, velocidad nativa y despliegue mucho más sencillo.

Cuándo migrar

Haz el cambio si alguna de estas condiciones aplica:

  • Tu pipeline de ingesta solo maneja documentos Office (no necesitas PDF, EPUB, RTF, ODT, etc., que Tika también soporta)
  • No quieres empaquetar ni configurar una JVM en tu contenedor / Lambda / app de escritorio
  • Necesitas bindings nativos en Python, Node.js, Go, C# o Rust — no solo un JAR de Java
  • La latencia por archivo importa; el coste de arranque y el calentamiento de la JVM de Tika penalizan a los workers de vida corta
  • Quieres salida estructurada en Markdown / IR para pipelines de LLM y RAG

Quédate con Tika si:

  • Ingestas una cola larga de formatos que Office Oxide no cubre (Tika maneja aproximadamente 1.400 tipos de archivo)
  • Ya tienes un servicio de ingesta en JVM y agregar bindings nativos no justifica el cambio arquitectónico
  • Dependes de la detección MIME de Tika en esa cola larga

Punto intermedio habitual: mantener Tika para los formatos poco frecuentes y usar Office Oxide para .docx / .xlsx / .pptx / .doc / .xls / .ppt, que dominan el volumen en la mayoría de los corpus empresariales.

Instalación

Python

pip install office-oxide

(Reemplaza los wrappers Python tika o apache-tika y también la JVM sobre la que los ejecutabas.)

Rust

[dependencies]
office_oxide = "0.1.0"

Java

Si prefieres seguir en la JVM, usa Office Oxide a través de su C FFI junto con JNA / JNR-FFI. También puedes ejecutar office_oxide_cli como proceso sidecar invocado vía stdio — el mismo motor, sin ningún código puente a la JVM.

Comparativa rápida — Python

Texto plano

Tika (modo REST)

import tika
from tika import parser

tika.initVM()    # JVM startup; ~1-2s on first call
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, etc.

Sin arranque de JVM, sin ida y vuelta REST, extracción en submilisegundos.

Entrada por bytes (sin archivo temporal)

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())

Servidor / procesamiento por lotes

Tika — normalmente se ejecuta en modo tika-server detrás de un endpoint 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 — olvídate de la JVM y el servidor, simplemente llama a la biblioteca de forma directa. Si necesitas una arquitectura sidecar (clientes independientes del lenguaje), usa el servidor MCP o la CLI vía stdio.

Comparativa para usuarios de JVM

Si tu pipeline es Java/Kotlin/Scala y no quieres abandonar la JVM:

  • Deja Tika para todo lo que no sea Office.
  • Para formatos Office, llama a office-oxide. Dos opciones:
    • JNA / JNR-FFI contra liboffice_oxide y el header C en include/office_oxide_c/office_oxide.h. La misma API en C que usan los bindings de Go y C#.
    • Sidecar office_oxide_cli vía ProcessBuilder. Envía la entrada por stdin, lee la salida por stdout. Reinicio trivial, los fallos quedan aislados.

Ambas opciones son más rápidas que correr Tika para formatos Office — y evitan las rarezas propias de JVM sobre JVM.

Qué obtienes frente a Tika

Tika Office Oxide
DOCX, XLSX, PPTX
DOC, XLS, PPT heredados
PDF, EPUB, RTF, ODT, etc. ✗ (para PDF usa pdf_oxide)
Extracción de texto plano
Salida en Markdown parcial ✓ (integrado to_markdown)
IR / JSON estructurado eventos XHTML SAX ✓ (DocumentIR tipado)
Plantillas con buscar y reemplazar ✓ (EditableDocument)
Escritura de celdas (XLSX) ✓ (set_cell)
Conversión heredado → moderno ✓ (save_as)
JVM requerida
Velocidad nativa overhead de JVM menos de 1 ms por archivo

Rendimiento (solo formatos Office)

Ingesta de un millón de documentos Office (mezcla de DOCX, XLSX, PPTX, DOC, XLS, PPT) medida frente a tika-server:

Pipeline Tiempo real Notas
tika-server (REST), 8 workers ~3 h 40 m Incluye overhead HTTP
tika-app (JVM en proceso), 8 workers ~1 h 50 m Mejor escenario de Tika
office_oxide, 8 workers ~3 m Parseo nativo

Los números varían según la mezcla de formatos; en cargas de ingesta predominantemente Office la diferencia suele ser de 30–60 veces.

Ver también