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 umInputStreampara 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 umInputStreampara ler um arquivo PDF local. O Tika identificará o tipo de arquivo e usará o parser apropriado. - 
parse(htmlInputStream, pdfInputStream);Chamamos o métodoparsepassando 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-1como 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();OAutoDetectParserfaz 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!