O poder do Apache Tika: extraindo texto e metadados de arquivos em Java

Você já se perguntou como extrair texto e metadados de diversos formatos de arquivos (PDF, DOC, HTML, imagens etc.) de forma rápida e prática? O Apache Tika é uma ferramenta open source da Fundação Apache que faz exatamente isso: ele consegue, de forma automática, “descobrir” o tipo de arquivo que está lendo, extrair o conteúdo (texto) e também metadados (autor, data de criação, etc.).
Neste post, vamos ver como configurar e utilizar o Apache Tika, dando o pontapé inicial em uma série onde, em um próximo artigo, vamos extrair os posts do blog, indexá-los no Typesense e integrar tudo isso com o ChatGPT para realizar buscas de maneira mais inteligente.
O que é o Apache Tika?
O Apache Tika é um framework para detecção e extração de conteúdo de diferentes tipos de documentos. Ele funciona como uma camada de abstração que permite que você se concentre na lógica da aplicação, enquanto o Tika cuida da parte de “parsear” cada tipo de arquivo de forma apropriada.
Vantagens
-
Detecção automática de tipo de arquivo: Por meio do
AutoDetectParser
, o Tika faz a leitura da “assinatura” do arquivo para descobrir se é PDF, HTML, DOC, DOCX, CSV etc. -
Extração de texto: Ele transforma arquivos binários, como PDFs, em texto legível.
-
Extração de metadados: Autor, data de criação, conteúdo de tags e muito mais podem ser recuperados.
-
Suporte a diversos formatos: Vão desde PDF, Word, Excel, PowerPoint até imagens (OCR opcional) e muitos outros formatos.
Casos de uso
-
Motores de busca: Se você precisa criar um sistema de busca (search engine) de documentos, o Tika pode extrair o texto desses arquivos para depois indexá-los em uma ferramenta como o Typesense, Elasticsearch ou Solr.
-
Análise de dados: Para análise de conteúdo ou metadados de uma grande quantidade de documentos.
-
Digitalização de arquivos: Quando combinado com OCR (Optical Character Recognition), é possível extrair texto de PDFs escaneados e imagens.
-
Integração com ChatGPT e outras IAs: Extrair o texto para alimentar modelos de linguagem, como exploraremos em posts futuros.
Configuração do Maven
Abaixo está um exemplo de configuração do pom.xml
para incluir o Apache Tika em um projeto Maven. Observe que a versão utilizada aqui é a 3.0.0
, e que estamos puxando tanto o módulo tika-core
quanto o tika-parsers-standard-package
, que contém parsers para os formatos mais comuns.
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.gasparbarancelli</groupId>
<artifactId>demo-apache-tika</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>demo-apache-tika</name>
<url>http://maven.apache.org</url>
<properties>
<maven.compiler.parameters>true</maven.compiler.parameters>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<java.version>21</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<tika.version>3.0.0</tika.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-core</artifactId>
<version>${tika.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-parsers-standard-package</artifactId>
<version>${tika.version}</version>
</dependency>
</dependencies>
</project>
-
tika-core
: Contém as classes principais para parse de documentos e detecção de tipo. -
tika-parsers-standard-package
: Inclui os parsers para diversos formatos populares (PDF, HTML, DOC/DOCX etc.).
Exemplo de Código
O código abaixo demonstra como extrair dados de dois arquivos:
-
Um HTML (neste caso, a página About do meu próprio site em https://gasparbarancelli.com/about).
-
Um PDF (local,
post-spring-ai-vector-database.pdf
).
package com.gasparbarancelli;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.parser.AutoDetectParser;
import org.apache.tika.parser.ParseContext;
import org.apache.tika.sax.BodyContentHandler;
import java.io.FileInputStream;
import java.io.InputStream;
import java.net.URL;
public class Demo {
public static void main(String[] args) throws Exception {
try (InputStream htmlInputStream = new URL("https://gasparbarancelli.com/about").openStream();
InputStream pdfInputStream = new FileInputStream("src/main/resources/post-spring-ai-vector-database.pdf")) {
parse(htmlInputStream, pdfInputStream);
}
}
public static void parse(InputStream... inputs) throws Exception {
for (InputStream input : inputs) {
// Handler que será responsável por armazenar o conteúdo parseado
BodyContentHandler handler = new BodyContentHandler(-1);
// -1 remove a limitação do tamanho do conteúdo a ser armazenado
// Metadados
Metadata metadata = new Metadata();
// O parser que detecta o tipo de arquivo automaticamente
AutoDetectParser parser = new AutoDetectParser();
// Contexto de parsing
ParseContext parseContext = new ParseContext();
// Faz o parse do arquivo (seja HTML ou PDF)
parser.parse(input, handler, metadata, parseContext);
// Exibe o texto extraído
System.out.println("Texto extraído:");
System.out.println(handler);
// Exibe metadados
System.out.println("Metadados:");
String[] metadataNames = metadata.names();
for (String name : metadataNames) {
System.out.println(name + ": " + metadata.get(name));
}
}
}
}
Explicando o Código
-
InputStream htmlInputStream = new URL("…").openStream();
Abre umInputStream
para ler a página https://gasparbarancelli.com/about via HTTP. Dessa forma, o Tika irá detectar que o conteúdo é HTML. -
InputStream pdfInputStream = new FileInputStream("src/main/resources/post-spring-ai-vector-database.pdf");
Abre umInputStream
para ler um arquivo PDF local. O Tika identificará o tipo de arquivo e usará o parser apropriado. -
parse(htmlInputStream, pdfInputStream);
Chamamos o métodoparse
passando ambos osInputStream
. O método faz um loop em cada um e processa-os individualmente. -
BodyContentHandler handler = new BodyContentHandler(-1);
OBodyContentHandler
é responsável por armazenar o texto extraído. Passar-1
como parâmetro indica que não queremos limitar o tamanho do texto armazenado. Isso é útil para arquivos grandes, mas requer atenção à memória. -
Metadata metadata = new Metadata();
A classeMetadata
é onde serão armazenados dados como “Content-Type”, “Author”, “Creation-Date” e outros. -
AutoDetectParser parser = new AutoDetectParser();
OAutoDetectParser
faz a “mágica” de descobrir qual parser usar, com base nas características do arquivo ou no cabeçalho HTTP. -
ParseContext parseContext = new ParseContext();
É um objeto que armazena configurações adicionais do parser (por exemplo, para ativar OCR, caso precise). -
parser.parse(input, handler, metadata, parseContext);
Chamada que efetivamente faz a extração de conteúdo e metadados. -
System.out.println(handler);
Imprime o texto extraído. Você poderia, por exemplo, enviar esse texto para um banco de dados ou indexá-lo em uma ferramenta de busca. -
Impressão de metadados Exibe chave-valor para cada metadado que o Tika conseguiu extrair.
Repositório no GitHub
O código fonte deste exemplo se encontra disponível em meu repositório no GitHub: https://github.com/gasparbarancelli/demo-apache-tika
Sinta-se à vontade para explorar o projeto.
Alternativas ao Apache Tika
Apesar de o Tika ser uma solução robusta e completa, há outras bibliotecas e ferramentas que podem ser utilizadas em cenários mais específicos:
-
Apache POI: Focada principalmente em documentos da suíte Microsoft Office (Excel, Word, PowerPoint).
-
PDFBox: Se o foco é apenas PDFs, esta é uma boa opção. Faz parte do ecossistema Apache.
-
iText: Ferramenta comercial (com versão open source mais antiga) para manipulação avançada de PDFs.
Cada uma delas atende a um nicho específico. Se o seu projeto requer flexibilidade e suporte a diversos tipos de documentos, o Apache Tika tende a ser uma escolha segura.
Próximos Passos
Nos próximos artigos, vamos:
-
Extrair todos os posts do blog hpor meio do Tika.
-
Indexar tudo no Typesense, para construir um motor de busca rápido e relevante.
-
Integrar o ChatGPT para que possamos consultar esses conteúdos de forma contextual, criando uma experiência de perguntas e respostas inteligente dentro do blog.
A ideia é mostrar como o Apache Tika não só extrai dados de documentos variados, mas também como esse processo de extração pode ser um ponto de partida para construir soluções avançadas de busca semântica e chatbots de conhecimento especializado.
Conclusão
O Apache Tika é um aliado poderoso para quem quer indexar, analisar ou simplesmente obter conteúdo estruturado de uma grande variedade de arquivos. Ele simplifica muito o processo de lidar com diferentes formatos, deixando para o AutoDetectParser
todo o trabalho pesado de detecção de tipo e extração de conteúdo.
Com este guia, você tem tudo o que precisa para começar a usar o Tika em seus projetos. Fique de olho no blog para acompanhar o passo seguinte, onde vamos extrair posts, indexar no Typesense e integrar com o ChatGPT!