Documentação completa de todas as classes, funções e módulos do projeto.
Entry point do projeto.
Executa workflow de conversão completo.
Uso:
import asyncio
from pdf_conversion.main import run_workflow
asyncio.run(run_workflow())Fluxo:
- Instancia
Workflow() - Chama
await workflow.run()
Exceções:
Exception- Qualquer erro propagado das tasks
Entry point síncrono, cria event loop.
Uso:
uv run mainFluxo:
- Chama
asyncio.run(run_workflow())
Gerenciamento de configuração com Dynaconf.
Diretório raiz do projeto.
from pdf_conversion.config import ROOT_DIR
print(ROOT_DIR) # C:\Users\...\PDF-ConversionObjeto de configuração global.
from pdf_conversion.config import settings
timeout = settings.playwright.timeout
max_size = settings.conversion.max_file_size_mbSeções disponíveis:
project- Metadados do projetopaths- Caminhos dos diretóriosconversion- Regras de conversãourls- URLs de serviçosperformance- Configurações de performanceplaywright- Configurações do Playwrightlogging- Configurações de log
Retorna caminho absoluto de diretório configurado.
Parâmetros:
key(str) - Chave do caminho:"input","output","logs","temp","backup"
Retorna:
Path- Caminho absoluto do diretório
Uso:
from pdf_conversion.config import get_path
input_dir = get_path("input")
# C:\Users\...\documents\documents_to_convert
output_dir = get_path("output")
# C:\Users\...\documents\converted_documentsExceções:
KeyError- Se chave não existe emsettings.paths
Cria estrutura de diretórios do projeto.
Diretórios criados:
logs/e subpastassuccess/,failed/documents/documents_to_convert/documents/converted_documents/temp/backup/
Uso:
from pdf_conversion.config import ensure_directories
ensure_directories() # Cria todos os diretóriosNota: Chamado automaticamente ao importar o módulo.
Helpers para configuração do Playwright.
Cria browser e context com configurações do settings.
Parâmetros:
playwright(Playwright) - Instância do Playwright
Retorna:
tuple[Browser, BrowserContext]- Browser e context configurados
Uso:
from pdf_conversion.config.playwright import create_browser_context
from playwright.async_api import async_playwright
async with async_playwright() as p:
browser, context = await create_browser_context(p)
page = await context.new_page()
# ... usar pageConfigurações aplicadas:
headlessdesettings.playwright.headlesstimeoutdesettings.playwright.timeoutslow_modesettings.playwright.slow_moviewportdesettings.playwright.context_options.viewportuser_agentdesettings.playwright.context_options.user_agent
Orquestrador de tasks.
Gerencia execução sequencial de tasks.
Atributos:
tasks(list[BaseTask]) - Lista de tasks a executarshared_data(dict) - Dados compartilhados entre tasks
Métodos:
Inicializa workflow e chama setup_tasks().
from pdf_conversion.workflow import Workflow
workflow = Workflow()
print(len(workflow.tasks)) # 2 (DocumentTask, NavigationTask)Define pipeline de tasks. Sobrescreva para customizar.
def setup_tasks(self):
self.add_task(DocumentTask("document_manager"))
self.add_task(NavigationTask("ilovepdf_navigation"))Adiciona task ao pipeline.
Parâmetros:
task(BaseTask) - Instância da task
workflow.add_task(MyTask("my_task"))Executa todas as tasks sequencialmente.
Fluxo:
- Loop sobre
self.tasks - Para cada task:
await task.run_async(self.shared_data) - Atualiza
self.shared_datacom resultado
Uso:
workflow = Workflow()
await workflow.run()Exceções:
- Propaga qualquer exceção das tasks
Classe abstrata base para todas as tasks.
Fornece infraestrutura comum para tasks.
Atributos:
name(str) - Nome da tasklogger(logging.Logger) - Logger configuradoretry_attempts(int) - Tentativas de retrysleep_time(float) - Tempo de sleep entre operações
Métodos Abstratos:
Implementado por subclasses. Contém lógica específica da task.
Parâmetros:
shared_data(dict) - Dados de tasks anteriores
Retorna:
dict- Resultado para próximas tasks
Métodos Concretos:
Template method com retry automático.
Parâmetros:
shared_data(dict) - Dados de tasks anteriores
Retorna:
dict- Resultado deexecute()
Fluxo:
- Loop de retry (até
retry_attempts) - Chama
execute(shared_data) - Em sucesso: log sucesso, retorna resultado
- Em erro: log erro, retry com backoff exponencial
Uso:
task = MyTask("my_task")
result = await task.run_async({"input": "data"})Sleep configurável entre operações.
Parâmetros:
multiplier(float) - Multiplicador do tempo padrão
Uso:
await self.sleep() # settings.performance.task_sleep_time
await self.sleep(2.0) # 2x o tempo padrãoPausa para debug manual (apenas em development).
Parâmetros:
message(str) - Mensagem exibida
Uso:
self.wait_for_input("Verificar página carregou")
# Aguarda Enter no terminalNota: Desabilitado se settings.performance.enable_wait_for_input=False
Log de sucesso em arquivo.
Parâmetros:
result(dict) - Resultado da task
Arquivo gerado:
logs/success/{timestamp}.log
Log de erro com traceback.
Parâmetros:
error(Exception) - Exceção capturada
Arquivo gerado:
logs/failed/{timestamp}.log
Formata resultado para log legível.
Parâmetros:
result(dict) - Resultado da task
Retorna:
str- Resultado formatado
Task de descoberta e validação de arquivos.
Busca e valida arquivos Word para conversão.
Métodos:
Busca e valida arquivos.
Parâmetros:
shared_data(dict) - Dados compartilhados (não usado)
Retorna:
{
"valid_files": [Path("doc1.docx"), Path("doc2.docx")],
"total_files": 2,
"conversion_pending": True
}Fluxo:
- Chama
_find_word_files()→ Lista de arquivos - Chama
_validate_files()→ Valida cada arquivo - Retorna estrutura com arquivos válidos
Busca arquivos .docx e .doc.
Retorna:
list[Path]- Lista de arquivos encontrados
Uso:
files = task._find_word_files()
# [Path("doc1.docx"), Path("doc2.docx")]Valida existência e tamanho dos arquivos.
Parâmetros:
files(list[Path]) - Arquivos a validar
Retorna:
list[Path]- Arquivos válidos
Validações:
- Arquivo existe?
- Tamanho <=
settings.conversion.max_file_size_mb? - Tamanho > 0?
Task de automação web para conversão.
Automatiza conversão Word → PDF com Playwright.
Métodos:
Converte arquivos usando iLovePDF.
Parâmetros:
shared_data(dict) - Deve conter"valid_files"
Retorna:
{
"converted_files": 2,
"conversion_pending": False
}Fluxo:
- Lê
shared_data["valid_files"] - Setup Playwright (browser, context, page)
- Loop: Para cada arquivo
3.1.
_process_file()→ Upload, convert, download - Retorna estatísticas
Exceções:
KeyError- Se"valid_files"não existe em shared_data
Processa um arquivo: upload → convert → download.
Parâmetros:
page(Page) - Página do Playwrightfile(Path) - Arquivo a processar
Fluxo:
- Navega para iLovePDF
_upload_file()→ Upload- Sleep 2s (processamento)
_download_pdf()→ Download
Upload com múltiplas estratégias de seletor.
Parâmetros:
page(Page) - Página do Playwrightfile(Path) - Arquivo a fazer upload
Estratégias (fallback):
input[type="file"]#pickfilestext="Selecionar arquivos"
Exceções:
Exception- Se nenhum seletor funcionar
Download e salva PDF convertido.
Parâmetros:
page(Page) - Página do Playwrightfile(Path) - Arquivo original (para nome do PDF)
Fluxo:
- Aguarda botão de download
- Captura download com
page.expect_download() - Salva em
documents/converted_documents/{filename}.pdf
# settings.toml estrutura
{
"project": {
"name": str,
"version": str
},
"paths": {
"input": str,
"output": str,
"logs": str,
"temp": str,
"backup": str
},
"conversion": {
"max_file_size_mb": int,
"allowed_extensions": list[str],
"batch_size": int
},
"urls": {
"ilovepdf": str
},
"performance": {
"retry_attempts": int,
"task_sleep_time": float,
"enable_wait_for_input": bool
},
"playwright": {
"headless": bool,
"timeout": int,
"slow_mo": int,
"browser": str,
"launch_options": dict,
"context_options": dict
},
"logging": {
"level": str,
"format": str,
"console_output": bool,
"file_output": bool
}
}# Após DocumentTask
{
"valid_files": list[Path],
"total_files": int,
"conversion_pending": bool
}
# Após NavigationTask
{
"valid_files": list[Path],
"total_files": int,
"conversion_pending": bool, # False agora
"converted_files": int
}import asyncio
from pdf_conversion.main import run_workflow
async def main():
await run_workflow()
asyncio.run(main())from pdf_conversion.config import settings, get_path
# Ler configuração
max_size = settings.conversion.max_file_size_mb # 50
timeout = settings.playwright.timeout # 30000
# Obter caminhos
input_dir = get_path("input")
output_dir = get_path("output")
# Listar arquivos
files = list(input_dir.glob("*.docx"))from pdf_conversion.workflow.tasks.base_task import BaseTask
from pathlib import Path
class BackupTask(BaseTask):
async def execute(self, shared_data: dict) -> dict:
files = shared_data.get("valid_files", [])
backup_dir = Path("backup")
for file in files:
# Copia arquivo
import shutil
shutil.copy2(file, backup_dir / file.name)
return {
"backup_created": True,
"backup_count": len(files)
}
# Usar no workflow
from pdf_conversion.workflow import Workflow
class CustomWorkflow(Workflow):
def setup_tasks(self):
self.add_task(DocumentTask("document_manager"))
self.add_task(BackupTask("backup"))
self.add_task(NavigationTask("ilovepdf_navigation"))
# Executar
workflow = CustomWorkflow()
await workflow.run()from pathlib import Path
from pdf_conversion.config import get_path
# Ler último log de sucesso
success_dir = get_path("logs") / "success"
logs = sorted(success_dir.glob("*.log"), reverse=True)
if logs:
latest = logs[0]
print(latest.read_text())
# Ler logs de erro
failed_dir = get_path("logs") / "failed"
errors = list(failed_dir.glob("*.log"))
print(f"Total de erros: {len(errors)}")- Arquitetura - Visão de alto nível
- Tasks - Guia detalhado de tasks
- Workflow - Orquestração
- Configuração - Settings completo
- Troubleshooting - Resolução de problemas
Documentação gerada para versão 0.1.0