Zoeken en vervangen van tekst in PowerPoint-presentaties in Java
Overzicht
Aspose.Slides for Java kan zoeken, markeren en tekst vervangen in een afzonderlijk tekstframe of in de hele presentatie. Elke bewerking kan een applicatie ook via een result‑callback op de hoogte stellen van elke overeenkomst. Hierdoor kan een presentatie worden bijgewerkt en tegelijkertijd een audit‑trail worden opgebouwd met de gevonden tekst, de context, positie, tekstframe en het dia‑nummer.
Deze mogelijkheden zijn bruikbaar voor beoordeling, redactie, terminologie‑controles, sjabloonopschoning en geautomatiseerde rapportage‑workflows.
In de eerste voorbeelden hieronder gebruiken we een bestand met de naam “sample.pptx”, dat op de eerste dia één tekstvak bevat met de volgende tekst:

Kies de zoekscope
Gebruik methoden op ITextFrame om een bewerking te beperken tot één tekstframe. Gebruik methoden op Presentation om alle toepasselijke teksten in de presentatie te verwerken.
| Operatie | Eén tekstframe | Gehele presentatie |
|---|---|---|
| Letterlijke tekst markeren | ITextFrame.highlightText | Presentation.highlightText |
| Reguliere‑expressie‑overeenkomsten markeren | ITextFrame.highlightRegex | Presentation.highlightRegex |
| Letterlijke tekst vervangen | ITextFrame.replaceText | Presentation.replaceText |
| Reguliere‑expressie‑overeenkomsten vervangen | ITextFrame.replaceRegex | Presentation.replaceRegex |
Configureer tekstmatching
Voor operaties met letterlijke tekst, gebruik TextSearchOptions om het matching‑gedrag te sturen:
- TextSearchOptions.setWholeWordsOnly beperkt overeenkomsten tot complete woorden.
- TextSearchOptions.setCaseSensitive bepaalt of hoofdlettergevoeligheid vereist is.
- TextSearchOptions.setIncludeNotes neemt dia‑notities op in zoek-, vervang‑ en markeerbewerkingen op presentatieniveau.
Bij reguliere‑expressie‑operaties wordt een Java Pattern gebruikt, zodat regels zoals hoofdlettergevoeligheid en woordgrenzen worden gedefinieerd door de expressie en de bijbehorende vlaggen.
Identificeer de eigenaar van een tekstframe
Generieke tekstverwerkings‑workflows ontvangen vaak een ITextFrame tijdens zoeken, vervangen, valideren of exporteren. Gebruik ITextFrame.getParentShape en ITextFrame.getParentCell om te bepalen welk presentatie‑object eigenaar is van het tekstframe.
De verwachte waarden hangen af van de eigenaar:
| Eigenaar van tekstframe | getParentShape |
getParentCell |
|---|---|---|
| Een AutoShape of een andere tekst‑behorende shape | De eigenaar‑IShape | null |
| Een tabelcel | null |
De eigenaar‑ICell |
Beide methoden bieden alleen‑lezen navigatie. Het aanroepen ervan verplaatst het tekstframe niet en verandert de eigenaar niet. Generieke code moet beide waarden op null controleren en rekening houden met de mogelijkheid dat geen van beide beschikbaar is.
Het volgende voorbeeld gebruikt SlideUtil.getAllTextFrames om door de tekstframes in een presentatie te itereren. Voor shapes meldt het de shapenaam, het Java‑runtime‑type en de dia waarin het zich bevindt. Voor tabelcellen meldt het de nul‑gebaseerde kolom‑ en rijcoördinaten en de bijbehorende dia.
import com.aspose.slides.*;
Presentation presentation = new Presentation("presentation.pptx");
try {
ITextFrame[] textFrames = SlideUtil.getAllTextFrames(presentation, false);
for (ITextFrame textFrame : textFrames) {
IShape ownerShape = textFrame.getParentShape();
if (ownerShape != null) {
String shapeName = ownerShape.getName().isEmpty() ? "(unnamed)" : ownerShape.getName();
String shapeType = ownerShape.getClass().getSimpleName();
IBaseSlide baseSlide = ownerShape.getSlide();
String slideLabel;
if (baseSlide instanceof ISlide) {
slideLabel = "slide " + ((ISlide) baseSlide).getSlideNumber();
} else if (baseSlide instanceof INotesSlide) {
slideLabel = "notes for slide " + ((INotesSlide) baseSlide).getParentSlide().getSlideNumber();
} else {
slideLabel = baseSlide.getClass().getSimpleName();
}
System.out.println("Shape: " + shapeName + "; type: " + shapeType + "; " + slideLabel);
continue;
}
ICell ownerCell = textFrame.getParentCell();
if (ownerCell != null) {
IBaseSlide baseSlide = ownerCell.getSlide();
String slideLabel;
if (baseSlide instanceof ISlide) {
slideLabel = "slide " + ((ISlide) baseSlide).getSlideNumber();
} else if (baseSlide instanceof INotesSlide) {
slideLabel = "notes for slide " + ((INotesSlide) baseSlide).getParentSlide().getSlideNumber();
} else {
slideLabel = baseSlide.getClass().getSimpleName();
}
System.out.println("Table cell: column " + ownerCell.getFirstColumnIndex() + ", row " + ownerCell.getFirstRowIndex() + "; " + slideLabel);
continue;
}
System.out.println("The text frame owner is not available as a shape or table cell.");
}
} finally {
presentation.dispose();
}
Voor SmartArt‑inhoud, itereren door de shapes in ISmartArtNode.getShapes en toegang krijgen tot elke ISmartArtShape.getTextFrame. Het tekstframe kan worden getraceerd naar de bijbehorende shape via ITextFrame.getParentShape, terwijl ITextFrame.getParentCell null retourneert. Daarom behandelt de shape‑tak in het voorbeeld ook tekst uit SmartArt‑nodes.
Verzamel match‑informatie met een callback
Implementeer IFindResultCallback om een melding te ontvangen voor elke overeenkomst. De IFindResultCallback.foundResult‑methode levert het gerelateerde tekstframe, de brontekst, de gevonden tekst en de positie van de match.
De callback krijgt niet rechtstreeks een dia‑nummer. De implementatie hieronder haalt het af van de bovenliggende dia en behandelt ook tekst gevonden in dia‑notities. Een nullable Integer maakt het mogelijk om hetzelfde resultaatmodel te gebruiken voor tekst die bij andere dia‑typen hoort.
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 Integer getSlideNumber(ITextFrame textFrame) {
IShape parentShape = textFrame.getParentShape();
ICell parentCell = textFrame.getParentCell();
IBaseSlide parentSlide = parentShape != null ? parentShape.getSlide() : parentCell != null ? parentCell.getSlide() : textFrame.getSlide();
if (parentSlide instanceof ISlide) {
return ((ISlide) parentSlide).getSlideNumber();
}
if (parentSlide instanceof INotesSlide) {
return ((INotesSlide) parentSlide).getParentSlide().getSlideNumber();
}
return null;
}
}
Voor vervangings‑operaties bevat foundText de oorspronkelijke gevonden tekst, zodat de callback exact kan registreren welke termen zijn vervangen.
Tekst markeren
Gebruik de ITextFrame.highlightText‑methode om letterlijke‑tekst‑matches in een tekstframe te markeren. Geef een TextSearchOptions door om de zoekopdracht te sturen en een callback om match‑details te verzamelen.
De code‑voorbeeld hieronder markeert alle voorkomen van de tekens “try” en daarna alleen het volledige woord “to”. Beide zoekopdrachten rapporteren hun matches naar dezelfde callback.
import com.aspose.slides.*;
import java.awt.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);
Color substringHighlightColor = new Color(173, 216, 230);
// Markeer elke keer dat "try" voorkomt in het tekstframe.
shape.getTextFrame().highlightText("try", substringHighlightColor, substringSearchOptions, callback);
TextSearchOptions wholeWordSearchOptions = new TextSearchOptions();
wholeWordSearchOptions.setWholeWordsOnly(true);
wholeWordSearchOptions.setCaseSensitive(false);
Color wholeWordHighlightColor = new Color(238, 130, 238);
// Markeer alleen het volledige woord "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();
}
Resultaat:

Tekst markeren met reguliere expressies
De ITextFrame.highlightRegex‑methode markeert tekstmatches gevonden door een reguliere expressie in een tekstframe.
De volgende code markeert alle woorden met zeven of meer tekens en verzamelt elke match:
import com.aspose.slides.*;
import java.awt.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();
}
Resultaat:

Tekst markeren in een hele presentatie
Gebruik Presentation.highlightText en Presentation.highlightRegex om alle toepasselijke tekstframes in een presentatie te doorzoeken. Het volgende voorbeeld markeert een letterlijk zoekterm en alle e‑mailadressen, met aparte resultaat‑collecties voor de twee zoekopdrachten.
import com.aspose.slides.*;
import java.awt.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);
presentation.highlightText("confidential", Color.ORANGE, 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();
}
Tekst vervangen in een tekstframe
Gebruik ITextFrame.replaceText voor letterlijke tekst en ITextFrame.replaceRegex voor patroon‑gebaseerde vervanging. Deze methoden werken de gevonden tekst bij binnen het bestaande tekstframe, waardoor de opmaak van de omliggende delen behouden blijft in plaats van het tekstframe te herbouwen vanuit een platte string.
Het volgende voorbeeld normaliseert een spellingvariant en vervangt vervolgens versie‑labels. Dezelfde callback registreert de oorspronkelijke termen die door beide operaties zijn gematcht.
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();
}
Als één match delen met verschillende opmaak bestrijkt, controleer dan de uitvoer om te bevestigen welke opmaak moet worden toegepast op de vervangende tekst.
Tekst vervangen in een hele presentatie
Gebruik Presentation.replaceText en Presentation.replaceRegex om dezelfde bewerkingen over de volledige presentatie toe te passen. Dit is nuttig voor sjabloonopschoning, terminologie‑updates en redactie.
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();
}
Matches groeperen voor rapportage
Omdat elk resultaat zijn dia‑nummer en tekstframe opslaat, kunnen applicaties matches groeperen voor audit‑, rapportage‑ of review‑workflows. Het volgende voorbeeld groepeert de verzamelde resultaten eerst per dia en daarna per tekstframe:
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
Hoe kan ik zoeken in slechts één tekstvak in plaats van de hele presentatie?
Haal het tekstframe van de shape op en roep ITextFrame.highlightText, ITextFrame.highlightRegex, ITextFrame.replaceText of ITextFrame.replaceRegex aan dat tekstframe aan. Methoden op presentatieniveau verwerken alle toepasselijke tekstframes.
Hoe kan ik volledige woorden matchen met de juiste hoofdlettergebruik?
Stel TextSearchOptions.setWholeWordsOnly en TextSearchOptions.setCaseSensitive in op true en geef de opties door aan een markeer‑ of vervang‑methode voor letterlijke tekst. Voor reguliere expressies definieer je woordgrenzen en hoofdlettergevoeligheid in de Java Pattern zelf.
Kunnen zoek‑ en vervang‑bewerkingen teksten in dia‑notities omvatten?
Ja. Stel TextSearchOptions.setIncludeNotes in op true wanneer je een presentatie‑brede bewerking voor letterlijke tekst gebruikt. De callback‑implementatie hierboven mappt een match in een notitieslide terug naar het bijbehorende dia‑nummer.
Hoe kan ik een rapport maken zonder de presentatie een tweede keer te scannen?
Geef een IFindResultCallback‑implementatie mee aan de markeer‑ of vervang‑bewerking. De callback ontvangt elke match terwijl de bewerking wordt uitgevoerd, zodat de applicatie de brontekst, gevonden tekst, positie, tekstframe en afgeleid dia‑nummer kan opslaan voor latere groepering of export.
Behoudt vervangen van tekst de opmaak?
ITextFrame.replaceText en ITextFrame.replaceRegex wijzigen de gevonden tekst binnen het bestaande tekstframe en behouden de opmaak van de omringende delen. Als een match delen met verschillende opmaak bestrijkt, controleer dan het resultaat om er zeker van te zijn dat de vervanging de gewenste stijl gebruikt.