Skip to content

Migração a partir do python-pptx

O Office Oxide lê PPTX 46× mais rápido que o python-pptx (0,7 ms contra 32,5 ms em média em 806 arquivos), com taxa de sucesso 11,7 pontos percentuais maior. Também lê .ppt legado diretamente — o python-pptx não consegue.

Quando migrar

Troque se você faz qualquer uma destas coisas:

  • Extrai texto de slides, notas ou tabelas de .pptx para ingestão / RAG
  • Converte apresentações em Markdown ou HTML para previews
  • Executa templating tipo find-and-replace (“Q3 → Q4”, “{{quarter}}”, “{{growth}}”)
  • Precisa de suporte a .ppt sem chamar o LibreOffice
  • Quer uma única biblioteca que cubra também .docx, .xlsx e formatos legados

Fique no python-pptx se:

  • Você constrói PPTX complexos do zero, com layouts personalizados, animações, transições e geometria de formas
  • Precisa de controle fino sobre o XML de layout dos slides

Instalação

pip uninstall python-pptx
pip install office-oxide

Guia rápido lado a lado

Ler todo o texto dos slides

python-pptx

from pptx import Presentation

prs = Presentation("deck.pptx")
for slide in prs.slides:
    for shape in slide.shapes:
        if shape.has_text_frame:
            for para in shape.text_frame.paragraphs:
                for run in para.runs:
                    print(run.text)

office_oxide

from office_oxide import Document

with Document.open("deck.pptx") as doc:
    text = doc.plain_text()
print(text)

Iterar por slide

python-pptx

prs = Presentation("deck.pptx")
for i, slide in enumerate(prs.slides, 1):
    title = slide.shapes.title.text if slide.shapes.title else "(no title)"
    print(f"slide {i}: {title}")

office_oxide

with Document.open("deck.pptx") as doc:
    ir = doc.to_ir()

for i, section in enumerate(ir["sections"], 1):
    print(f"slide {i}: {section.get('title') or '(no title)'}")

Cada seção do IR corresponde a um slide. section["title"] vem do placeholder de título.

Ler tabelas em slides

python-pptx

for slide in prs.slides:
    for shape in slide.shapes:
        if shape.has_table:
            for row in shape.table.rows:
                cells = [c.text for c in row.cells]
                print(cells)

office_oxide

with Document.open("deck.pptx") as doc:
    ir = doc.to_ir()

for section in ir["sections"]:
    for el in section["elements"]:
        if el["kind"] == "Table":
            for row in el["rows"]:
                print(row)

Ler notas do apresentador

python-pptx

for slide in prs.slides:
    if slide.has_notes_slide:
        print(slide.notes_slide.notes_text_frame.text)

office_oxide

plain_text() e to_markdown() incluem as notas por padrão — elas são anexadas ao fim da seção de cada slide. Se precisar das notas separadamente, use o acessor específico do formato:

with Document.open("deck.pptx") as doc:
    pptx = doc.as_pptx()
    for i, slide in enumerate(pptx.slides(), 1):
        notes = slide.notes()
        if notes:
            print(f"slide {i} notes: {notes}")

Templating (find-and-replace)

python-pptx — sem API de primeira classe; o padrão comum é percorrer o text frame de cada shape e reescrever. Fácil de quebrar em correspondências entre runs.

office_oxide

from office_oxide import EditableDocument

with EditableDocument.open("deck_template.pptx") as ed:
    ed.replace_text("{{quarter}}", "Q4 2026")
    ed.replace_text("{{growth}}",  "+18.4%")
    ed.save("q4_deck.pptx")

replace_text percorre cada <a:t> de todos os slides e notes-slides e preserva todas as partes OPC não modificadas (imagens, gráficos, layouts, temas).

Converter para Markdown / HTML

python-pptx — nada embutido.

office_oxide

with Document.open("deck.pptx") as doc:
    md   = doc.to_markdown()
    html = doc.to_html()

A saída em Markdown tem uma seção ## Slide N por slide, com o conteúdo e as notas anexadas como blockquotes.

Lendo .ppt legado

O python-pptx não abre .ppt. O Office Oxide lê diretamente:

from office_oxide import Document

with Document.open("legacy.ppt") as doc:
    print(doc.plain_text())
    doc.save_as("modern.pptx")    # migração em uma linha

Desempenho

Biblioteca Média p99 Taxa de sucesso
office_oxide 0,7 ms 3,9 ms 98,4%
python-pptx 32,5 ms 174 ms 86,7%

Uma ingestão de 100.000 apresentações que leva 54 minutos com python-pptx termina em 70 segundos com office_oxide.

O que se perde

O EditableDocument cobre o caso de templating. Para construção de PPTX mais rica — adicionar slides, layouts personalizados, gráficos, animações — desça até office_oxide.pptx::create::PptxBuilder, ou fique no python-pptx para a etapa de criação e use o office_oxide para a ingestão.

Veja também