Migração a partir do Apache Tika
O Apache Tika é a biblioteca JVM de facto para extrair texto de uma enorme variedade de formatos — incluindo DOCX, XLSX, PPTX e DOC, XLS, PPT legados. Se o seu pipeline é exclusivo para documentos Office, o Office Oxide é a substituição certa: os mesmos seis formatos, sem JVM, velocidade nativa, implantação mais simples.
Quando migrar
Troque se qualquer uma destas condições se aplica:
- Seu pipeline de ingestão lida apenas com documentos Office (você não precisa de PDF, EPUB, RTF, ODT etc. que o Tika também cobre)
- Você não quer empacotar e ajustar uma JVM no seu container / Lambda / app desktop
- Você quer bindings nativos para Python, Node.js, Go, C#, ou Rust — não só um JAR Java
- Latência por arquivo importa; o custo de startup e o warm-up do JVM do Tika prejudicam workers de vida curta
- Você quer saída estruturada em Markdown / IR para pipelines de LLM e RAG
Fique no Tika se:
- Você ingere uma cauda longa de formatos que o Office Oxide não cobre (o Tika lida com ~1.400 tipos de arquivo)
- Já existe um serviço de ingestão JVM e adicionar bindings nativos não justifica a mudança arquitetural
- Você depende da detecção de MIME do Tika por toda essa cauda longa
Meio-termo comum: manter o Tika para a cauda longa e usar Office Oxide para .docx / .xlsx / .pptx / .doc / .xls / .ppt (que dominam o volume na maioria dos corpora corporativos).
Instalação
Python
pip install office-oxide
(Substitui os wrappers Python tika ou apache-tika, mais a JVM em que você os rodava.)
Rust
[dependencies]
office_oxide = "0.1.0"
Java
Se você é fiel à JVM, use o Office Oxide via seu C FFI com JNA / JNR-FFI. Ou rode office_oxide_cli como processo sidecar chamado via stdio — o mesmo engine, sem código de ponte para JVM.
Guia rápido lado a lado — Python
Texto puro
Tika (modo REST)
import tika
from tika import parser
tika.initVM() # startup da JVM; ~1-2s na primeira chamada
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.
Sem startup de JVM, sem ida-e-volta REST, extração em submilissegundos.
Entrada em bytes (sem arquivo temporário)
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 / processamento em lote
Tika — geralmente roda em modo tika-server atrás de 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 — largue a JVM e o servidor, apenas chame a biblioteca diretamente. Se precisa de arquitetura sidecar (clientes em várias linguagens), use o servidor MCP ou a CLI sobre stdio.
Lado a lado — usuários JVM
Se o seu pipeline é Java/Kotlin/Scala e você não quer abandonar a JVM:
- Mantenha o Tika para tudo que não for Office.
- Para formatos Office, chame
office-oxide. Duas opções:- JNA / JNR-FFI sobre
liboffice_oxidee o header C eminclude/office_oxide_c/office_oxide.h. A mesma API C usada pelos bindings Go e C#. - Sidecar
office_oxide_cliviaProcessBuilder. Faça stream da entrada via stdin, leia a saída via stdout. Reinicia trivialmente, isola crashes.
- JNA / JNR-FFI sobre
Ambos são mais rápidos que rodar o Tika para formatos Office — e evitam a estranheza de JVM-em-cima-de-JVM.
O que você ganha em relação ao Tika
| Tika | Office Oxide | |
|---|---|---|
| DOCX, XLSX, PPTX | ✓ | ✓ |
| DOC, XLS, PPT legados | ✓ | ✓ |
| PDF, EPUB, RTF, ODT etc. | ✓ | ✗ (para PDF use pdf_oxide) |
| Extração de texto puro | ✓ | ✓ |
| Saída Markdown | parcial | ✓ (embutido to_markdown) |
| IR / JSON estruturado | eventos XHTML SAX | ✓ (DocumentIR tipado) |
| Templating find-and-replace | ✗ | ✓ (EditableDocument) |
| Escrita de células (XLSX) | ✗ | ✓ (set_cell) |
| Conversão legado → moderno | ✗ | ✓ (save_as) |
| JVM necessária | ✓ | ✗ |
| Velocidade nativa | overhead da JVM | <1 ms por arquivo |
Desempenho (apenas formatos Office)
Uma ingestão de um milhão de documentos Office (mistura de DOCX, XLSX, PPTX, DOC, XLS, PPT) medida contra o tika-server:
| Pipeline | Wall time | Notas |
|---|---|---|
| tika-server (REST), 8 workers | ~3 h 40 m | Inclui overhead HTTP |
| tika-app (JVM in-process), 8 workers | ~1 h 50 m | Melhor caso do Tika |
| office_oxide, 8 workers | ~3 m | Parsing nativo |
Os números variam com o mix de formatos; para cargas de ingestão predominantemente Office a diferença costuma ser de 30–60×.
Veja também
- Benchmarks de desempenho — números completos por formato
- Office para RAG — padrões RAG em substituição ao Tika
- Servidor MCP — sidecar para pipelines multi-linguagem