#!/usr/bin/env python # -*- coding: utf-8 -*- """ Script para processar PDFs e carregar no banco de dados Descomplicar - Agência de Aceleração Digital https://www.descomplicar.pt """ import os from pathlib import Path from processors.pdf_processor import PDFProcessor from processors.db_processor import DBProcessor from processors.embedding_processor import EmbeddingProcessor from dotenv import load_dotenv import json from datetime import datetime def update_changelog(new_files: list, modified_files: list = None): """Atualiza o CHANGELOG.md""" changelog_path = Path(__file__).parent.parent / 'CHANGELOG.md' # Criar entrada para hoje today = datetime.now().strftime('%d-%m-%Y') entry = f"\n[1.0.0] - {today}\n" if new_files: entry += "\nAdicionado\n" for file in new_files: entry += f"- {file}\n" if modified_files: entry += "\nAlterado\n" for file in modified_files: entry += f"- {file}\n" # Adicionar ao início do arquivo if changelog_path.exists(): content = changelog_path.read_text() else: content = "# Changelog\n\nTodas as alterações notáveis neste projeto serão documentadas neste arquivo.\n" content = content.split('\n\n', 1)[0] + '\n' + entry + '\n' + content.split('\n\n', 1)[1] changelog_path.write_text(content) def update_readme(processed_files: list): """Atualiza o README.md com informações dos documentos processados""" readme_path = Path(__file__).parent.parent / 'README.md' content = """# SuperBot Knowledge Base Base de Conhecimento para o SuperBot da Descomplicar. ## Documentos Processados | Documento | Tipo | Data | Tags | |-----------|------|------|------| """ for doc in processed_files: tags = ', '.join(doc['tags']) if isinstance(doc['tags'], list) else doc['tags'] content += f"| {doc.get('título', 'Sem título')} | {doc.get('tipo_documento', 'N/A')} | {doc.get('data_original', 'N/A')} | {tags} |\n" content += """ ## Estrutura do Projeto - `input/`: Diretório com os PDFs originais - `output/`: Diretório com os documentos processados em markdown - `src/`: Código fonte - `processors/`: Módulos de processamento - `pdf_processor.py`: Processamento de PDFs - `db_processor.py`: Integração com banco de dados - `embedding_processor.py`: Geração de embeddings """ readme_path.write_text(content) def main(): """Função principal.""" # Carregar variáveis de ambiente load_dotenv() # Configurar diretórios project_root = Path(__file__).parent.parent input_dir = project_root / 'input' output_dir = project_root / 'output' # Criar diretórios se não existirem input_dir.mkdir(exist_ok=True) output_dir.mkdir(exist_ok=True) # Inicializar processadores db = DBProcessor() embedding = EmbeddingProcessor() try: # Inicializar schema do banco de dados print("A inicializar schema do banco de dados...") db.init_schema() # Lista para armazenar informações dos documentos processados processed_docs = [] new_files = [] # Processar cada PDF no diretório de entrada for filename in os.listdir(input_dir): if filename.endswith('.pdf'): input_file = os.path.join(input_dir, filename) print(f"\nA processar ficheiro: {input_file}") # Criar diretório de saída específico doc_output_dir = output_dir / filename.replace('.pdf', '') doc_output_dir.mkdir(exist_ok=True) # Processar PDF processor = PDFProcessor(input_file) processor.process_content() # Salvar em markdown output_file = doc_output_dir / 'conteudo.md' processor.save_markdown(str(output_file)) # Salvar metadados metadata_file = doc_output_dir / 'metadata.json' with open(metadata_file, 'w', encoding='utf-8') as f: json.dump(processor.metadata, f, ensure_ascii=False, indent=2) # Salvar no banco de dados print("A salvar no banco de dados...") document_id = db.save_document( title=processor.metadata.get('título', ''), content=processor.content, metadata=processor.metadata, file_path=input_file ) print(f"Documento salvo com ID: {document_id}") # Gerar embeddings print("A gerar embeddings...") embedding.update_document_embeddings(document_id) print("Embeddings gerados com sucesso") # Adicionar à lista de documentos processados processed_docs.append(processor.metadata) new_files.append(filename) print(f"\nResultado guardado em: {doc_output_dir}") # Atualizar documentação if processed_docs: update_readme(processed_docs) update_changelog(new_files) print("\nDocumentação atualizada com sucesso!") except Exception as e: print(f"Erro: {str(e)}") if __name__ == "__main__": main()