Communitygithub.com

Windy-X211/pptx

Criar, editar e analisar apresentações PowerPoint (.pptx). Ideal para usuários que precisam gerar slides do zero, modificar apresentações existentes ou extrair conteúdo de arquivos PPTX.

O que é pptx?

Esta skill capacita agentes de IA a lidar com apresentações PowerPoint (.pptx) de forma abrangente, suportando criação do zero usando pptxgenjs, edição baseada em modelos via manipulação OOXML, e análise de conteúdo e layout. Ela é ativada por comandos como 'fazer PPT', 'criar apresentação', 'gerar slides', 'editar PPT', 'ler PPT' ou menções a 'pptx', 'presentation', 'slides'. O processo inclui planejamento pré-geração obrigatório (com design de conteúdo, paleta de cores, tipografia e inventário de elementos visuais), geração de assets externos (gráficos matplotlib, ícones, diagramas Mermaid como último recurso), e uma etapa crítica de QA de layout e conteúdo pós-geração. A skill enfatiza a consistência de cores, evita slides em branco e segue uma estrutura rígida de slides (capa, sumário, seções, encerramento) para apresentações criadas do zero. Ela opera com scripts Python e Node.js, instalando dependências conforme necessário no ambiente ativo.

Funciona com~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Windy-X211/AgentCluster-Market/tree/HEAD/skills/pptx

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

Execução passo a passo e dependências

  1. Siga o fluxo de trabalho desta skill em ordem. Antes de uma etapa usar uma biblioteca, ferramenta de linha de comando, runtime ou fonte, verifique apenas as dependências necessárias para aquela etapa; não presuma que elas estão instaladas.
  2. Reutilize dependências que estão disponíveis. Se alguma estiver faltando, instale apenas essa dependência usando o SO atual e um gerenciador de pacotes disponível, verifique-a e tente novamente a etapa original. Não instale a lista inteira de dependências antecipadamente.
  3. Use o ambiente Python ativo (python -m pip install <pacote>, ou o python correspondente); crie um ambiente virtual local à tarefa, se necessário. Instale bibliotecas Node.js no projeto da tarefa (npm install <pacote>) para que o script possa resolvê-las. Para ferramentas de sistema e fontes, use o gerenciador de pacotes do SO disponível (por exemplo, Homebrew no macOS, apt no Debian/Ubuntu ou winget no Windows).
  4. Siga o fluxo de permissão do host quando a instalação precisar de aprovação. Se o gerenciador de pacotes ou a permissão necessária não estiver disponível, ou a instalação/download falhar, relate a dependência ausente e a etapa afetada; não tente repetidamente nem afirme que a etapa passou. Continue com etapas independentes quando possível.
  5. Mantenha o fluxo de trabalho original e as verificações de qualidade. Verifique fontes apenas quando a renderização exigir. Etapas que usam apenas texto, ferramentas integradas ou HTML autossuficiente não requerem instalação de pacotes; acesso a ferramentas externas ou autenticação devem ser tratados pelo host, não por um gerenciador de pacotes.

Convenções de caminho e ambiente de execução (leia antes de executar comandos)

  • Comando Python: Esta máquina usa python (no Windows geralmente não há python3). Todos os comandos abaixo usarão python.
  • Caminho do script: Os scripts desta skill estão em AppData/skills/pptx/scripts/ (relativo à raiz do projeto). Os comandos de script abaixo e em editing.md / pptxgenjs.md já estão escritos como caminhos relativos absolutos a partir desse diretório base e podem ser executados diretamente da raiz do projeto.
  • Diretório de trabalho: Os comandos assumem que o diretório de trabalho atual é a raiz do projeto. Se o diretório de trabalho for diferente (por exemplo, default_workdir foi alterado para outro diretório), substitua AppData/skills/pptx pelo caminho absoluto do diretório da skill.
  • Node.js: Antes de executar npm/node (necessário para pptxgenjs), adicione o diretório Node.js ao PATH, conforme as regras do projeto.

Skill PPTX

Referência rápida

TarefaGuia
Ler/analisar conteúdopython -m markitdown apresentacao.pptx
Editar ou criar a partir de modeloLeia editing.md — QA: validate_layout.py + markitdown
Criar do zero1. Planejar conteúdo → 2. Pré-gerar assets → 3. Leia pptxgenjs.md
Prevenir estouro por designLeia pptxgenjs.md
Gerar sistema de designpython AppData/skills/pptx/scripts/design/search.py "<tópico>" --design-system
Correção pós-geraçãopython AppData/skills/pptx/scripts/fix_pptx.py output.pptx
QA de layout (crítico primeiro)python AppData/skills/pptx/scripts/validate_layout.py apresentacao.pptx

Leitura de conteúdo

# Extração de texto
python -m markitdown apresentacao.pptx

# XML bruto
python AppData/skills/pptx/scripts/unpack.py apresentacao.pptx unpacked/

Fluxo de edição

Leia editing.md para detalhes completos.

  1. Analise o modelo com markitdown
  2. Descompacte + verificação de camada de estilo + plano de alinhamento Tema & Estilo
  3. Manipule slides → edite conteúdo → limpe → empacote
  4. ⚠️ QA de layout (portão obrigatório): python AppData/skills/pptx/scripts/validate_layout.py output.pptx --slides <números_dos_slides_editados>
  5. ⚠️ QA de conteúdo (obrigatório): python -m markitdown output.pptx

Criar do zero

Leia pptxgenjs.md para detalhes completos.

Use quando nenhum modelo ou apresentação de referência estiver disponível.

Estrutura de slides obrigatória (somente para criação do zero)

Ao criar uma apresentação do zero, você DEVE seguir esta estrutura:

  1. Slide 1: Página de capa
  2. Slide 2: Sumário (agenda)
  3. Slide 3 em diante: Seções de conteúdo na ordem exata listada no Slide 2
  4. Slide final: Página de encerramento/agradecimento

Não pule o slide de sumário. Não coloque slides de conteúdo antes do sumário.

⚠️ Sem slides em branco

Cada slide DEVE conter pelo menos um elemento visível (addText, addShape, addImage, addChart ou addTable) dentro do slide. Um slide com apenas uma cor de fundo e sem elementos de conteúdo é um defeito de geração.

Causas comuns de slides em branco:

  • Esquecer de adicionar conteúdo a slides divisores de seção / de transição
  • Truncamento de token no meio da geração, deixando alguns slides vazios
  • Assumir que o layout do slide ou mestre preencherá automaticamente o conteúdo (não vão — pptxgenjs cria layouts mínimos sem formas herdadas)

Se você pretende que um slide seja um divisor de seção, DEVE adicionar elementos explicitamente — por exemplo, um número de seção grande, texto de título e/ou formas decorativas.


⚠️ OBRIGATÓRIO: Planejamento pré-geração

Antes de escrever qualquer código, você DEVE completar estas etapas de planejamento:

⚡ Caminho rápido para solicitações simples: Quando o usuário pedir uma apresentação curta/simples (≤ 6 páginas, tópico único, sem diagramas complexos), pule a saída de planejamento formal e vá direto para a Etapa 3 (escrever código) usando a estrutura padrão Capa + Sumário + (N-3) Conteúdo + Encerramento. Caminho rápido = sem plano detalhado no corpo da resposta, apenas construa e execute o script.

Etapa 1: Produzir plano de design de conteúdo

Apresente um plano estruturado cobrindo:

  1. Tema e estilo geral

    • Escolha da paleta de cores (consulte a seção "Ideias de design")
    • Combinação tipográfica
    • Motivo visual para carregar entre os slides
  2. Esboço slide por slide

    Slide 1: Capa - Tipo de layout, elementos-chave
    Slide 2: Sumário - Lista de seções ordenadas
    Slide 3: [Seção 1 do Sumário] - Tipo de layout, elementos-chave, plano de insight (se visual)
    ...
    Slide N: Encerramento / Obrigado - Tipo de layout, elementos-chave
    ...
    
  3. Inventário de elementos visuais

    • Liste todas as imagens, ícones, gráficos e diagramas necessários
    • Marque cada um como: [Integrado] (formas/gráficos pptxgenjs) ou [Externo] (precisa de pré-geração)

Exemplo de saída de planejamento:

## Plano da apresentação

**Tema:** Paleta Ocean Gradient (065A82, 1C7293, 21295C)
**Fontes:** Georgia (títulos) + Calibri (corpo)
**Motivo:** Cartões arredondados com borda de acento à esquerda

### Slides:
1. Slide de capa - Título centralizado, fundo gradiente
2. Sumário - Visão geral / Arquitetura / Métricas / Cronograma
3. [Seção 1 do Sumário] - Tipo de layout, elementos-chave, plano de insight (se visual)
...
n. Obrigado - Declaração de encerramento + contato

⚠️ Após produzir seu plano, IMEDIATAMENTE prossiga para a Etapa 2 e Etapa 3. Não replaneje, não reafirme o mesmo esboço com variações menores. Produza o plano UMA VEZ, então comece a escrever código pptxgenjs.

Etapa 2: Pré-gerar assets externos

Para figuras marcadas como [Externo], gere-as ANTES de escrever o código pptxgenjs.

⚠️ CRÍTICO: Consistência de cores

Todos os diagramas e gráficos gerados DEVEM usar a mesma paleta de cores da apresentação. Defina as cores no topo do seu script de geração com base no tema escolhido.

Opção A: Formas/Gráficos nativos primeiro (PADRÃO obrigatório)

TODOS os diagramas de arquitetura, fluxogramas, diagramas de processo, organogramas e diagramas de relacionamento DEVEM ser construídos com formas nativas pptxgenjs (RETÂNGULO, OVAL, LINHA, conectores + addText). Consulte pptxgenjs.md "Construindo Diagramas com Formas Nativas" para padrões e exemplos.

  • Use um slide de modelo forte (processo, comparação, 2 colunas, grade de ícones) quando couber
  • Use formas nativas pptxgenjs (caixas/setas/linhas + texto) para fluxos, arquiteturas e hierarquias
  • Use gráficos pptxgenjs para gráficos de dados simples (barras, pizza, linhas, etc.)

Recorra ao matplotlib apenas para gráficos estatísticos complexos (mapas de calor, gráficos de dispersão, box plots) que os gráficos pptxgenjs não conseguem manipular. Recorra ao Mermaid apenas quando o diagrama for complexo demais para formas nativas E envolver muitas conexões cruzadas.

Opção B: Gráficos Matplotlib/Python

Defina a paleta de cores no início para corresponder ao tema do seu PPT:

import matplotlib.pyplot as plt
import matplotlib.colors as mcolors

# ============================================================
# PALETA DE CORES - Corresponda ao tema do seu PPT
# ============================================================
# Exemplo: tema "Ocean Gradient"
COLORS = {
    'primary': '#065A82',
    'secondary': '#1C7293',
    'accent': '#21295C',
    'background': '#F0F7FA',
    'text': '#21295C',
    'light': '#E8F4F8',
}

# Ciclo de cores para múltiplas séries de dados
COLOR_CYCLE = [COLORS['primary'], COLORS['secondary'], COLORS['accent'], '#4A90A4', '#2D5A6B']

# Aplicar tema globalmente
plt.rcParams.update({
    'axes.prop_cycle': plt.cycler(color=COLOR_CYCLE),
    'axes.facecolor': 'none',
    'axes.edgecolor': COLORS['text'],
    'axes.labelcolor': COLORS['text'],
    'text.color': COLORS['text'],
    'xtick.color': COLORS['text'],
    'ytick.color': COLORS['text'],
    'figure.facecolor': 'none',
    'font.family': 'sans-serif',
    'font.size': 12,
})
# ============================================================

# Criar gráfico com cores do tema
fig, ax = plt.subplots(figsize=(8, 5), dpi=150)
barras = ax.bar(['Q1', 'Q2', 'Q3', 'Q4'], [25, 40, 35, 50],
                color=[COLORS['primary'], COLORS['secondary'], COLORS['primary'], COLORS['secondary']],
                edgecolor=COLORS['accent'], linewidth=1.5)
ax.set_title('Receita Trimestral', fontsize=16, fontweight='bold', color=COLORS['text'])
ax.set_ylabel('Receita ($M)', color=COLORS['text'])
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)

plt.tight_layout()
width_px, height_px = int(8 * 150), int(5 * 150)
plt.savefig(f'chart_{width_px}x{height_px}.png', dpi=150, transparent=True)
plt.close()

Modelos de paleta matplotlib:

# Executivo Noturno
COLORS = {'primary': '#1E2761', 'secondary': '#CADCFC', 'accent': '#FFFFFF', 'text': '#1E2761'}

# Floresta e Musgo
COLORS = {'primary': '#2C5F2D', 'secondary': '#97BC62', 'accent': '#F5F5F5', 'text': '#2C5F2D'}

# Energia Coral
COLORS = {'primary': '#F96167', 'secondary': '#F9E795', 'accent': '#2F3C7E', 'text': '#2F3C7E'}

# Terracota Quente
COLORS = {'primary': '#B85042', 'secondary': '#E7E8D1', 'accent': '#A7BEAE', 'text': '#B85042'}

# Confiança Turquesa
COLORS = {'primary': '#028090', 'secondary': '#00A896', 'accent': '#02C39A', 'text': '#028090'}

Use para:

  • Gráficos estatísticos complexos (barras, linhas, pizza, dispersão, radar, etc.)
  • Visualizações personalizadas não suportadas pelo pptxgenjs
  • Mapas de calor, gráficos de dispersão, box plots

⚠️ NÃO use matplotlib para:

  • Diagramas de arquitetura
  • Fluxogramas / diagramas de processo
  • Organogramas / diagramas de hierarquia
  • Diagramas de topologia de rede
  • Qualquer diagrama que mostre principalmente relacionamentos entre componentes

Estes DEVEM ser construídos com formas nativas pptxgenjs para que sejam renderizados como objetos PPT editáveis — e não como imagens raster.

matplotlib - Gráficos com suporte CJK

Ao criar gráficos com matplotlib que incluam texto em chinês, você DEVE configurar a fonte:

import os
import platform
import matplotlib.pyplot as plt
import matplotlib

def setup_matplotlib_cjk():
    """Configurar matplotlib para suportar caracteres CJK"""
    sistema = platform.system()

    if sistema == "Darwin":  # macOS
        nomes_fonte = ['Arial Unicode MS', 'PingFang SC', 'Heiti SC', 'STHeiti']
    elif sistema == "Windows":
        nomes_fonte = ['Microsoft YaHei', 'SimHei', 'SimSun']
    else:  # Linux
        nomes_fonte = ['Noto Sans CJK SC', 'WenQuanYi Zen Hei', 'Droid Sans Fallback']

    # Encontrar fonte disponível
    fontes_disponiveis = [f.name for f in matplotlib.font_manager.fontManager.ttflist]
    for nome_fonte in nomes_fonte:
        if nome_fonte in fontes_disponiveis:
            plt.rcParams['font.sans-serif'] = [nome_fonte] + plt.rcParams['font.sans-serif']
            plt.rcParams['axes.unicode_minus'] = False  # Corrigir exibição de sinal de menos
            return nome_fonte
    return None

# Configurar fonte CJK antes de criar gráficos
fonte_cjk = setup_matplotlib_cjk()

# Criar um gráfico de barras com rótulos em chinês
categorias = ['第一季度', '第二季度', '第三季度', '第四季度']
valores = [120, 135, 142, 158]

plt.figure(figsize=(10, 6))
plt.bar(categorias, valores, color='steelblue')
plt.title('Dados de vendas trimestrais Quarterly Sales', fontsize=16)
plt.xlabel('Trimestre Quarter', fontsize=12)
plt.ylabel('Vendas Sales', fontsize=12)
plt.tight_layout()
plt.savefig('chart.png', dpi=150)
plt.close()

Opção C: Pesquisa web por imagens

Pesquise por imagens relevantes quando:
- Fotos de stock ou ilustrações forem necessárias
- Ícones ou logotipos forem necessários
- Imagens de referência para conceitos

Opção D: Diagramas Mermaid (último recurso)

Use apenas quando o diagrama não puder ser representado de forma limpa com formas/layout nativos, e mantenha a consistência com a apresentação:

# Instalar se necessário: npm install -g @mermaid-js/mermaid-cli

Crie um arquivo de configuração de tema correspondente à paleta do seu PPT:

// mermaid-config.json - Exemplo para tema "Ocean Gradient"
{
  "theme": "base",
  "themeVariables": {
    "primaryColor": "#065A82",
    "primaryTextColor": "#FFFFFF",
    "primaryBorderColor": "#21295C",
    "secondaryColor": "#1C7293",
    "secondaryTextColor": "#FFFFFF",
    "secondaryBorderColor": "#065A82",
    "tertiaryColor": "#E8F4F8",
    "tertiaryTextColor": "#21295C",
    "lineColor": "#21295C",
    "textColor": "#21295C",
    "mainBkg": "#E8F4F8",
    "nodeBorder": "#065A82",
    "clusterBkg": "#F0F7FA",
    "titleColor": "#21295C",
    "edgeLabelBackground": "#FFFFFF"
  }
}
cat > diagrama.mmd << 'EOF'
graph LR
    A[Cliente] --> B[API Gateway]
    B --> C[Serviço A]
    B --> D[Serviço B]
EOF

# Prefira exportação de alta resolução para uso em PPT
mmdc -i diagrama.mmd -o diagrama.png -c mermaid-config.json -b white -w 1600 --scale 2

Etapa 3: Convenção de nomenclatura de imagens (OBRIGATÓRIA)

Todas as imagens geradas DEVEM incluir dimensões no nome do arquivo:

{nome}_{largura}x{altura}.png

Exemplos:

  • architecture_800x600.png - 800px de largura, 600px de altura
  • timeline_1200x400.png - 1200px de largura, 400px de altura
  • chart_600x600.png - 600px quadrado

Ao salvar imagens, sempre inclua dimensões:

# Exemplo matplotlib
fig, ax = plt.subplots(figsize=(8, 5), dpi=150)
# ... criar gráfico ...
width_px = int(8 * 150)   # 1200
height_px = int(5 * 150)  # 750
plt.savefig(f'chart_{width_px}x{height_px}.png', dpi=150, transparent=True)
# Geração genérica via script
python script.py --width 800 --height 600 --output diagrama_800x600.png

QA de layout (portão de qualidade OBRIGATÓRIO)

Sempre após qualquer edição de slide ou geração, execute:

python AppData/skills/pptx/scripts/validate_layout.py output.pptx

Isto verifica:

  • Posicionamento de elementos dentro dos limites do slide
  • Sobreposições
  • Espaçamento mínimo
  • Integridade de tabelas e gráficos
  • Relação de aspecto de imagens

Se o QA falhar, corrija os problemas e execute novamente o script de validação até que passe.


Ferramentas de design

# Pesquisar e gerar sistemas de design para um tópico
python AppData/skills/pptx/scripts/design/search.py "Inteligência Artificial" --design-system

# Listar paletas de design disponíveis
python AppData/skills/pptx/scripts/design/search.py --list-palettes

# Aplicar um tema a uma apresentação existente
python AppData/skills/pptx/scripts/design/apply_theme.py apresentacao.pptx --palette ocean

Ferramentas de depuração e reparo

# Verificar integridade de arquivos PPTX (arquivo ZIP inválido, XML corrompido)
python AppData/skills/pptx/scripts/verify_pptx.py arquivo.pptx

# Corrigir problemas comuns pós-geração (estouro de texto, camadas, cores)
python AppData/skills/pptx/scripts/fix_pptx.py output.pptx

# Extrair todas as imagens/embutidos de um PPTX para inspeção
python AppData/skills/pptx/scripts/unpack.py arquivo.pptx saida/

Paletas de design incluídas

TemaPrimárioSecundárioAcentoFundo
Ocean Gradient#065A82#1C7293#21295C#F0F7FA
Midnight Executive#1E2761#CADCFC#FFFFFF#F8F9FA
Forest & Moss#2C5F2D#97BC62#F5F5F5#F4F7F2
Coral Energy#F96167#F9E795#2F3C7E#FFF8F0
Warm Terracotta#B85042#E7E8D1#A7BEAE#FDFBF7
Teal Trust#028090#00A896#02C39A#F0FCFC

Cada paleta pode ser usada como ponto de partida e personalizada para as necessidades da apresentação.


Exemplo de uso

Criar uma apresentação do zero:

import pptxgenjs
from pptxgenjs import Presentation

prs = Presentation()

# Configurar tema Ocean Gradient
prs.theme = {
    'colors': {'primary': '#065A82', 'secondary': '#1C7293', 'accent': '#21295C', 'background': '#F0F7FA', 'text': '#21295C'},
    'fonts': {'heading': 'Georgia', 'body': 'Calibri'}
}

# Capa
slide = prs.addSlide()
slide.background = prs.theme['colors']['primary']
slide.addText('Apresentação de IA', {'x': 1, 'y': 2, 'w': 8, 'h': 2, 'fontSize': 44, 'color': 'FFFFFF', 'align': 'center'})
slide.addText('Uma visão geral abrangente', {'x': 1, 'y': 4.5, 'w': 8, 'h': 1, 'fontSize': 24, 'color': 'CADCFC', 'align': 'center'})

# Sumário
slide2 = prs.addSlide()
# ... adicionar elementos ...

prs.save('output.pptx')

Editar uma apresentação existente:

# Extrair e inspecionar
python AppData/skills/pptx/scripts/unpack.py modelo.pptx unpacked/

# Editar XML conforme necessário (veja editing.md)
# ... fazer alterações ...

# Reempacotar
python AppData/skills/pptx/scripts/pack.py output.pptx

# Verificar qualidade
python AppData/skills/pptx/scripts/validate_layout.py output.pptx

Habilidades Relacionadas