pdf: fix route

Signed-off-by: Rodrigo Bertoldo de Sousa Martins <rodrigo.sousa.577@gmail.com>
This commit is contained in:
rodrigo committed 2026-02-27 17:40:56 -03:00
1 parent 61a1631519
commit 09405409a2
6 files changed
+191 -4

No files matched your search

+100
View File
@@ -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!
+1 -1
View File
@@ -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';
@@ -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");
+2
View File
@@ -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",
+3 -1
View File
@@ -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
app.use('/api/audiencias', audienciasRoutes); // Adicionar uso das rotas de audiências
app.use('/api/pdf', pdfRoutes); // Adicionar uso das rotas de PDF
+82
View File
@@ -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;