Um tradutor de PDFs do inglês para o português brasileiro, desenvolvido com Spring Boot, Thymeleaf e Apache PDFBox. O projeto extrai o texto de arquivos PDF, divide em blocos otimizados e traduz utilizando a API pública do Google Translate, entregando um arquivo .txt pronto para download.
![]() |
![]() |
|---|---|
| Home | Translate |
- 🚀 Upload Simples – Interface web intuitiva com suporte a arrastar e soltar (drag and drop).
- 📤 Extração de Texto – Utiliza Apache PDFBox para extrair o conteúdo textual do PDF.
- 🌎 Tradução Automática – Conecta-se à API do Google Translate para traduzir EN → PT-BR.
- 🧹 Pós‑processamento Inteligente – Remove artefatos de codificação (
%0A,%2C,,,) e corrige pontuações duplicadas. - 📥 Download Instantâneo – Retorna um arquivo
.txtcom o texto traduzido. - 💅 Interface Moderna – Desenvolvida com Thymeleaf, CSS3 e JavaScript puro (AJAX).
| Tecnologia | Descrição |
|---|---|
| Java 17 | Linguagem de programação principal |
| Spring Boot | Framework para construção da aplicação web |
| Thymeleaf | Motor de templates para a camada visual |
| Apache PDFBox | Biblioteca para manipulação e extração de PDFs |
| Maven | Gerenciador de dependências e build |
| AJAX/Fetch | Comunicação assíncrona com o backend |
| Grupo | Artefato | Versão | Descrição |
|---|---|---|---|
org.springframework.boot |
spring-boot-starter-web |
4.0.5 | Suporte para aplicações web REST |
org.springframework.boot |
spring-boot-starter-test |
4.0.5 | Testes unitários e de integração |
org.springframework.boot |
spring-boot-starter-thymeleaf |
4.0.5 | Motor de templates Thymeleaf |
org.apache.pdfbox |
pdfbox |
3.0.7 | Extração e manipulação de PDFs |
PdfTranslator/
├── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/example/PdfTranslator/
│ │ │ ├── application/
│ │ │ │ └── PdfTranslatorApplication.java
│ │ │ ├── controller/
│ │ │ │ └── PdfTranslatorController.java
│ │ │ ├── dto/
│ │ │ │ └── GoogleTranslateResponseDTO.java
│ │ │ └── service/
│ │ │ └── PdfTranslatorService.java
│ │ └── resources/
│ │ ├── static/
│ │ │ ├── css/
│ │ │ │ └── style.css
│ │ │ ├── js/
│ │ │ │ └── translator.js
│ │ │ └── images/
│ │ │ ├── favicon.ico
│ │ │ ├── pdf.png
│ │ │ └── pdf2.png
│ │ └── templates/
│ │ └── home.html
├── pom.xml
└── README.md
O coração da aplicação está na classe PdfTranslatorService. O fluxo de processamento é o seguinte:
- Extração – O método
extractTextFromPdf()utiliza o PDFBox para ler o arquivo enviado e extrair todo o texto. - Normalização –
normalizeEncoding()corrige caracteres especiais e possíveis problemas de codificação (%20,%C3%A7, etc.). - Limpeza –
cleanText()remove quebras de linha excessivas e espaços desnecessários. - Divisão Inteligente –
split()quebra o texto em blocos de até 4500 caracteres, respeitando parágrafos e frases para não estourar o limite da API do Google. - Tradução – Para cada bloco, o método
translate()faz uma requisiçãoGETpara:https://translate.googleapis.com/translate_a/single. - Pós‑processamento –
postProcessTranslation()é aplicado na resposta para:
- Decodificar artefatos URL (
%0A→\n,%2C→,). - Remover vírgulas e pontuações duplicadas (
,,→,,;,→;). - Garantir espaçamento correto.
- Download – O texto completo traduzido é convertido em
byte[]e enviado como anexo.
| Método | Rota | Descrição |
|---|---|---|
GET |
/ |
Retorna a página inicial (home.html) |
POST |
/translate |
Recebe o PDF e retorna o arquivo TXT traduzido |
Exemplo de requisição POST com cURL:
curl -F "file=@documento.pdf" http://localhost:8080/translate --output traducao.txt- Java 17 ou superior
- Maven (3.6+)
- Clone o repositório:
git clone https://github.com/seu-usuario/PdfTranslator.git
cd PdfTranslator- Compile e empacote com Maven:
./mvnw clean package(No Windows, use mvnw.cmd clean package)
- Execute a aplicação:
java -jar target/PdfTranslator-0.0.1-SNAPSHOT.jar- Acesse no navegador:
http://localhost:8080
./mvnw spring-boot:runA aplicação foi implantada na plataforma Render utilizando a opção de Web Service com suporte a Docker.
O projeto utiliza o seguinte Dockerfile para empacotar e executar a aplicação:
FROM eclipse-temurin:17-jdk
WORKDIR /app
COPY . .
RUN ./mvnw clean package -DskipTests
EXPOSE 8080
CMD ["java", "-jar", "target/PdfTranslator-0.0.1-SNAPSHOT.jar"]-
FROM eclipse-temurin:17-jdk
Define a imagem base do container.
Neste caso, utiliza o Java 17 (JDK) da distribuição Eclipse Temurin. -
WORKDIR /app
Define o diretório de trabalho dentro do container.
Todos os próximos comandos serão executados dentro de/app. -
COPY . .
Copia todos os arquivos do projeto (diretório atual) para o container. -
RUN ./mvnw clean package -DskipTests
Executa o build da aplicação usando o Maven Wrapper (mvnw):clean→ limpa builds anteriorespackage→ gera o.jar-DskipTests→ pula a execução dos testes (mais rápido no build)
-
EXPOSE 8080
Informa que a aplicação dentro do container utiliza a porta8080.
(Importante para integração com plataformas como o Render) -
CMD ["java", "-jar", "target/PdfTranslator-0.0.1-SNAPSHOT.jar"]
Define o comando padrão que será executado ao iniciar o container:- Executa o arquivo
.jargerado - Inicia a aplicação Spring Boot
- Executa o arquivo
- Base da imagem: utiliza o Java 17 (
eclipse-temurin) - Diretório de trabalho: define
/appcomo diretório principal - Cópia do projeto: copia todos os arquivos para dentro do container
- Build da aplicação: executa o Maven Wrapper (
mvnw) para gerar o.jar - Exposição da porta: expõe a porta
8080 - Execução: inicia a aplicação Spring Boot via
java -jar
O deploy foi feito como um Web Service, utilizando Docker para build e execução.
O Render injeta automaticamente a variável de ambiente PORT, que é utilizada no application.properties:
spring.application.name=PdfTranslator
# Server configuration
server.port=${PORT:8080}
server.servlet.context-path=/
# File upload settings - LIMITE DE 10MB
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
# Thymeleaf cache
spring.thymeleaf.cache=falseO projeto também inclui um arquivo render.yaml:
services:
- type: web
name: pdf-translator
runtime: java
repo: https://github.com/joaopauloaramuni/pdf-translator
plan: free
envVars:
- key: JAVA_OPTS
value: "-Xmx512m -Xms256m"
- key: SPRING_SERVLET_MULTIPART_MAX_FILE_SIZE
value: "10MB"
- key: SPRING_SERVLET_MULTIPART_MAX_REQUEST_SIZE
value: "10MB"
buildCommand: |
chmod +x mvnw
./mvnw clean package -DskipTests
startCommand: |
java -jar -Dserver.port=$PORT target/PdfTranslator-0.0.1-SNAPSHOT.jarO render.yaml é um arquivo de Infraestrutura como Código (IaC) que permite definir como o serviço será configurado no Render, incluindo:
- Tipo de serviço (web service)
- Variáveis de ambiente
- Comandos de build e execução
- Plano de hospedagem
Ele facilita a automação do deploy e versionamento da configuração junto ao código.
O arquivo render.yaml é obrigatório?
- Não.
Se você estiver utilizando Docker, o render.yaml não é necessário.
👉 O Render consegue fazer o deploy apenas com o Dockerfile, pois:
- Ele detecta automaticamente o Dockerfile
- Executa o build da imagem
- Inicia o container
- Apenas Dockerfile: suficiente para a maioria dos casos (mais simples)
- render.yaml: útil quando você quer:
- Automatizar totalmente a configuração do serviço
- Versionar a infraestrutura junto ao código
- Configurar múltiplos serviços ou variáveis complexas
| Recurso | Link |
|---|---|
| Apache PDFBox | https://pdfbox.apache.org/ |
| GitHub PDFBox | https://github.com/apache/pdfbox |
| Maven Repository PDFBox | https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox/3.0.7 |
| Flaticon (ícones PDF) | https://www.flaticon.com/search/2?word=pdf |
| Favicon.io (gerador) | https://favicon.io/favicon-converter/ |
| Thymeleaf | https://www.thymeleaf.org/ |
| Google Translate (não oficial) | https://translate.googleapis.com/ |
| Render (Deploy) | https://render.com/ |
| Docker | https://www.docker.com/ |
Este projeto está sob a licença MIT.

