Wyszukiwanie i zamiana tekstu w prezentacjach PowerPoint w Pythonie

Przegląd

Aspose.Slides for Python via .NET może wyszukiwać, podświetlać i zamieniać tekst w pojedynczej ramce tekstowej lub w całej prezentacji. Te możliwości są przydatne przy przeglądzie, redakcji, weryfikacji terminologii, czyszczeniu szablonów i innych zautomatyzowanych procesach przetwarzania dokumentów.

W pierwszych przykładach poniżej używamy pliku o nazwie “sample.pptx”, który zawiera jedną ramkę tekstową na pierwszym slajdzie z następującym tekstem:

Przykładowy tekst

Wybierz zakres wyszukiwania

Użyj metod na TextFrame aby ograniczyć operację do jednej ramki tekstowej. Użyj metod na Presentation aby przetworzyć cały odpowiedni tekst w prezentacji.

Operacja Jedna ramka tekstowa Cała prezentacja
Podświetlenie dosłownego tekstu TextFrame.highlight_text Presentation.highlight_text
Podświetlenie dopasowań wyrażeniem regularnym TextFrame.highlight_regex Presentation.highlight_regex
Zamiana dosłownego tekstu TextFrame.replace_text Presentation.replace_text
Zamiana dopasowań wyrażeniem regularnym TextFrame.replace_regex Presentation.replace_regex

Skonfiguruj dopasowywanie tekstu

Dla operacji na dosłownym tekście użyj TextSearchOptions, aby kontrolować dopasowanie:

Operacje wyrażeń regularnych używają ciągu wzorca, więc reguły dopasowania, takie jak wrażliwość na wielkość liter i granice słów, są definiowane w samym wyrażeniu.

Identyfikacja właściciela ramki tekstowej

Typowe przepływy przetwarzania tekstu często otrzymują TextFrame podczas wyszukiwania, zamiany, walidacji lub eksportu tekstu. Użyj TextFrame.parent_shape i TextFrame.parent_cell, aby określić, który obiekt prezentacji jest właścicielem ramki tekstowej.

Oczekiwane wartości zależą od właściciela:

Właściciel ramki tekstowej parent_shape parent_cell
AutoShape lub inny kształt zawierający tekst Właścicielski Shape None
Komórka tabeli None Właścicielski Cell

Obie właściwości są tylko do odczytu. Odczytanie ich nie przemieszcza ramki tekstowej ani nie zmienia jej właściciela. Ogólny kod powinien sprawdzać obie wartości pod kątem None i obsługiwać sytuację, gdy żaden właściciel nie jest dostępny.

Poniższy przykład używa SlideUtil.get_all_text_frames, aby przeiterować wszystkie ramki tekstowe w prezentacji. Dla kształtów raportuje nazwę kształtu, typ w czasie wykonywania Pythona oraz slajd, na którym się znajduje. Dla komórek tabeli raportuje współrzędne kolumny i wiersza (zerowe) oraz slajd, w którym się znajduje.

import aspose.slides as slides


def get_slide_label(base_slide):
    if isinstance(base_slide, slides.Slide):
        return f"slide {base_slide.slide_number}"

    if isinstance(base_slide, slides.NotesSlide):
        return f"notes for slide {base_slide.parent_slide.slide_number}"

    return type(base_slide).__name__


with slides.Presentation("presentation.pptx") as presentation:
    text_frames = slides.util.SlideUtil.get_all_text_frames(presentation, False)

    for text_frame in text_frames:
        owner_shape = text_frame.parent_shape
        if owner_shape is not None:
            shape_name = owner_shape.name or "(unnamed)"
            shape_type = type(owner_shape).__name__
            slide_label = get_slide_label(owner_shape.slide)
            print(f"Shape: {shape_name}; type: {shape_type}; {slide_label}")
            continue

        owner_cell = text_frame.parent_cell
        if owner_cell is not None:
            slide_label = get_slide_label(owner_cell.slide)
            print(f"Table cell: column {owner_cell.first_column_index}, row {owner_cell.first_row_index}; {slide_label}")
            continue

        print("The text frame owner is not available as a shape or table cell.")

Dla zawartości SmartArt iteruj przez kształty w SmartArtNode.shapes i uzyskaj dostęp do każdego ISmartArtShape.text_frame. Rama tekstowa może być powiązana z odpowiednim kształtem poprzez TextFrame.parent_shape, natomiast TextFrame.parent_cell ma wartość None. Dlatego gałąź kształtu w przykładzie obsługuje również tekst z węzłów SmartArt.

Podświetlenie tekstu

Użyj metody TextFrame.highlight_text, aby podświetlić dopasowania dosłownego tekstu w ramce tekstowej. Przekaż TextSearchOptions, aby kontrolować wyszukiwanie.

Poniższy przykład podświetla wszystkie wystąpienia znaków “try”, a następnie podświetla tylko całe słowo “to”.

import aspose.pydrawing as draw
import aspose.slides as slides

with slides.Presentation("sample.pptx") as presentation:
    slide = presentation.slides[0]
    shape = slide.shapes[0]

    substring_search_options = slides.TextSearchOptions()
    substring_search_options.case_sensitive = False

    # Podświetl każde wystąpienie "try" w ramce tekstowej.
    shape.text_frame.highlight_text(
        "try", draw.Color.light_blue, substring_search_options, None
    )

    whole_word_search_options = slides.TextSearchOptions()
    whole_word_search_options.whole_words_only = True
    whole_word_search_options.case_sensitive = False

    # Podświetl tylko całe słowo "to".
    shape.text_frame.highlight_text(
        "to", draw.Color.violet, whole_word_search_options, None
    )

    presentation.save("highlighted_text.pptx", slides.export.SaveFormat.PPTX)

Wynik:

Podświetlony tekst

Podświetlenie tekstu przy użyciu wyrażeń regularnych

Metoda TextFrame.highlight_regex podświetla dopasowania tekstu znalezione przez wyrażenie regularne w ramce tekstowej.

Poniższy kod podświetla wszystkie słowa zawierające co najmniej siedem znaków:

import aspose.pydrawing as draw
import aspose.slides as slides

with slides.Presentation("sample.pptx") as presentation:
    slide = presentation.slides[0]
    shape = slide.shapes[0]
    word_pattern = r"\b[^\s]{7,}\b"

    shape.text_frame.highlight_regex(word_pattern, draw.Color.yellow, None)

    presentation.save(
        "highlighted_text_using_regex.pptx", slides.export.SaveFormat.PPTX
    )

Wynik:

Podświetlony tekst przy użyciu wyrażenia regularnego

Podświetlenie tekstu w całej prezentacji

Użyj Presentation.highlight_text i Presentation.highlight_regex, aby przeszukać wszystkie odpowiednie ramki tekstowe w prezentacji. Poniższy przykład podświetla dosłowne wyrażenie oraz wszystkie adresy e‑mail:

import aspose.pydrawing as draw
import aspose.slides as slides

with slides.Presentation("presentation.pptx") as presentation:
    search_options = slides.TextSearchOptions()
    search_options.whole_words_only = True
    search_options.case_sensitive = False

    presentation.highlight_text(
        "confidential", draw.Color.orange, search_options, None
    )

    email_pattern = r"(?i)\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b"
    presentation.highlight_regex(email_pattern, draw.Color.yellow)

    presentation.save(
        "highlighted_presentation.pptx", slides.export.SaveFormat.PPTX
    )

Zamiana tekstu w ramce tekstowej

Użyj TextFrame.replace_text dla dosłownego tekstu i TextFrame.replace_regex dla zamiany opartej na wzorcu. Metody te aktualizują dopasowany tekst w istniejącej ramce tekstowej, zachowując formatowanie otaczających fragmentów zamiast przebudowywać ramkę z ciągu znaków.

Poniższy przykład standaryzuje wariant pisowni, a następnie zamienia etykiety wersji:

import aspose.slides as slides

with slides.Presentation("presentation.pptx") as presentation:
    slide = presentation.slides[0]
    shape = slide.shapes[0]

    search_options = slides.TextSearchOptions()
    search_options.whole_words_only = True
    search_options.case_sensitive = False

    shape.text_frame.replace_text(
        "colour", "color", search_options, None
    )

    version_pattern = r"(?i)\bv\d+(?:\.\d+)*\b"
    shape.text_frame.replace_regex(version_pattern, "current version")

    presentation.save(
        "updated_text_frame.pptx", slides.export.SaveFormat.PPTX
    )

Jeśli jedno dopasowanie obejmuje fragmenty o różnym formatowaniu, sprawdź wynik, aby potwierdzić, które formatowanie powinno zostać zastosowane do tekstu zamienionego.

Zamiana tekstu w całej prezentacji

Użyj Presentation.replace_text i Presentation.replace_regex, aby zastosować te same operacje w całej prezentacji. Jest to przydatne przy czyszczeniu szablonów, aktualizacji terminologii i redakcji.

import aspose.slides as slides

with slides.Presentation("presentation.pptx") as presentation:
    search_options = slides.TextSearchOptions()
    search_options.whole_words_only = True
    search_options.case_sensitive = True

    presentation.replace_text(
        "Contoso", "Example Corp", search_options, None
    )

    account_number_pattern = r"\bACCT-\d{6}\b"
    presentation.replace_regex(account_number_pattern, "ACCT-REDACTED")

    presentation.save(
        "updated_presentation.pptx", slides.export.SaveFormat.PPTX
    )

FAQ

Jak mogę przeszukać tylko jedną ramkę tekstową zamiast całej prezentacji?

Uzyskaj ramkę tekstową kształtu i wywołaj TextFrame.highlight_text, TextFrame.highlight_regex, TextFrame.replace_text lub TextFrame.replace_regex na tej ramce. Metody na poziomie prezentacji przetwarzają wszystkie odpowiednie ramki tekstowe.

Jak mogę dopasować całe słowa z poprawną wielkością liter?

Ustaw TextSearchOptions.whole_words_only i TextSearchOptions.case_sensitive na True i przekaż opcje do metody podświetlania lub zamiany tekstu dosłownego. Dla wyrażeń regularnych zdefiniuj granice słów i wrażliwość na wielkość liter w samym wzorcu.

Czy wyszukiwanie i zamiana mogą obejmować tekst w notatkach slajdu?

Tak. Ustaw TextSearchOptions.include_notes na True przy używaniu operacji dosłownego tekstu na poziomie prezentacji.

Czy zamiana tekstu zachowuje jego formatowanie?

TextFrame.replace_text i TextFrame.replace_regex modyfikują dopasowany tekst w istniejącej ramce tekstowej i zachowują formatowanie otaczających fragmentów. Jeśli dopasowanie obejmuje fragmenty o różnym formatowaniu, przeanalizuj wynik, aby upewnić się, że zamiana używa pożądanego stylu.