Wyszukiwanie i zamiana tekstu w prezentacjach PowerPoint na Androidzie
Przegląd
Aspose.Slides for Android via Java może wyszukiwać, podświetlać i zamieniać tekst w pojedynczej ramce tekstowej lub w całej prezentacji. Każda operacja może także powiadomić aplikację o każdym dopasowaniu za pośrednictwem wywołania zwrotnego z wynikiem. Dzięki temu można aktualizować prezentację i jednocześnie budować ścieżkę audytu zawierającą dopasowany tekst, jego kontekst, pozycję, ramkę tekstową oraz numer slajdu.
Te możliwości są przydatne przy przeglądzie, redakcji, sprawdzaniu terminologii, czyszczeniu szablonów i automatyzacji raportowania.
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:

Wybierz zakres wyszukiwania
Użyj metod z ITextFrame, aby ograniczyć operację do jednej ramki tekstowej. Użyj metod z IPresentation, aby przetworzyć cały tekst w prezentacji.
| Operacja | Jedna ramka tekstowa | Cała prezentacja |
|---|---|---|
| Podświetlanie dosłownego tekstu | ITextFrame.highlightText | IPresentation.highlightText |
| Podświetlanie dopasowań wyrażenia regularnego | ITextFrame.highlightRegex | IPresentation.highlightRegex |
| Zastąpienie dosłownego tekstu | ITextFrame.replaceText | IPresentation.replaceText |
| Zastąpienie dopasowań wyrażenia regularnego | ITextFrame.replaceRegex | IPresentation.replaceRegex |
Skonfiguruj dopasowywanie tekstu
Dla operacji na dosłownym tekście użyj TextSearchOptions, aby kontrolować dopasowywanie:
- TextSearchOptions.setWholeWordsOnly ogranicza dopasowania do pełnych słów.
- TextSearchOptions.setCaseSensitive kontroluje, czy ma być uwzględniona wielkość znaków.
- TextSearchOptions.setIncludeNotes uwzględnia notatki slajdów w operacjach wyszukiwania, zamiany i podświetlania na poziomie prezentacji.
Operacje oparte na wyrażeniach regularnych używają klasy Java Pattern, więc reguły dopasowywania, takie jak wrażliwość na wielkość liter i granice słów, są definiowane w samym wyrażeniu i jego flagach.
Zbierz informacje o dopasowaniach przy użyciu wywołania zwrotnego
Zaimplementuj IFindResultCallback, aby otrzymywać powiadomienie o każdym dopasowaniu. Jego metoda IFindResultCallback.foundResult dostarcza powiązaną ramkę tekstową, źródłowy tekst, dopasowany tekst oraz pozycję dopasowania.
Wywołanie zwrotne nie otrzymuje bezpośrednio numeru slajdu. Implementacja poniżej wyprowadza go z rodzica slajdu oraz obsługuje tekst znaleziony w notatkach slajdu. Nullable Integer pozwala używać tego samego modelu wyniku dla tekstu powiązanego z innymi typami slajdów.
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;
}
}
Dla operacji zamiany foundText zawiera oryginalny dopasowany tekst, więc wywołanie zwrotne może dokładnie zapisać, które terminy zostały zastąpione.
Podświetlanie tekstu
Użyj metody ITextFrame.highlightText, aby podświetlić dopasowania dosłownego tekstu w ramce tekstowej. Przekaż TextSearchOptions, aby kontrolować wyszukiwanie, oraz wywołanie zwrotne, aby zebrać szczegóły dopasowań.
Poniższy przykład podświetla wszystkie wystąpienia znaków “try”, a następnie podświetla tylko całe słowo “to”. Oba wyszukiwania raportują swoje dopasowania do tego samego wywołania zwrotnego.
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);
// Podświetl każde wystąpienie "try" w ramce tekstowej.
shape.getTextFrame().highlightText("try", substringHighlightColor, substringSearchOptions, callback);
TextSearchOptions wholeWordSearchOptions = new TextSearchOptions();
wholeWordSearchOptions.setWholeWordsOnly(true);
wholeWordSearchOptions.setCaseSensitive(false);
int wholeWordHighlightColor = Color.rgb(238, 130, 238);
// Podświetl tylko całe słowo "to".
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();
}
Wynik:

Podświetlanie tekstu przy użyciu wyrażeń regularnych
Metoda ITextFrame.highlightRegex podświetla dopasowania tekstu znalezione przez wyrażenie regularne w ramce tekstowej.
Poniższy kod podświetla wszystkie słowa zawierające siedem lub więcej znaków i zbiera każde dopasowanie:
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();
}
Wynik:

Podświetlanie tekstu w całej prezentacji
Użyj IPresentation.highlightText i IPresentation.highlightRegex do przeszukania wszystkich odpowiednich ramek tekstowych w prezentacji. Poniższy przykład podświetla dosłowny termin oraz wszystkie adresy e‑mail, zachowując oddzielne kolekcje wyników dla obu wyszukiwań.
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();
}
Zamiana tekstu w ramce tekstowej
Użyj ITextFrame.replaceText dla dosłownego tekstu oraz ITextFrame.replaceRegex dla zamiany opartej na wzorcu. Metody te aktualizują dopasowany tekst w istniejącej ramce tekstowej, zachowując formatowanie otaczających fragmentów zamiast odbudowywać ramkę z zwykłego łańcucha.
Poniższy przykład ujednolicaja wariant ortograficzny, a następnie zamienia etykiety wersji. To samo wywołanie zwrotne zapisuje oryginalne terminy dopasowane przez obie operacje.
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();
}
Jeśli jedno dopasowanie obejmuje fragmenty o różnym formatowaniu, przejrzyj wynik, aby potwierdzić, które formatowanie ma być zastosowane do tekstu zamienionego.
Zamiana tekstu w całej prezentacji
Użyj IPresentation.replaceText i IPresentation.replaceRegex do zastosowania tych samych operacji w całej prezentacji. Jest to przydatne przy czyszczeniu szablonów, aktualizacji terminologii i redakcji.
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();
}
Grupowanie dopasowań dla raportowania
Ponieważ każdy wynik przechowuje numer slajdu i ramkę tekstową, aplikacje mogą grupować dopasowania dla celów audytu, raportowania lub przeglądu. Poniższy przykład grupuje zebrane wyniki najpierw po slajdzie, a potem po ramce tekstowej:
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
Jak mogę przeszukiwać tylko jedną ramkę tekstową zamiast całej prezentacji?
Pobierz ramkę tekstową kształtu i wywołaj ITextFrame.highlightText, ITextFrame.highlightRegex, ITextFrame.replaceText, lub ITextFrame.replaceRegex na tej ramce tekstowej. Metody na poziomie prezentacji przetwarzają wszystkie odpowiednie ramki tekstowe.
Jak dopasować całe słowa z właściwą kapitalizacją?
Ustaw TextSearchOptions.setWholeWordsOnly i TextSearchOptions.setCaseSensitive 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 bezpośrednio w obiekcie Pattern.
Czy wyszukiwanie i zamiana mogą obejmować tekst w notatkach slajdów?
Tak. Ustaw TextSearchOptions.setIncludeNotes na true przy używaniu operacji na poziomie prezentacji dla dosłownego tekstu. Powyższa implementacja wywołania zwrotnego mapuje dopasowanie w notatce slajdu na numer jego slajdu macierzystego.
Jak stworzyć raport bez ponownego skanowania prezentacji?
Przekaż implementację IFindResultCallback do operacji podświetlania lub zamiany. Wywołanie zwrotne otrzymuje każde dopasowanie w trakcie trwania operacji, dzięki czemu aplikacja może zapisać źródłowy tekst, dopasowany tekst, pozycję, ramkę tekstową i wyliczony numer slajdu do późniejszego grupowania lub eksportu.
Czy zamiana tekstu zachowuje jego formatowanie?
ITextFrame.replaceText i ITextFrame.replaceRegex modyfikują dopasowany tekst w istniejącej ramce i zachowują formatowanie otaczających fragmentów. Jeśli dopasowanie obejmuje fragmenty o różnym formatowaniu, sprawdź wynik, aby upewnić się, że zamiana używa pożądanego stylu.