Skip to content

Міграція з python-pptx

Office Oxide читає PPTX у 46 разів швидше за python-pptx (0,7 мс проти 32,5 мс у середньому на 806 файлах) і має на 11,7 відсоткового пункту вищу частку успішного розбору. Він також читає застарілий .ppt напряму — python-pptx цього не вміє.

Коли мігрувати

Перемикайтеся, якщо ви робите щось із цього:

  • Витягуєте текст слайдів, нотатки або таблиці з .pptx для інжесту / RAG
  • Конвертуєте презентації в Markdown чи HTML для прев’ю
  • Запускаєте шаблонізацію типу пошук-і-заміна (“Q3 → Q4”, “{{quarter}}”, “{{growth}}”)
  • Потрібна підтримка .ppt без виклику LibreOffice
  • Хочете одну бібліотеку, яка також покриває .docx, .xlsx і застарілі формати

Залишайтеся на python-pptx, якщо:

  • Ви будуєте складні PPTX з нуля — з кастомними макетами, анімаціями, переходами та геометрією фігур
  • Потрібен дрібнозернистий контроль над XML макетів слайдів

Встановлення

pip uninstall python-pptx
pip install office-oxide

Порівняльна шпаргалка

Прочитати весь текст слайдів

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)

Ітерація по слайдах

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)'}")

Кожна секція IR відповідає одному слайду. section["title"] береться з заголовкового плейсхолдера.

Читання таблиць на слайдах

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)

Читання нотаток доповідача

python-pptx

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

office_oxide

plain_text() і to_markdown() за замовчуванням включають нотатки — вони додаються в кінець секції кожного слайда. Якщо потрібні нотатки окремо, використовуйте формат-специфічний аксесор:

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}")

Шаблонізація (пошук і заміна)

python-pptx — немає першокласного API; типовий патерн — обходити текстовий фрейм кожної фігури й переписувати. Легко ламається на між-run збігах.

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 обходить кожен <a:t> на всіх слайдах і слайдах нотаток і зберігає всі незмінені OPC-частини (зображення, діаграми, макети, теми).

Конвертація в Markdown / HTML

python-pptx — нічого вбудованого.

office_oxide

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

Markdown на виході — одна секція ## Slide N на слайд, із вмістом і нотатками, доданими як блоки цитат.

Читання застарілого .ppt

python-pptx не відкриває .ppt. Office Oxide читає їх напряму:

from office_oxide import Document

with Document.open("legacy.ppt") as doc:
    print(doc.plain_text())
    doc.save_as("modern.pptx")    # міграція в один рядок

Продуктивність

Бібліотека Середнє p99 Частка успіху
office_oxide 0,7 мс 3,9 мс 98,4%
python-pptx 32,5 мс 174 мс 86,7%

Інжест 100 000 презентацій, який на python-pptx займає 54 хвилини, на office_oxide завершується за 70 секунд.

Що втрачається

EditableDocument покриває сценарій шаблонізації. Для багатшої збірки PPTX — додавання слайдів, кастомних макетів, діаграм, анімацій — спускайтеся в office_oxide.pptx::create::PptxBuilder або залишайтеся на python-pptx для кроку створення й використовуйте office_oxide для інжесту.

Див. також