Cerca e sostituisci testo nelle presentazioni PowerPoint in Python

Panoramica

Aspose.Slides for Python via .NET può cercare, evidenziare e sostituire testo in un singolo frame di testo o in tutta una presentazione. Queste funzionalità sono utili per revisioni, redazione, controlli terminologici, pulizia di modelli e altri flussi di lavoro automatizzati di elaborazione dei documenti.

Nel primo esempio sotto, utilizziamo un file denominato “sample.pptx”, che contiene una singola casella di testo nella prima diapositiva con il seguente contenuto:

Sample text

Scegli l’ambito della ricerca

Utilizza i metodi di TextFrame per limitare un’operazione a un frame di testo. Utilizza i metodi di Presentation per elaborare tutto il testo applicabile nella presentazione.

Operazione Un frame di testo Intera presentazione
Evidenzia testo letterale TextFrame.highlight_text Presentation.highlight_text
Evidenzia corrispondenze di espressione regolare TextFrame.highlight_regex Presentation.highlight_regex
Sostituisci testo letterale TextFrame.replace_text Presentation.replace_text
Sostituisci corrispondenze di espressione regolare TextFrame.replace_regex Presentation.replace_regex

Configura l’abbinamento del testo

Per le operazioni su testo letterale, utilizza TextSearchOptions per controllare l’abbinamento:

Le operazioni con espressioni regolari usano una stringa di modello, quindi regole di abbinamento come la sensibilità al maiuscolo/minuscolo e i confini di parola sono definite dall’espressione stessa.

Identifica il proprietario di un frame di testo

I flussi di lavoro generici di elaborazione del testo spesso ricevono un [TextFrame] durante la ricerca, la sostituzione, la validazione o l’esportazione del testo. Usa [TextFrame.parent_shape] e [TextFrame.parent_cell] per determinare quale oggetto della presentazione è proprietario del frame di testo.

I valori attesi dipendono dal proprietario:

Proprietario del frame di testo parent_shape parent_cell
Una AutoShape o un’altra forma contenente testo La [Shape] proprietaria None
Una cella di tabella None La [Cell] proprietaria

Entrambe le proprietà sono di sola lettura e servono per la navigazione. Leggerle non sposta il frame di testo né ne cambia il proprietario. Il codice generico dovrebbe verificare entrambe le proprietà per None e gestire il caso in cui nessuno dei due proprietari sia disponibile.

L’esempio seguente utilizza SlideUtil.get_all_text_frames per iterare attraverso i frame di testo in una presentazione. Per le forme, riporta il nome della forma, il tipo di runtime Python e la diapositiva contenente. Per le celle di tabella, riporta le coordinate di colonna e riga (indice zero) e la diapositiva contenente.

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

Per i contenuti SmartArt, itera attraverso le forme in SmartArtNode.shapes e accedi a ciascuna ISmartArtShape.text_frame. Il frame di testo può essere ricondotto alla forma associata tramite TextFrame.parent_shape, mentre TextFrame.parent_cell è None. Pertanto, il ramo della forma nell’esempio gestisce anche il testo proveniente dai nodi SmartArt.

Evidenzia testo

Usa il metodo TextFrame.highlight_text per evidenziare le corrispondenze di testo letterale in un frame di testo. Passa [TextSearchOptions] per controllare la ricerca.

Il codice di esempio qui sotto evidenzia tutte le occorrenze del carattere “try” e poi evidenzia solo la parola completa “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

    # Evidenzia ogni occorrenza di "try" nel frame di testo.
    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

    # Evidenzia solo la parola completa "to".
    shape.text_frame.highlight_text(
        "to", draw.Color.violet, whole_word_search_options, None
    )

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

Il risultato:

Il testo evidenziato

Evidenzia testo usando le espressioni regolari

Il metodo TextFrame.highlight_regex evidenzia le corrispondenze di testo trovate da un’espressione regolare in un frame di testo.

Il codice seguente evidenzia tutte le parole contenenti sette o più caratteri:

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
    )

Il risultato:

Il testo evidenziato usando l’espressione regolare

Evidenzia testo in tutta la presentazione

Usa Presentation.highlight_text e Presentation.highlight_regex per cercare tutti i frame di testo applicabili in una presentazione. L’esempio seguente evidenzia un termine letterale e tutti gli indirizzi 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
    )

Sostituisci testo in un frame di testo

Usa TextFrame.replace_text per testo letterale e TextFrame.replace_regex per sostituzioni basate su modello. Questi metodi aggiornano il testo corrispondente all’interno del frame di testo esistente, mantenendo la formattazione delle parti circostanti invece di ricostruire il frame da una stringa semplice.

L’esempio seguente uniforma una variante ortografica e poi sostituisce le etichette di versione:

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
    )

Se una corrispondenza attraversa parti con formattazioni diverse, controlla il risultato per confermare quale formattazione deve essere applicata al testo di sostituzione.

Sostituisci testo in tutta la presentazione

Usa Presentation.replace_text e Presentation.replace_regex per applicare le stesse operazioni a tutta la presentazione. Questo è utile per la pulizia di modelli, aggiornamenti terminologici e redazione.

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

Come posso cercare solo una casella di testo invece dell’intera presentazione?

Ottieni il frame di testo della forma e chiama TextFrame.highlight_text, TextFrame.highlight_regex, TextFrame.replace_text o TextFrame.replace_regex su quel frame. I metodi a livello di presentazione elaborano tutti i frame di testo applicabili.

Come posso abbinare parole complete con la corretta capitalizzazione?

Imposta TextSearchOptions.whole_words_only e TextSearchOptions.case_sensitive su True e passa le opzioni a un metodo di evidenziazione o sostituzione per testo letterale. Per le espressioni regolari, definisci i confini di parola e la sensibilità al maiuscolo/minuscolo direttamente nel modello.

La ricerca e la sostituzione possono includere il testo nelle note della diapositiva?

Sì. Imposta TextSearchOptions.include_notes su True quando utilizzi un’operazione a livello di presentazione per testo letterale.

La sostituzione del testo preserva la sua formattazione?

TextFrame.replace_text e TextFrame.replace_regex modificano il testo corrispondente all’interno del frame di testo esistente e mantengono la formattazione delle parti circostanti. Se una corrispondenza attraversa parti con formattazioni diverse, esamina il risultato per assicurarti che la sostituzione utilizzi lo stile desiderato.