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

Por Gaspar Barancelli Junior em 04 de janeiro de 2025
Imagem ilustrativa sobre o post 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

  1. 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.

  2. Análise de dados: Para análise de conteúdo ou metadados de uma grande quantidade de documentos.

  3. Digitalização de arquivos: Quando combinado com OCR (Optical Character Recognition), é possível extrair texto de PDFs escaneados e imagens.

  4. 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:

  1. Um HTML (neste caso, a página About do meu próprio site em https://gasparbarancelli.com/about).

  2. 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

  1. InputStream htmlInputStream = new URL("…​").openStream(); Abre um InputStream para ler a página https://gasparbarancelli.com/about via HTTP. Dessa forma, o Tika irá detectar que o conteúdo é HTML.

  2. InputStream pdfInputStream = new FileInputStream("src/main/resources/post-spring-ai-vector-database.pdf"); Abre um InputStream para ler um arquivo PDF local. O Tika identificará o tipo de arquivo e usará o parser apropriado.

  3. parse(htmlInputStream, pdfInputStream); Chamamos o método parse passando ambos os InputStream. O método faz um loop em cada um e processa-os individualmente.

  4. BodyContentHandler handler = new BodyContentHandler(-1); O BodyContentHandler é 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.

  5. Metadata metadata = new Metadata(); A classe Metadata é onde serão armazenados dados como “Content-Type”, “Author”, “Creation-Date” e outros.

  6. AutoDetectParser parser = new AutoDetectParser(); O AutoDetectParser faz a “mágica” de descobrir qual parser usar, com base nas características do arquivo ou no cabeçalho HTTP.

  7. ParseContext parseContext = new ParseContext(); É um objeto que armazena configurações adicionais do parser (por exemplo, para ativar OCR, caso precise).

  8. parser.parse(input, handler, metadata, parseContext); Chamada que efetivamente faz a extração de conteúdo e metadados.

  9. 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.

  10. 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:

  1. Extrair todos os posts do blog hpor meio do Tika.

  2. Indexar tudo no Typesense, para construir um motor de busca rápido e relevante.

  3. 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!

// Compartilhe esse Post

💫
🔥 NOVO APP

Domine o Inglês em 30 dias!

Inteligência Artificial + Repetição Espaçada • Método cientificamente comprovado

✅ Grátis para começar 🚀 Resultados rápidos
×