Spring Boot + Tesseract OCR

Nesse post, vou descrever de maneira breve como criar um backend usando spring boot que receberá uma imagem e devolverá o texto dessa imagem usando OCR e fazer o deploy no heroku.


Baixando os arquivos do tessdata necessários

Precisaremos testar nossa aplicação localmente antes de fazer o deploy para o heroku, por isso vamos configurar o tesseract em nossa máquina local.

O primeiro passo é fazer o download das bibliotecas do tesseract em nossa máquina, se você está usando o windows entre no site https://digi.bib.uni-mannheim.de/tesseract/ e baixe a versão mais recente do tesseract, no momento em que escrevi esse artigo usei o instalador “tesseract-ocr-setup-3.05.02–20180621.exe

Se você estiver usando ubuntu basta instalar o pacote sudo apt install tesseract-ocr.

Atenção, é importante que você saiba onde está instalando, pois precisará dos arquivos da pasta tessdata mais a frente.

Criar o aplicativo básico do spring boot

Usando a sua IDE favorita, crie um projeto básico do spring bot com a dependência web.

Adicione nas dependências a biblioteca do tesseract:

Como estou usando o maven apenas adicionei ao pom a dependência:

Atenção, a versão usada na dependência deve coincidir com a versão utilizada na sua máquina, caso contrário podem ocorrer erros, nesse caso eu estou usando a dependência 3.5.2 e os binários 3.05.2

Dependência adicionada ao projeto, vamos a parte da codificação do backend.

Crie um controller no seu projeto para que receba uma imagem, processe com o tesseract e devolta o texto:

Ocr.java Controller do nosso projeto

No nosso código, instanciâmos o tesseract, configuramos o dataPath para o diretorio onde fica o tessdata.

A configuração tesseract.setDataPathnão é obrigatória, ela pode ser substituida pela variável de ambiente TESSDATA_PREFIX.

Após criar nosso controller, vamos testar a aplicação, rode o springboot e envie uma imagem para o endpoint, para fazer esse teste, eu usei o postman.

Baixe o postman e crie uma requisição post para nosso back end enviando uma imagem com texto para que ele faça a conversão, nesse exemplo eu usei a seguinte imagem:

Imagem de exemplo

No postman, configure para que seja enviado uma requisição POST, no body altere para form-data no campo key coloque o nome file e no value escolha a imagem que será enviada para nosso backend.

Exemplo postman

Heroku

Para que o tesseract funcione no Heroku é necessário que ele esteja instalado no heroku, assim como fizemos para que funcionasse na nossa máquina local.

Para fazer isso, vamos precisar adicionar um buildpack customizado do Tesseract para o Heroku que no caso usei o do seguinte repositório https://github.com/oswellchan/heroku-buildpack-tesseract.

Repare que nas dependências desse repositório é utilizado o tesseract-ocr-3.04.01.tar.gz, ou seja a versão do tesseract no heroku vai ser a 3.04, lembrem-s de que no nosso pom estamos utilizando a versão 3.5.2, isso não é recomendado porém para esse exemplo vou manter nessa versão.

No heroku adicione dois buildpacks :

A ordem é importante, o java deve ser o primeiro, ele é necessário para subir nosso backend, se o projeto fosse feito em gradle, então o primeiro buildpack seria o do gradle.

As configurações do heroku ficarão assim:

Antes de fazer o push do nosso sistema para o heroku é necessário mais uma alteração no nosso projeto. Lebram quando configuramos o tesseract.setDataPath ?

Aqui temos 2opções:

  • Usar a variável de ambiente TESSDATA_PREFIX. Nesse caso basta apagar a linha de configuração do path, quando o heroku faz o deploy do sistema o buildpack do tesseract já configura essa variável
  • Criar uma pasta no resources com o nome de tessdata e copiar o arquivo que queremos de tradução para ele.

Vantagens e desvantagens:

A primeira opção é a mais simples, porém ele só nos trás a lingua inglês.

A segunda opção só nos dá o trabalho de criar a pasta tesseract nos resources porém teremos o controle de todas as linguas que nosso software dará suporte.

No nosso teste usaremos a segunda opção, então crie uma pasta no resources do seu projeto chamada tessdata e copie do diretório tessdata do seu computador para essa pasta, se você estiver usando o inglês copie o arquivo “eng.traineddata” se for português copie o arquivo “por.traineddata” e altere o setdatapath do seu controller para :

“tesseract.setDatapath(“src/main/resources”);”

Feito todas as configurações, basta dar um push para o heroku!

Ao fazer o push, repare que o heroku instalou o tesseract no servidor:

Após o sistema subir faça o teste apenas alterando a url para o heroku:

Sucesso!

Os fontes desse projeto estão disponíveis no github:

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade