From 09405409a290959a293bb25ea5c9eb4bf52d110c Mon Sep 17 00:00:00 2001 From: Rodrigo Bertoldo de Sousa Martins Date: Fri, 27 Feb 2026 17:40:56 -0300 Subject: [PATCH] pdf: fix route Signed-off-by: Rodrigo Bertoldo de Sousa Martins --- INSTALL_PDF.md | 100 ++++++++++++++++++ backend/controllers/pdfController.ts | 2 +- .../20260227000000_add_operacoes_pdf.sql | 5 +- src/components/layouts/MainLayout.tsx | 2 + src/server/index.ts | 4 +- src/server/routes/pdf.ts | 82 ++++++++++++++ 6 files changed, 191 insertions(+), 4 deletions(-) create mode 100644 INSTALL_PDF.md create mode 100644 src/server/routes/pdf.ts diff --git a/INSTALL_PDF.md b/INSTALL_PDF.md new file mode 100644 index 0000000..996d843 --- /dev/null +++ b/INSTALL_PDF.md @@ -0,0 +1,100 @@ +# Passos para ativar a funcionalidade de PDF + +## 1. Instalar Dependências + +Execute o seguinte comando para instalar todas as dependências necessárias: + +```bash +npm install pdf-lib pdf-parse pdf2pic tesseract.js +npm install --save-dev @types/pdf-parse +``` + +## 2. Executar Migration do Banco de Dados + +Execute a migration para criar a tabela de operações de PDF: + +```bash +npx prisma migrate dev --name add_operacoes_pdf +``` + +Ou simplesmente: + +```bash +npm run prisma:migrate +``` + +## 3. Gerar Cliente Prisma + +Gere o cliente Prisma atualizado: + +```bash +npm run prisma:generate +``` + +## 4. Criar Diretórios + +Os diretórios serão criados automaticamente, mas você pode criá-los manualmente: + +**No Windows (PowerShell):** +```powershell +New-Item -Path "storage\temp\pdf-ops" -ItemType Directory -Force +New-Item -Path "storage\pdf-output" -ItemType Directory -Force +New-Item -Path "storage\temp\uploads" -ItemType Directory -Force +``` + +**No Linux/Mac:** +```bash +mkdir -p storage/temp/pdf-ops +mkdir -p storage/pdf-output +mkdir -p storage/temp/uploads +``` + +## 5. Reiniciar o Servidor + +Após instalar as dependências e executar as migrations, reinicie o servidor: + +```bash +npm run dev:full +``` + +Ou apenas o backend: + +```bash +npm run server +``` + +## Verificação + +Após seguir todos os passos: + +1. Acesse a aplicação no navegador +2. Faça login +3. Clique no item "PDFs" no menu lateral +4. Teste a funcionalidade de compressão enviando um PDF + +## Troubleshooting + +### Se continuar dando erro 404: + +1. Verifique se o servidor foi reiniciado após as mudanças +2. Verifique se as dependências foram instaladas corretamente +3. Verifique os logs do servidor para erros de importação + +### Se der erro de módulo não encontrado: + +Execute: +```bash +npm install +npm run prisma:generate +``` + +### Se der erro no banco de dados: + +Execute: +```bash +npx prisma migrate reset +npx prisma migrate dev +npm run prisma:generate +``` + +**ATENÇÃO:** O comando `migrate reset` apaga todos os dados do banco! diff --git a/backend/controllers/pdfController.ts b/backend/controllers/pdfController.ts index fcd15cb..77e69fc 100644 --- a/backend/controllers/pdfController.ts +++ b/backend/controllers/pdfController.ts @@ -1,6 +1,6 @@ import { Request, Response } from 'express'; import { PrismaClient } from '@prisma/client'; -import { PDFService } from '../services/pdfService'; +import { PDFService } from '../../src/services/pdfService'; import multer from 'multer'; import path from 'path'; import fs from 'fs/promises'; diff --git a/prisma/migrations/20260227000000_add_operacoes_pdf.sql b/prisma/migrations/20260227000000_add_operacoes_pdf.sql index 4102d31..c6f29d1 100644 --- a/prisma/migrations/20260227000000_add_operacoes_pdf.sql +++ b/prisma/migrations/20260227000000_add_operacoes_pdf.sql @@ -22,12 +22,13 @@ CREATE TABLE "operacoes_pdf" ( "detalhesOCR" JSONB, "tempoProcessamento" INTEGER, "criadoEm" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "atualizadoEm" TIMESTAMP(3) NOT NULL, + "atualizadoEm" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "operacoes_pdf_pkey" PRIMARY KEY ("id") ); --- Adicionar foreign key para usuariosALTER TABLE "operacoes_pdf" ADD CONSTRAINT "operacoes_pdf_usuarioId_fkey" FOREIGN KEY ("usuarioId") REFERENCES "usuarios"("id") ON DELETE RESTRICT ON UPDATE CASCADE; +-- Adicionar foreign key para usuarios +ALTER TABLE "operacoes_pdf" ADD CONSTRAINT "operacoes_pdf_usuarioId_fkey" FOREIGN KEY ("usuarioId") REFERENCES "usuarios"("id") ON DELETE RESTRICT ON UPDATE CASCADE; -- Criar índice para melhor performance nas consultas CREATE INDEX "operacoes_pdf_usuarioId_idx" ON "operacoes_pdf"("usuarioId"); diff --git a/src/components/layouts/MainLayout.tsx b/src/components/layouts/MainLayout.tsx index 9c12a6d..7c7a46b 100644 --- a/src/components/layouts/MainLayout.tsx +++ b/src/components/layouts/MainLayout.tsx @@ -18,6 +18,7 @@ import { CurrencyDollarIcon, CalculatorIcon, BriefcaseIcon, + DocumentDuplicateIcon, } from "@heroicons/react/24/outline"; import { Menu, Transition } from "@headlessui/react"; import api from "../../services/api"; @@ -91,6 +92,7 @@ export const MainLayout: React.FC = () => { { path: "/atendimentos", label: "Atendimentos", icon: UserIcon }, { path: "/tarefas", label: "Tarefas", icon: ClipboardDocumentCheckIcon }, { path: "/documentos", label: "Documentos", icon: DocumentTextIcon }, + { path: "/pdf", label: "PDFs", icon: DocumentDuplicateIcon }, { path: null, label: "Cálculos", diff --git a/src/server/index.ts b/src/server/index.ts index 96bf2e4..9463539 100644 --- a/src/server/index.ts +++ b/src/server/index.ts @@ -27,6 +27,7 @@ import indicesMonetariosRoutes from './routes/indicesMonetarios'; import pensaoAlimenticiaRouter from './routes/pensaoAlimenticia'; // Importar router de pensão alimentícia import financeiroPainelRoutes from './routes/financeiroPainel'; // Importar rotas do financeiro painel import audienciasRoutes from './routes/audiencias'; // Importar rotas de audiências +import pdfRoutes from './routes/pdf'; // Importar rotas de PDF const app = express(); @@ -1481,4 +1482,5 @@ app.use('/api/calculos', calculosJudiciaisRoutes); app.use('/api/indices', indicesMonetariosRoutes); app.use('/api/pensao-alimenticia', pensaoAlimenticiaRouter); app.use('/api/financeiro-painel', financeiroPainelRoutes); // Adicionar uso das rotas do financeiro painel -app.use('/api/audiencias', audienciasRoutes); // Adicionar uso das rotas de audiências \ No newline at end of file +app.use('/api/audiencias', audienciasRoutes); // Adicionar uso das rotas de audiências +app.use('/api/pdf', pdfRoutes); // Adicionar uso das rotas de PDF \ No newline at end of file diff --git a/src/server/routes/pdf.ts b/src/server/routes/pdf.ts new file mode 100644 index 0000000..a307387 --- /dev/null +++ b/src/server/routes/pdf.ts @@ -0,0 +1,82 @@ +import express from 'express'; +import { PDFController, uploadMiddleware } from '../../backend/controllers/pdfController'; +import { authMiddleware } from '../../middleware/auth'; + +const router = express.Router(); + +/** + * Rotas para manipulação de PDF + * Todas as rotas requerem autenticação + */ + +// Comprime PDFs +router.post( + '/compress', + authMiddleware, + uploadMiddleware.array('files', 10), + PDFController.compress +); + +// Divide PDF +router.post( + '/split', + authMiddleware, + uploadMiddleware.array('files', 1), + PDFController.split +); + +// Mescla PDFs +router.post( + '/merge', + authMiddleware, + uploadMiddleware.array('files', 50), + PDFController.merge +); + +// Converte PDF para imagens +router.post( + '/pdf-to-images', + authMiddleware, + uploadMiddleware.array('files', 1), + PDFController.pdfToImages +); + +// Converte imagens para PDF +router.post( + '/images-to-pdf', + authMiddleware, + uploadMiddleware.array('files', 100), + PDFController.imagesToPDF +); + +// Realiza OCR em PDF +router.post( + '/ocr', + authMiddleware, + uploadMiddleware.array('files', 1), + PDFController.performOCR +); + +// Obtém informações de um PDF +router.post( + '/info', + authMiddleware, + uploadMiddleware.array('files', 1), + PDFController.getInfo +); + +// Obtém histórico de operações +router.get( + '/history', + authMiddleware, + PDFController.getHistory +); + +// Download de arquivo processado +router.get( + '/download/:operacaoId/:fileIndex', + authMiddleware, + PDFController.downloadFile +); + +export default router;