
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:
<!-- https://mvnrepository.com/artifact/net.sourceforge.tess4j/tess4j -->
<dependency>
<groupId>net.sourceforge.tess4j</groupId>
<artifactId>tess4j</artifactId>
<version>3.5.2</version>
</dependency>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:
}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:

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.

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: