Suche und Ersetze Text in PowerPoint‑Präsentationen auf Android

Übersicht

Aspose.Slides für Android über Java kann Text in einem einzelnen Textfeld oder in einer gesamten Präsentation suchen, hervorheben und ersetzen. Jede Operation kann außerdem eine Anwendung über jede Übereinstimmung mittels eines Ergebnis‑Callbacks benachrichtigen. Dadurch ist es möglich, eine Präsentation zu aktualisieren und gleichzeitig ein Audit‑Protokoll zu erstellen, das den gefundenen Text, seinen Kontext, die Position, das Textfeld und die Foliennummer enthält.

Diese Funktionen sind nützlich für Überprüfungen, Schwärzungen, Terminologie‑Prüfungen, Vorlagen‑Bereinigungen und automatisierte Bericht‑Workflows.

In den nachfolgenden ersten Beispielen verwenden wir eine Datei namens “sample.pptx”, die auf der ersten Folie ein einzelnes Textfeld mit folgendem Text enthält:

Beispieltext

Suchbereich wählen

Verwenden Sie Methoden von ITextFrame um eine Operation auf ein Textfeld zu beschränken. Verwenden Sie Methoden von IPresentation um den gesamten anwendbaren Text in der Präsentation zu verarbeiten.

Operation Ein Textfeld Gesamte Präsentation
Literaltext hervorheben ITextFrame.highlightText IPresentation.highlightText
Übereinstimmungen regulärer Ausdrücke hervorheben ITextFrame.highlightRegex IPresentation.highlightRegex
Literaltext ersetzen ITextFrame.replaceText IPresentation.replaceText
Übereinstimmungen regulärer Ausdrücke ersetzen ITextFrame.replaceRegex IPresentation.replaceRegex

Textabgleich konfigurieren

Für Literal‑Text‑Operationen verwenden Sie TextSearchOptions, um das Matching zu steuern:

Operationen mit regulären Ausdrücken verwenden ein Java‑Pattern, sodass Matching‑Regeln wie Groß‑/Kleinschreibung und Wortgrenzen durch den Ausdruck und seine Flags definiert werden.

Match‑Informationen mit einem Callback sammeln

Implementieren Sie IFindResultCallback, um für jede Übereinstimmung eine Benachrichtigung zu erhalten. Seine Methode IFindResultCallback.foundResult liefert das zugehörige Textfeld, den Quelltext, den gefundenen Text und die Trefferposition.

Der Callback erhält die Foliennummer nicht direkt. Die nachfolgende Implementierung leitet sie aus der übergeordneten Folie ab und verarbeitet zudem Text, der in Foliennotizen gefunden wird. Ein nullable Integer ermöglicht es, dass dasselbe Ergebnis‑Modell Text zu anderen Folientypen zuordnen kann.

import com.aspose.slides.*;
import java.util.ArrayList;
import java.util.List;

final class TextMatch {
    private final ITextFrame textFrame;
    private final String sourceText;
    private final String foundText;
    private final int textPosition;
    private final Integer slideNumber;

    TextMatch(ITextFrame textFrame, String sourceText, String foundText, int textPosition, Integer slideNumber) {
        this.textFrame = textFrame;
        this.sourceText = sourceText;
        this.foundText = foundText;
        this.textPosition = textPosition;
        this.slideNumber = slideNumber;
    }

    ITextFrame getTextFrame() {
        return textFrame;
    }

    String getSourceText() {
        return sourceText;
    }

    String getFoundText() {
        return foundText;
    }

    int getTextPosition() {
        return textPosition;
    }

    Integer getSlideNumber() {
        return slideNumber;
    }
}

final class TextSearchCallback implements IFindResultCallback {
    private final List<TextMatch> results = new ArrayList<TextMatch>();

    List<TextMatch> getResults() {
        return results;
    }

    @Override
    public void foundResult(ITextFrame textFrame, String sourceText, String foundText, int textPosition) {
        Integer slideNumber = getSlideNumber(textFrame);
        TextMatch result = new TextMatch(textFrame, sourceText, foundText, textPosition, slideNumber);
        results.add(result);
    }

    private static Integer getSlideNumber(ITextFrame textFrame) {
        if (!(textFrame instanceof TextFrame)) {
            return null;
        }

        IBaseSlide parentSlide = ((TextFrame) textFrame).getSlide();

        if (parentSlide instanceof ISlide) {
            return ((ISlide) parentSlide).getSlideNumber();
        }

        if (parentSlide instanceof INotesSlide) {
            return ((INotesSlide) parentSlide).getParentSlide().getSlideNumber();
        }

        return null;
    }
}

Bei Ersetz‑Operationen enthält foundText den ursprünglichen gefundenen Text, sodass der Callback exakt festhalten kann, welche Begriffe ersetzt wurden.

Text hervorheben

Verwenden Sie die Methode ITextFrame.highlightText, um Literal‑Text‑Übereinstimmungen in einem Textfeld hervorzuheben. Übergeben Sie TextSearchOptions , um die Suche zu steuern, sowie einen Callback, um Trefferdetails zu sammeln.

Das untenstehende Code‑Beispiel hebt alle Vorkommen der Zeichen “try” hervor und markiert anschließend nur das komplette Wort “to”. Beide Suchen melden ihre Treffer an denselben Callback.

import com.aspose.slides.*;
import android.graphics.Color;

Presentation presentation = new Presentation("sample.pptx");
try {
    ISlide slide = presentation.getSlides().get_Item(0);
    IAutoShape shape = (IAutoShape) slide.getShapes().get_Item(0);
    TextSearchCallback callback = new TextSearchCallback();

    TextSearchOptions substringSearchOptions = new TextSearchOptions();
    substringSearchOptions.setCaseSensitive(false);
    int substringHighlightColor = Color.rgb(173, 216, 230);

    // Hervorheben jedes Vorkommens von "try" im Textfeld.
    shape.getTextFrame().highlightText("try", substringHighlightColor, substringSearchOptions, callback);

    TextSearchOptions wholeWordSearchOptions = new TextSearchOptions();
    wholeWordSearchOptions.setWholeWordsOnly(true);
    wholeWordSearchOptions.setCaseSensitive(false);
    int wholeWordHighlightColor = Color.rgb(238, 130, 238);

    // Nur das komplette Wort "to" hervorheben.
    shape.getTextFrame().highlightText("to", wholeWordHighlightColor, wholeWordSearchOptions, callback);

    for (TextMatch result : callback.getResults()) {
        System.out.println("Found '" + result.getFoundText() + "' at position " +
                result.getTextPosition() + " on slide " + result.getSlideNumber() + ".");
    }

    presentation.save("highlighted_text.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

Das Ergebnis:

Der hervorgehobene Text

Text mithilfe regulärer Ausdrücke hervorheben

Die Methode ITextFrame.highlightRegex hebt Textübereinstimmungen, die durch einen regulären Ausdruck gefunden wurden, in einem Textfeld hervor.

Der folgende Code hebt alle Wörter mit sieben oder mehr Zeichen hervor und sammelt jede Übereinstimmung:

import com.aspose.slides.*;
import android.graphics.Color;
import java.util.regex.Pattern;

Presentation presentation = new Presentation("sample.pptx");
try {
    ISlide slide = presentation.getSlides().get_Item(0);
    IAutoShape shape = (IAutoShape) slide.getShapes().get_Item(0);
    TextSearchCallback callback = new TextSearchCallback();
    Pattern regex = Pattern.compile("\\b[^\\s]{7,}\\b");

    shape.getTextFrame().highlightRegex(regex, Color.YELLOW, callback);

    presentation.save("highlighted_text_using_regex.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

Das Ergebnis:

Der hervorgehobene Text mit regulärem Ausdruck

Text in einer Präsentation hervorheben

Verwenden Sie IPresentation.highlightText und IPresentation.highlightRegex, um alle anwendbaren Textfelder in einer Präsentation zu durchsuchen. Das folgende Beispiel hebt einen Literalbegriff und alle E‑Mail‑Adressen hervor, wobei für die beiden Suchen separate Ergebnis‑Sammlungen gehalten werden.

import com.aspose.slides.*;
import android.graphics.Color;
import java.util.regex.Pattern;

Presentation presentation = new Presentation("presentation.pptx");
try {
    TextSearchCallback termCallback = new TextSearchCallback();
    TextSearchOptions searchOptions = new TextSearchOptions();
    searchOptions.setWholeWordsOnly(true);
    searchOptions.setCaseSensitive(false);

    int termHighlightColor = Color.rgb(255, 165, 0);
    presentation.highlightText("confidential", termHighlightColor, searchOptions, termCallback);

    TextSearchCallback emailCallback = new TextSearchCallback();
    Pattern emailRegex = Pattern.compile(
            "\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}\\b",
            Pattern.CASE_INSENSITIVE);

    presentation.highlightRegex(emailRegex, Color.YELLOW, emailCallback);
    presentation.save("highlighted_presentation.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

Text in einem Textfeld ersetzen

Verwenden Sie ITextFrame.replaceText für Literal‑Text und ITextFrame.replaceRegex für ersatzbasierte Muster. Diese Methoden aktualisieren den gefundenen Text im bestehenden Textfeld, wobei die Formatierung der umgebenden Teile erhalten bleibt, anstatt das Textfeld aus einem reinen String neu zu erstellen.

Das folgende Beispiel standardisiert eine Rechtschreibvariante und ersetzt anschließend Versionsbezeichnungen. Derselbe Callback zeichnet die ursprünglichen, durch beide Operationen gefundenen Begriffe auf.

import com.aspose.slides.*;
import java.util.regex.Pattern;

Presentation presentation = new Presentation("presentation.pptx");
try {
    ISlide slide = presentation.getSlides().get_Item(0);
    IAutoShape shape = (IAutoShape) slide.getShapes().get_Item(0);
    TextSearchCallback callback = new TextSearchCallback();
    TextSearchOptions searchOptions = new TextSearchOptions();
    searchOptions.setWholeWordsOnly(true);
    searchOptions.setCaseSensitive(false);

    shape.getTextFrame().replaceText("colour", "color", searchOptions, callback);

    Pattern versionRegex = Pattern.compile("\\bv\\d+(?:\\.\\d+)*\\b", Pattern.CASE_INSENSITIVE);
    shape.getTextFrame().replaceRegex(versionRegex, "current version", callback);

    presentation.save("updated_text_frame.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

Falls ein Treffer Teile mit unterschiedlicher Formatierung umfasst, prüfen Sie die Ausgabe, um zu bestätigen, welche Formatierung auf den ersetzten Text angewendet werden soll.

Text in einer Präsentation ersetzen

Verwenden Sie IPresentation.replaceText und IPresentation.replaceRegex, um dieselben Operationen über die gesamte Präsentation hinweg anzuwenden. Dies ist nützlich für Vorlagen‑Bereinigungen, Terminologie‑Aktualisierungen und Schwärzungen.

import com.aspose.slides.*;
import java.util.regex.Pattern;

Presentation presentation = new Presentation("presentation.pptx");
try {
    TextSearchCallback callback = new TextSearchCallback();
    TextSearchOptions searchOptions = new TextSearchOptions();
    searchOptions.setWholeWordsOnly(true);
    searchOptions.setCaseSensitive(true);

    presentation.replaceText("Contoso", "Example Corp", searchOptions, callback);

    Pattern accountNumberRegex = Pattern.compile("\\bACCT-\\d{6}\\b");
    presentation.replaceRegex(accountNumberRegex, "ACCT-REDACTED", callback);

    presentation.save("updated_presentation.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

Treffer für Berichte gruppieren

Da jedes Ergebnis seine Foliennummer und sein Textfeld speichert, können Anwendungen Treffer für Audit‑, Reporting‑ oder Prüfungs‑Workflows gruppieren. Das folgende Beispiel gruppiert die gesammelten Ergebnisse zuerst nach Folie und anschließend nach Textfeld:

import com.aspose.slides.ITextFrame;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

Map<Integer, Map<ITextFrame, List<TextMatch>>> matchesBySlide =
        new LinkedHashMap<Integer, Map<ITextFrame, List<TextMatch>>>();

for (TextMatch result : callback.getResults()) {
    Integer slideNumber = result.getSlideNumber();
    Map<ITextFrame, List<TextMatch>> matchesByTextFrame = matchesBySlide.get(slideNumber);

    if (matchesByTextFrame == null) {
        matchesByTextFrame = new LinkedHashMap<ITextFrame, List<TextMatch>>();
        matchesBySlide.put(slideNumber, matchesByTextFrame);
    }

    ITextFrame textFrame = result.getTextFrame();
    List<TextMatch> textFrameMatches = matchesByTextFrame.get(textFrame);

    if (textFrameMatches == null) {
        textFrameMatches = new java.util.ArrayList<TextMatch>();
        matchesByTextFrame.put(textFrame, textFrameMatches);
    }

    textFrameMatches.add(result);
}

for (Map.Entry<Integer, Map<ITextFrame, List<TextMatch>>> slideEntry : matchesBySlide.entrySet()) {
    String slideLabel = slideEntry.getKey() == null ? "Other" : slideEntry.getKey().toString();
    System.out.println("Slide: " + slideLabel);

    for (Map.Entry<ITextFrame, List<TextMatch>> textFrameEntry : slideEntry.getValue().entrySet()) {
        System.out.println("  Text frame: " + textFrameEntry.getKey().getText());

        for (TextMatch result : textFrameEntry.getValue()) {
            System.out.println("    '" + result.getFoundText() + "' at position " +
                    result.getTextPosition() + "; context: '" + result.getSourceText() + "'");
        }
    }
}

FAQ

Wie kann ich nur ein Textfeld statt der gesamten Präsentation durchsuchen?

Rufen Sie das Textfeld der Form auf und verwenden Sie ITextFrame.highlightText, ITextFrame.highlightRegex, ITextFrame.replaceText, oder ITextFrame.replaceRegex für dieses Textfeld. Methoden auf Präsentationsebene verarbeiten stattdessen alle anwendbaren Textfelder.

Wie kann ich komplette Wörter mit korrekter Groß‑ und Kleinschreibung matchen?

Setzen Sie TextSearchOptions.setWholeWordsOnly und TextSearchOptions.setCaseSensitive auf true und übergeben Sie die Optionen an eine Literal‑Text‑Hervorhebungs‑ oder Ersetzungs‑Methode. Bei regulären Ausdrücken definieren Sie Wortgrenzen und Groß‑/Kleinschreibung im Java‑Pattern selbst.

Kann die Suche und Ersetzung Text in Foliennotizen einschließen?

Ja. Setzen Sie TextSearchOptions.setIncludeNotes auf true, wenn Sie eine Literal‑Text‑Operation auf Präsentationsebene verwenden. Die oben gezeigte Callback‑Implementierung ordnet ein Ergebnis in einer Notizfolie ihrer übergeordneten Foliennummer zu.

Wie kann ich einen Bericht erstellen, ohne die Präsentation ein zweites Mal zu scannen?

Übergeben Sie eine Implementierung von IFindResultCallback an die Hervorhebungs‑ oder Ersetzungs‑Operation. Der Callback erhält jede Übereinstimmung während der Ausführung, sodass die Anwendung den Quelltext, den gefundenen Text, die Position, das Textfeld und die abgeleitete Foliennummer für spätere Gruppierung oder den Export speichern kann.

Behält das Ersetzen von Text dessen Formatierung bei?

ITextFrame.replaceText und ITextFrame.replaceRegex ändern den gefundenen Text innerhalb des bestehenden Textfelds und behalten die Formatierung der umgebenden Teile bei. Falls ein Treffer Teile mit unterschiedlicher Formatierung umfasst, prüfen Sie das Ergebnis, um sicherzustellen, dass die Ersetzung den gewünschten Stil verwendet.