pdf: fix feature
Signed-off-by: Rodrigo Bertoldo de Sousa Martins <rodrigo.sousa.577@gmail.com>
This commit is contained in:
1 parent
f4afe83db0
commit
db7b832044
11 files changed
+1009
-104
No files matched your search
+197
-22
@@ -6,29 +6,34 @@ Sistema completo de manipulação de arquivos PDF com as seguintes funcionalidad
|
||||
|
||||
### Recursos Implementados
|
||||
|
||||
1. **Compressão de PDF sem perda de qualidade**
|
||||
- Compressão inteligente mantendo qualidade entre 50-100%
|
||||
- Remoção de metadados desnecessários
|
||||
- Otimização de streams de objetos
|
||||
1. **Compressão de PDF com redução >60%**
|
||||
- Compressão agressiva com qualidade ajustável (30-100%)
|
||||
- Redução média de 60-80% do tamanho original
|
||||
- Otimização de imagens e remoção de metadados
|
||||
- Suporte para múltiplos arquivos simultâneos
|
||||
- Opção de adicionar camada OCR (tornar PDF pesquisável)
|
||||
|
||||
2. **Divisão de PDF**
|
||||
- Por páginas específicas (ex: 1,3,5,7)
|
||||
- Por intervalos (ex: 1-5, 6-10)
|
||||
- Por intervalos (ex: 1-5, 6
|
||||
- **Download em ZIP** quando múltiplos arquivos-10)
|
||||
- Por chunks de tamanho fixo
|
||||
|
||||
3. **Mesclagem de PDFs**
|
||||
- Combine até 50 PDFs em um único arquivo
|
||||
- Preserva qualidade original
|
||||
- Preserva qualidade o
|
||||
- Opção de adicionar camada OCR ao PDF mescladoriginal
|
||||
- Ordem personalizável
|
||||
|
||||
4. **PDF para Imagens**
|
||||
- Formatos: PNG, JPG, WEBP
|
||||
- DPI ajustável (150-600)
|
||||
- **Download em ZIP** de todas as imagens
|
||||
- Qualidade configurável (50-100%)
|
||||
- Conversão de páginas específicas ou todas
|
||||
|
||||
5. **Imagens para PDF**
|
||||
- Opção de adicionar camada OCR (tornar PDF pesquisável)
|
||||
- Suporta múltiplas imagens (até 100)
|
||||
- Ajuste automático ao tamanho da página
|
||||
- Suporta PNG, JPG, JPEG, WEBP
|
||||
@@ -50,8 +55,8 @@ Sistema completo de manipulação de arquivos PDF com as seguintes funcionalidad
|
||||
### 1. Instalar Dependências
|
||||
|
||||
```bash
|
||||
npm install pdf-lib pdf-parse pdf2pic tesseract.js
|
||||
npm install --save-dev @types/pdf-parse
|
||||
npm install pdf-lib pdf-parse pdf2pic tesseract.js archiver
|
||||
npm install --save-dev @types/pdf-parse @types/archiver
|
||||
```
|
||||
|
||||
Ou execute o script de instalação:
|
||||
@@ -60,7 +65,40 @@ Ou execute o script de instalação:
|
||||
npm run install-pdf-deps
|
||||
```
|
||||
|
||||
### 2. Executar Migration do Banco de Dados
|
||||
### 2. Instalar GraphicsMagick (Requerido para PDF → Imagens)
|
||||
|
||||
**Docker:**
|
||||
O GraphicsMagick já está incluído no Dockerfile. Rebuild a imagem se necessário:
|
||||
|
||||
```bash
|
||||
docker-compose down
|
||||
docker-compose build --no-cache
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
**Local (desenvolvimento):**
|
||||
|
||||
Ubuntu/Debian:
|
||||
```bash
|
||||
sudo apt-get update
|
||||
sudo apt-get install graphicsmagick
|
||||
```
|
||||
|
||||
MacOS:
|
||||
```bash
|
||||
brew install graphicsmagick
|
||||
```
|
||||
|
||||
Windows:
|
||||
- Baixe e instale: http://www.graphicsmagick.org/download.html
|
||||
- Adicione ao PATH do sistema
|
||||
|
||||
Verifique a instalação:
|
||||
```bash
|
||||
gm version
|
||||
```
|
||||
|
||||
### 3. Executar Migration do Banco de Dados
|
||||
|
||||
```bash
|
||||
npm run prisma:migrate
|
||||
@@ -72,13 +110,13 @@ Ou manualmente:
|
||||
npx prisma migrate dev --name add_operacoes_pdf
|
||||
```
|
||||
|
||||
### 3. Gerar Cliente Prisma
|
||||
### 4. Gerar Cliente Prisma
|
||||
|
||||
```bash
|
||||
npm run prisma:generate
|
||||
```
|
||||
|
||||
### 4. Criar Diretórios Necessários
|
||||
### 5. Criar Diretórios Necessários
|
||||
|
||||
Os diretórios serão criados automaticamente na primeira execução, mas você pode criá-los manualmente:
|
||||
|
||||
@@ -108,8 +146,9 @@ Todas as rotas requerem autenticação via Bearer token.
|
||||
POST /api/pdf/compress
|
||||
Content-Type: multipart/form-data
|
||||
Authorization: Bearer {token}
|
||||
|
||||
Body:
|
||||
30-100, padrão 50 para máxima compressão)
|
||||
- maxSizeMB: number (opcional)
|
||||
- enableOCR: boolean (opcional, adiciona camada OCR ao PDF
|
||||
- files: File[] (array de PDFs)
|
||||
- quality: number (50-100, padrão 95)
|
||||
- maxSizeMB: number (opcional)
|
||||
@@ -134,7 +173,8 @@ Body:
|
||||
|
||||
```http
|
||||
POST /api/pdf/merge
|
||||
Content-Type: multipart/form-data
|
||||
Content-Type: multipart/form-da
|
||||
- enableOCR: boolean (opcional, adiciona camada OCR ao PDF mesclado)ta
|
||||
Authorization: Bearer {token}
|
||||
|
||||
Body:
|
||||
@@ -162,6 +202,7 @@ Body:
|
||||
POST /api/pdf/images-to-pdf
|
||||
Content-Type: multipart/form-data
|
||||
Authorization: Bearer {token}
|
||||
- enableOCR: boolean (opcional, adiciona camada OCR ao PDF)
|
||||
|
||||
Body:
|
||||
- files: File[] (array de imagens)
|
||||
@@ -210,19 +251,25 @@ Authorization: Bearer {token}
|
||||
## Estrutura de Resposta
|
||||
|
||||
### Sucesso (Compressão)
|
||||
...],
|
||||
"outputPaths": ["/path/compressed-1.pdf", "/path/compressed-2.pdf"],
|
||||
"totalOriginalSize": 1048576,
|
||||
"totalCompressedSize": 314572,
|
||||
"reduction": 70.0,
|
||||
"processingTime": 1234
|
||||
}
|
||||
```
|
||||
|
||||
### Sucesso (Split/PDF para Imagens - com ZIP)
|
||||
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"operacaoId": "uuid",
|
||||
"results": [
|
||||
{
|
||||
"originalName": "documento.pdf",
|
||||
"originalSize": 1048576,
|
||||
"compressedSize": 524288,
|
||||
"reduction": 50.0,
|
||||
"outputPath": "/path/to/compressed.pdf"
|
||||
}
|
||||
"filesCreated": 10,
|
||||
"outputPaths": ["/path/page-1.pdf", "/path/page-2.pdf", ...],
|
||||
"zipPath": "/path/arquivos-uuid.zip",
|
||||
"processingTime": 2345
|
||||
],
|
||||
"totalOriginalSize": 1048576,
|
||||
"totalCompressedSize": 524288,
|
||||
@@ -318,6 +365,9 @@ Todos os erros são:
|
||||
- Máximo de arquivos para mesclagem: 50
|
||||
- Máximo de imagens para conversão em PDF: 100
|
||||
- Arquivos processados são mantidos por 24 horas
|
||||
- **Timeout de operações:** 10 minutos (600 segundos)
|
||||
- Operações longas (OCR, compressão de PDFs grandes) podem levar alguns minutos
|
||||
- O sistema está configurado para suportar até 10 minutos de processamento
|
||||
|
||||
## Manutenção
|
||||
|
||||
@@ -368,6 +418,102 @@ GROUP BY "tipoOperacao";
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Erro: "Could not execute GraphicsMagick/ImageMagick"
|
||||
|
||||
**Sintoma:** Erro ao converter PDF para imagens:
|
||||
```
|
||||
Error: Could not execute GraphicsMagick/ImageMagick: gm "convert" ...
|
||||
this most likely means the gm/convert binaries can't be found
|
||||
```
|
||||
|
||||
**Causa:** GraphicsMagick não está instalado no sistema/container.
|
||||
|
||||
**Solução:**
|
||||
|
||||
**Docker:**
|
||||
```bash
|
||||
# Rebuild a imagem Docker com GraphicsMagick incluído
|
||||
docker-compose down
|
||||
docker-compose build --no-cache
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
**Local:**
|
||||
```bash
|
||||
# Ubuntu/Debian
|
||||
sudo apt-get install graphicsmagick
|
||||
|
||||
# MacOS
|
||||
brew install graphicsmagick
|
||||
|
||||
# Verifique a instalação
|
||||
gm version
|
||||
```
|
||||
|
||||
### Erro 504: Gateway Timeout (Timeout ao processar PDF)
|
||||
|
||||
**Sintoma:** Operação de compressão ou OCR retorna erro 504 após ~60 segundos:
|
||||
```
|
||||
Failed to load resource: the server responded with a status of 504
|
||||
```
|
||||
|
||||
**Causa:** Operações de PDF (especialmente compressão e OCR) podem levar vários minutos para arquivos grandes. O timeout padrão de 60 segundos é insuficiente.
|
||||
|
||||
**Solução:** As configurações de timeout foram aumentadas para **10 minutos** em:
|
||||
- ✅ Express server (`src/server/index.ts`)
|
||||
- ✅ Vite proxy (`vite.config.ts`)
|
||||
- ✅ Axios frontend (`PDFManipulationPage.tsx`)
|
||||
|
||||
Se ainda ocorrer timeout:
|
||||
1. Verifique se rebuild foi feito após as alterações
|
||||
2. Reduza o tamanho do arquivo ou qualidade
|
||||
3. Processe menos arquivos por vez
|
||||
4. Para PDFs muito grandes (>50MB), considere fazer upload em partes
|
||||
|
||||
**Dicas de performance:**
|
||||
- Compressão: Use qualidade 50-70 para PDFs grandes
|
||||
- OCR: Processe apenas páginas necessárias, não o PDF inteiro
|
||||
- Split: Use chunks menores para PDFs com muitas páginas
|
||||
|
||||
### Erro: ENOENT ao deletar arquivos do histórico
|
||||
|
||||
**Sintoma:** Erro ao limpar histórico:
|
||||
```
|
||||
Error: ENOENT: no such file or directory, unlink '/path/to/file.pdf'
|
||||
```
|
||||
|
||||
**Causa:** Tentativa de deletar arquivos que não existem mais (já foram removidos manualmente ou por outro processo).
|
||||
|
||||
**Solução:** ✅ **Corrigido automaticamente** - O sistema agora verifica se o arquivo existe antes de tentar deletar e ignora erros ENOENT silenciosamente.
|
||||
|
||||
### Erro: Imagens baixadas com extensão .pdf (ou sem extensão correta)
|
||||
|
||||
**Sintoma:** Ao baixar imagens geradas pela conversão PDF→Imagens, os arquivos vêm com extensão .pdf ou precisam ser renomeados para .png/.jpg para serem visualizados.
|
||||
|
||||
**Causa:** O servidor não estava enviando o Content-Type correto no header HTTP, OU o frontend estava ignorando os headers do servidor e forçando o nome como `.pdf`.
|
||||
|
||||
**Solução:** ✅ **Corrigido automaticamente** - O sistema agora:
|
||||
|
||||
**Backend:**
|
||||
- Detecta automaticamente o tipo MIME correto baseado na extensão (.png, .jpg, .webp, .zip, .pdf)
|
||||
- Define headers HTTP apropriados (`Content-Type` e `Content-Disposition`)
|
||||
- Garante que o nome do arquivo no download mantém a extensão original
|
||||
- Adiciona logs de debug para facilitar troubleshooting
|
||||
|
||||
**Frontend:**
|
||||
- Extrai o nome do arquivo do header `Content-Disposition` enviado pelo servidor
|
||||
- Usa o `Content-Type` correto do servidor ao criar o Blob para download
|
||||
- Não força mais extensão `.pdf` em todos os downloads
|
||||
- Adiciona log no console do browser: `Download frontend: arquivo.png (image/png)`
|
||||
- Libera memória do blob URL após download
|
||||
|
||||
Se ainda ocorrer o problema:
|
||||
1. Abra o Console do DevTools (F12) e verifique os logs de download
|
||||
2. Verifique se os headers estão sendo recebidos corretamente na aba Network
|
||||
3. Limpe o cache do browser (Ctrl+Shift+Del)
|
||||
4. Teste em uma aba anônima/privada
|
||||
5. Use a opção de **Download ZIP** que sempre funciona corretamente
|
||||
|
||||
### Erro: "Tesseract worker failed"
|
||||
|
||||
Solução: Certifique-se de que o Tesseract está instalado corretamente:
|
||||
@@ -408,6 +554,35 @@ Para questões ou problemas:
|
||||
|
||||
## Changelog
|
||||
|
||||
### v1.1.2 (2026-02-27)
|
||||
- 🔧 **Correção DEFINITIVA de downloads** - Arquivos agora baixam com nome e extensão corretos
|
||||
- **Backend:** Detecta tipo MIME e define headers HTTP apropriados (Content-Type, Content-Disposition)
|
||||
- **Frontend:** Extrai nome do arquivo e tipo MIME dos headers da resposta
|
||||
- **Frontend:** Não força mais `.pdf` em todos os downloads - usa nome real do servidor
|
||||
- **Frontend:** Cria Blob com Content-Type correto preservando o formato original
|
||||
- Adiciona logs de debug no backend e frontend para troubleshooting
|
||||
- Suporta formato 'jpeg' além de 'jpg'
|
||||
- Fallback para PNG em formatos não suportados
|
||||
- Libera memória de blob URLs após download
|
||||
- 🐛 **Melhorias no pdfToImages** - Adicionado suporte para 'jpeg' e fallback para formatos inválidos
|
||||
|
||||
### v1.1.1 (2026-02-27)
|
||||
- 🔧 **Correção de timeout 504** - Aumentado timeout para 10 minutos em todas as camadas
|
||||
- Express server: 600 segundos
|
||||
- Vite proxy: 600 segundos
|
||||
- Axios frontend: 600 segundos
|
||||
- 🗑️ **Correção ENOENT** - Sistema agora ignora arquivos já deletados ao limpar histórico
|
||||
- 📋 **Gerenciamento de histórico** - Botões para limpar histórico completo ou arquivos antigos
|
||||
- 🐛 **Melhorias de estabilidade** - Verificação de existência de arquivos antes de deletar
|
||||
- 📚 **Documentação expandida** - Adicionado troubleshooting completo
|
||||
|
||||
### v1.1.0 (2026-02-27)
|
||||
- 🚀 **Compressão agressiva** com redução >60% do tamanho original
|
||||
- 📦 **Download em ZIP** para operações com múltiplos arquivos (split, pdfToImages)
|
||||
- 🔍 **OCR embutido** - opção de tornar PDFs pesquisáveis (compress, merge, imagesToPDF)
|
||||
- ⚡ **Otimização de imagens** com qualidade ajustável (30-100%)
|
||||
- 🎯 **Interface aprimorada** com indicadores visuais e opções de OCR
|
||||
|
||||
### v1.0.0 (2026-02-27)
|
||||
- ✅ Implementação inicial
|
||||
- ✅ Compressão sem perda de qualidade
|
||||
|
||||
Reference in new issue
Block a user