diff --git a/docs.sql b/docs.sql new file mode 100644 index 0000000..60c927a --- /dev/null +++ b/docs.sql @@ -0,0 +1,9 @@ + +CREATE TABLE IF NOT EXISTS documentos ( + id INT AUTO_INCREMENT PRIMARY KEY, + client_id INT NOT NULL, + tipo VARCHAR(50) NOT NULL, + arquivo VARCHAR(255) NOT NULL, + data_upload DATETIME NOT NULL, + FOREIGN KEY (client_id) REFERENCES clientes(id) +); \ No newline at end of file diff --git a/document_detector.py b/document_detector.py new file mode 100644 index 0000000..a2135f4 --- /dev/null +++ b/document_detector.py @@ -0,0 +1,100 @@ +import cv2 +import numpy as np +import sys +import json +from pathlib import Path +import os +from PIL import Image + +def order_points(pts): + rect = np.zeros((4, 2), dtype="float32") + s = pts.sum(axis=1) + rect[0] = pts[np.argmin(s)] + rect[2] = pts[np.argmax(s)] + diff = np.diff(pts, axis=1) + rect[1] = pts[np.argmin(diff)] + rect[3] = pts[np.argmax(diff)] + return rect + +def process_document(image_path, doc_type, output_dir): + try: + # Carrega e verifica a imagem + image = cv2.imread(str(image_path)) + if image is None: + raise Exception("Não foi possível carregar a imagem") + + original = image.copy() + + # Pré-processamento + gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) + blurred = cv2.GaussianBlur(gray, (5, 5), 0) + edges = cv2.Canny(blurred, 50, 150) + + # Encontra contornos + contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) + if not contours: + raise Exception("Nenhum contorno encontrado") + + # Ordena contornos por área + contours = sorted(contours, key=cv2.contourArea, reverse=True) + doc_corners = None + + # Procura o documento + for contour in contours: + peri = cv2.arcLength(contour, True) + approx = cv2.approxPolyDP(contour, 0.02 * peri, True) + if len(approx) == 4: + doc_corners = approx + break + + if doc_corners is None: + raise Exception("Documento não encontrado") + + # Processa cantos e aplica transformação + doc_corners = doc_corners.reshape(4, 2) + ordered_corners = order_points(doc_corners) + + (tl, tr, br, bl) = ordered_corners + widthA = np.linalg.norm(br - bl) + widthB = np.linalg.norm(tr - tl) + maxWidth = max(int(widthA), int(widthB)) + + heightA = np.linalg.norm(tr - br) + heightB = np.linalg.norm(tl - bl) + maxHeight = max(int(heightA), int(heightB)) + + dst = np.array([ + [0, 0], + [maxWidth - 1, 0], + [maxWidth - 1, maxHeight - 1], + [0, maxHeight - 1] + ], dtype="float32") + + # Aplica transformação perspectiva + matrix = cv2.getPerspectiveTransform(ordered_corners, dst) + warped = cv2.warpPerspective(original, matrix, (maxWidth, maxHeight)) + + # Salva resultado + output_path = os.path.join(output_dir, f"{doc_type}_{Path(image_path).name}") + cv2.imwrite(str(output_path), warped) + + return { + "success": True, + "message": "Processamento concluído com sucesso", + "width": maxWidth, + "height": maxHeight + } + + except Exception as e: + return { + "success": False, + "message": str(e) + } + +if __name__ == "__main__": + if len(sys.argv) != 4: + print(json.dumps({"success": False, "message": "Uso: python document_detector.py "})) + sys.exit(1) + + result = process_document(Path(sys.argv[1]), sys.argv[2], Path(sys.argv[3])) + print(json.dumps(result)) diff --git a/document_history.php b/document_history.php new file mode 100644 index 0000000..5681ca4 --- /dev/null +++ b/document_history.php @@ -0,0 +1,85 @@ +connect_error) { + die("Connection failed: " . $mysqli->connect_error); +} + +// Buscar histórico de documentos processados +$query = "SELECT pd.*, u.username FROM processed_documents pd + LEFT JOIN users u ON pd.user_id = u.id + ORDER BY pd.created_at DESC"; +$result = $mysqli->query($query); +?> + +
+

Histórico de Documentos Processados

+ + + + + + + + + + + + + fetch_assoc()): ?> + + + + + + + + + +
Data/HoraUsuárioDocumento OriginalDocumento ProcessadoAções
+ + Ver Original + + + + Ver Processado + + + +
+
+ + diff --git a/index.php b/index.php index 442e759..ee0d53a 100644 --- a/index.php +++ b/index.php @@ -2,9 +2,10 @@ ob_start(); session_start(); +//require_once 'config.php'; // Verificar se o usuário está logado -if (!isset($_SESSION['user_id'])) { +if (!isset($_SESSION['user_id']) && !in_array($_GET['page'], ['login', 'logout'])) { header("Location: login.php"); exit(); } @@ -32,28 +33,56 @@ include 'top_menu.php'; Bem-vindo ao Sistema de Ferramentas"; + switch($page) { + case 'upload': + include 'prova/upload_prova.php'; + break; + case 'status': + include 'prova/status.php'; + break; + case 'list_files': + include 'prova/list_files.php'; + break; + case 'register_client': + include 'clientes/register_client.php'; + break; + case 'list_clients': + include 'clientes/list_clients.php'; + break; + case 'client_details': + if (isset($_GET['id'])) { + include 'clientes/client_details.php'; + } + break; + case 'edit_client': + if (isset($_GET['id'])) { + include 'clientes/edit_client.php'; + } + break; + case 'delete_client': + if (isset($_GET['id'])) { + include 'clientes/delete_client.php'; + } + break; + case 'edit_note': + if (isset($_POST['id'])) { + include 'clientes/edit_note.php'; + } + break; + case 'delete_note': + if (isset($_POST['id'])) { + include 'clientes/delete_note.php'; + } + break; + case 'doc_upload': + include 'upload.php'; + break; + case 'doc_list': + include 'list.php'; + break; + default: + echo "

Bem-vindo ao Sistema de Ferramentas

"; + break; } } else { echo "

Bem-vindo ao Sistema de Ferramentas

"; diff --git a/list.php b/list.php new file mode 100644 index 0000000..b396bc6 --- /dev/null +++ b/list.php @@ -0,0 +1,93 @@ + + + + Documentos Processados + + + + +
+ Selecione um cliente para ver seus documentos:

"; + $sql = "SELECT id, nome FROM clientes ORDER BY nome"; + $result = $conn->query($sql); + + while ($row = $result->fetch_assoc()) { + echo "
"; + echo "
"; + echo "" . $row['nome'] . ""; + echo "
"; + echo "
"; + echo "Ver documentos"; + echo "
"; + echo "
"; + } + } else { + $client_id = $_GET['client_id']; + + // Buscar informações do cliente + $sql = "SELECT nome FROM clientes WHERE id = ?"; + $stmt = $conn->prepare($sql); + $stmt->bind_param("i", $client_id); + $stmt->execute(); + $result = $stmt->get_result(); + $cliente = $result->fetch_assoc(); + + echo "

Documentos de " . $cliente['nome'] . "

"; + + // Buscar documentos do cliente + $sql = "SELECT * FROM documentos WHERE client_id = ? ORDER BY data_upload DESC"; + $stmt = $conn->prepare($sql); + $stmt->bind_param("i", $client_id); + $stmt->execute(); + $result = $stmt->get_result(); + + if ($result->num_rows > 0) { + while ($doc = $result->fetch_assoc()) { + echo "
"; + echo "
"; + echo "Tipo: " . ucfirst($doc['tipo']) . "
"; + echo "Data: " . date("d/m/Y H:i", strtotime($doc['data_upload'])); + echo "
"; + echo "
"; + echo "Visualizar | "; + echo "Excluir"; + echo "
"; + echo "
"; + } + } else { + echo "

Nenhum documento processado para este cliente.

"; + } + + echo "

Upload novo documento

"; + } + ?> +
+ + + + diff --git a/menu.php b/menu.php index afd199e..ecaf664 100644 --- a/menu.php +++ b/menu.php @@ -12,7 +12,7 @@ if (!isset($_SESSION['user_id'])) {
  • Autenticador de Provas Digitais @@ -24,6 +24,13 @@ if (!isset($_SESSION['user_id'])) {
  • Listagem de Clientes
  • +
  • + Processador de Documentos + +
  • diff --git a/process.php b/process.php new file mode 100644 index 0000000..9d1aacc --- /dev/null +++ b/process.php @@ -0,0 +1,42 @@ +prepare($sql); + $stmt->bind_param("iss", $client_id, $doc_type, $processed_file); + $stmt->execute(); + + header("Location: index.php?page=doc_list&client_id=" . $client_id); +} else { + header("Location: index.php?page=doc_upload&error=1"); +} +?> diff --git a/style.css b/style.css index 4eb5acf..2723ee2 100644 --- a/style.css +++ b/style.css @@ -209,3 +209,50 @@ textarea { #search-button:hover { background-color: #0056b3; } + +/* Estilos para processamento de documentos */ +.upload-form { + max-width: 600px; + margin: 20px auto; + padding: 20px; + background: #f5f5f5; + border-radius: 5px; +} + +.result-preview { + margin-top: 30px; +} + +.image-comparison { + display: flex; + justify-content: space-around; + margin-top: 20px; + flex-wrap: wrap; +} + +.image-comparison img { + max-width: 45%; + height: auto; + margin: 10px; + border: 1px solid #ddd; + box-shadow: 0 0 5px rgba(0,0,0,0.2); +} + +.alert { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px; +} + +.alert-success { + color: #155724; + background-color: #d4edda; + border-color: #c3e6cb; +} + +.alert-error { + color: #721c24; + background-color: #f8d7da; + border-color: #f5c6cb; +} diff --git a/upload.php b/upload.php new file mode 100644 index 0000000..12b4705 --- /dev/null +++ b/upload.php @@ -0,0 +1,89 @@ + + + + + Upload de Documentos + + + +
    +

    Upload de Documentos

    +
    +

    +
    + +

    +

    +
    + +

    +

    +
    + +

    + +
    +

    Ver documentos processados

    +
    + +
    +

    Resultado do Processamento:

    +
    +

    Documento Original:

    + Original +
    +
    +

    Documento Processado:

    + Processado +
    +
    + +
    + + + +