Skip to content

Миграция с python-pptx

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

Когда мигрировать

Переходите, если вы делаете что-либо из этого:

  • Извлекаете текст слайдов, заметки или таблицы из .pptx для ingestion / 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 для инжеста.

См. также