Os arquivos PDF se tornaram um padrão amplamente adotado para compartilhar documentos de forma segura e confiável. No dia-a-dia eles são usados para visualizar e distribuir documentos, como livros, apostilas, manuais, contratos, preservando o layout original. Além disso, permitem a adição de assinaturas digitais, tornando-os ideais para transações legais e financeiras. Ainda mais agora com a Assinatura Eletrônica do portal gov.br, que permite a assinatura de contratos com a mesma validade de cartórios utilizando arquivos PDF.

No ambiente corporativo, os PDFs desempenham um papel crucial na comunicação. Eles são amplamente utilizados para compartilhar apresentações, relatórios e propostas dentro da empresa ou com clientes e parceiros externos. Na justiça brasileira os processos, com suas petições e despachos são realizados com documentos PDF. Balanços e apresentações de resultados de empresas negociadas na bolsa são disponibilizados neste formato.

Devido a isso a extração de informações de PDFs é uma tarefa muito comum, que pode automatizar diversos processos, seja no ambito pessoal, como extrair os seus gastos da fatura do cartão de crédito (e posteriormente até mesmo fazer um classificador automatizado das categorias dos gastos, se seu cartão já não faz isso). Quanto no ambito empresarial, investimentos, como fazer a extração das informações dos balanços de empresas.

Existem uma infinidade de bibliotecas Python que podem ser utilizadas para extração de texto de PDF (ou até mesmo edição/criação de documentos). No momento vamos focar no pdfminer.six e no pytesseract. Existem aplicativos escritos em Python como o pdfarranger que permitem manipulações em arquivos PDFs utilizando uma interface gráfica, como adição de páginas, remoções, rotações, reordenação,

pdfminer.six Link para o cabeçalho

O pdfminer.six é uma lib para o Python focada em extrair informações do PDF, no momento iremos focar em extrair texto, mas também pode ser utilizada para extrair imagens. Ele extrai texto, documentos que são fotos com texto na foto, não são extraídos pelo pdfminer.six, neste caso vamos utilizar o tesseract.

O comando para extrair todo o texto do PDF é bem simples:

from pdfminer.high_level import extract_text # pip install pdfminer.six
from func_timeout import func_timeout, FunctionTimedOut # pip install func-timeout

def text_extract_pdfminer(file, max_pages, n_page_test):
    try:
        # https://pdfminersix.readthedocs.io/en/latest/reference/highlevel.html#api-extract-text
        text = func_timeout(pdfminer_timeout, lambda: extract_text(file, maxpages = n_page_test))
    except FunctionTimedOut:
        text = ""
    if len(text) > 300:
        try:
            text = func_timeout(pdfminer_timeout, lambda: extract_text(file, max_pages))
        except FunctionTimedOut:
            text = ""
    return text

A função que realiza a extração é a extract_text. Gostaria de destacar algumas particularidades, dependendo do pdf, o pdfminer.six pode demorar muito tempo na extração, portanto utilizamos o func_timeout para limitar o tempo de execução (possivelmente utilizando um OCR posteriormente). Além disso, um PDF pode necessitar de OCR, pois não tem camada de texto, portanto analisamos as 3 primeiras páginas em busca de texto, caso não seja encontrado uma quantidade significativa de texto, retornamos uma string vazia.

pytesseract Link para o cabeçalho

O Tesseract OCR é uma biblioteca de reconhecimento ótico de caracteres (OCR) de código aberto, originalmente desenvolvida pela HP e atualmente patrocinada pela Google. Ele é capaz de reconhecer texto em diversos idiomas, pode lidar com imagens rotacionadas ou distorcidas, reconhecer vários estilos e formatos de fontes, principalmente impressas.

Por ser de código aberto, grátis, o Tesseract OCR é amplamente utilizado em projetos que envolvem digitalização de documentos, reconhecimento de texto em imagens. Embora não tenha a mesma precisão que soluções comerciais de OCR, como o Amazon Textract, ou as soluções do Google e Azure.

Para utiliza no Python existe uma lib que um wrapper

Nota
Uma nota aqui.