Szöveg keresése és cseréje PowerPoint-prezentációkban Java-ban

Áttekintés

Az Aspose.Slides for Java képes keresni, kiemelni és cserélni a szöveget egyetlen szövegkeretben vagy egy teljes prezentációban. Minden művelet az eredmény‑callback segítségével értesítheti az alkalmazást minden egyezésről. Ennek köszönhetően frissíthető a prezentáció, miközben egy audit‑napló is épül, amely tartalmazza a megtalált szöveget, annak környezetét, pozícióját, a szövegkeretet és a dia számát.

Ezek a lehetőségek hasznosak felülvizsgálat, érzékeny adatok kitakarása, terminológia‑ellenőrzés, sablon‑tisztítás és automatizált jelentéskészítési munkafolyamatok során.

Az alábbi első példákban egy „sample.pptx” nevű fájlt használunk, amely az első dián egyetlen szövegdobozt tartalmaz a következő szöveggel:

Minta szöveg

Keresse ki a keresés hatókörét

Használja az ITextFrame metódusait, ha egy műveletet csak egy szövegkeretre szeretne korlátozni. Használja a Presentation metódusait, ha a prezentáció összes alkalmazható szövegét szeretné feldolgozni.

Művelet Egy szövegkeret Teljes prezentáció
Literális szöveg kiemelése ITextFrame.highlightText Presentation.highlightText
Reguláris kifejezés egyezéseinek kiemelése ITextFrame.highlightRegex Presentation.highlightRegex
Literális szöveg cseréje ITextFrame.replaceText Presentation.replaceText
Reguláris kifejezés egyezéseinek cseréje ITextFrame.replaceRegex Presentation.replaceRegex

Szövegillesztés konfigurálása

Literális‑szöveg műveleteknél használja a TextSearchOptions osztályt az illesztés szabályainak vezérléséhez:

A reguláris‑kifejezés műveletek Java Pattern‑t használnak, így az illesztési szabályok (például a kis‑ és nagybetűk érzékenysége, szómagasság) a kifejezésben és annak flagjeiben vannak meghatározva.

Találati információk gyűjtése callback‑kel

Valósítsa meg az IFindResultCallback interfészt, hogy minden egyezésről értesítést kapjon. A IFindResultCallback.foundResult metódusa visszaadja a kapcsolódó szövegkeretet, a forrásszöveget, a megtalált szöveget és a pozíciót.

A callback nem kap közvetlenül dia‑számot. Az alábbi megvalósítás a szülő dia alapján határozza meg azt, és kezeli a jegyzetekben talált szöveget is. Egy nullable Integer lehetővé teszi, hogy ugyanaz a modell más dia‑típusokhoz is használható legyen.

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;
    }
}

Csere‑műveleteknél a foundText tartalmazza az eredeti megtalált szöveget, így a callback pontosan rögzítheti, mely kifejezéseket cserélték.

Szöveg kiemelése

Használja az ITextFrame.highlightText metódust a literális‑szöveg egyezéseinek kiemelésére egy szövegkeretben. Adja át a TextSearchOptions‑t a keresés szabályozásához, valamint egy callback‑t a találatok részleteinek gyűjtéséhez.

Az alábbi kódrészlet kiemeli a „try” karakterlánc minden előfordulását, majd csak a teljes „to” szót. Mindkét keresés az ugyanazt a callback‑t használja.

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);

    // Kiemeli a "try" minden előfordulását a szövegkeretben.
    shape.getTextFrame().highlightText("try", substringHighlightColor, substringSearchOptions, callback);

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

    // Csak a teljes "to" szót emeli ki.
    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();
}

Az eredmény:

A kiemelt szöveg

Reguláris kifejezésekkel történő szövegkiemelés

Az ITextFrame.highlightRegex metódus a reguláris kifejezéssel megtalált szövegeket emeli ki egy szövegkeretben.

Az alábbi kód kiemeli a hét vagy több karaktert tartalmazó összes szót, és minden egyezést gyűjt.

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();
}

Az eredmény:

A kiemelt szöveg reguláris kifejezéssel

Prezentáción belüli szövegkiemelés

Használja a Presentation.highlightText és a Presentation.highlightRegex metódusokat a prezentáció összes alkalmazható szövegkeretének kereséséhez. Az alábbi példa egy literális kifejezést és az összes e‑mail címet emeli ki, miközben külön eredménygyűjteményeket tart fenn a két kereséshez.

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();
}

Szöveg cseréje egy szövegkeretben

Használja az ITextFrame.replaceText metódust literális szöveghez, valamint az ITextFrame.replaceRegex‑t minta‑alapú cseréhez. Ezek a metódusok a megtalált szöveget az adott szövegkereten belül frissítik, megtartva a környező rész formázását, a teljes keret újraépítése helyett.

Az alábbi példa egységesíti a helyesírási változatot, majd cseréli a verziócímkéket. Ugyanaz a callback rögzíti mindkét művelet által megtalált eredeti kifejezéseket.

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();
}

Ha egy egyezés több, különböző formázású részre terjed ki, ellenőrizze a kimenetet, hogy melyik formázás legyen alkalmazva a csere‑szövegre.

Szöveg cseréje egy teljes prezentációban

Használja a Presentation.replaceText és a Presentation.replaceRegex metódusokat a műveletek prezentáció‑szintű alkalmazásához. Ez hasznos sablon‑tisztításhoz, terminológia‑frissítéshez és adatkitakaráshoz.

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();
}

Találatok csoportosítása jelentéshez

Mivel minden eredmény tárolja a dia számát és a szövegkeretet, az alkalmazások csoportosíthatják a találatokat audit, jelentés vagy felülvizsgálati munkafolyamatokhoz. Az alábbi példa először diánként, majd szövegkeretenként csoportosítja a gyűjtött eredményeket:

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() + "'");
        }
    }
}

GYIK

Hogyan kereshetek csak egy szövegdobozban a teljes prezentáció helyett?

Szerezze be az alakzat szövegkeretét, és hívja meg az ITextFrame.highlightText, ITextFrame.highlightRegex, ITextFrame.replaceText vagy ITextFrame.replaceRegex metódusokkal azon a szövegkereten. A prezentáció‑szintű metódusok az összes alkalmazható szövegkeretet dolgozzák fel.

Hogyan illeszthetem csak a teljes szavakat a megfelelő nagybetűkkel?

Állítsa a TextSearchOptions.setWholeWordsOnly és a TextSearchOptions.setCaseSensitive értékét true‑ra, majd adja át az opciókat egy literális‑szöveg kiemelő vagy csere metódusnak. Reguláris kifejezéseknél definiálja a szóhatárokat és a kis‑/nagybetű érzékenységet a Java Pattern‑ben.

A keresés és csere magában foglalhatja a dia‑jegyzetek szövegét is?

Igen. Állítsa a TextSearchOptions.setIncludeNotes értékét true‑ra, amikor prezentáció‑szintű literális‑szöveg műveletet használ. A fent bemutatott callback‑implementáció a jegyzet‑dián talált egyezést visszakapcsolja a szülő dia számához.

Hogyan hozhatok létre jelentést anélkül, hogy újra beolvasnám a prezentációt?

Adjon át egy IFindResultCallback implementációt a kiemelés vagy csere műveletnek. A callback minden egyezést megkap a művelet futása közben, így az alkalmazás tárolhatja a forrásszöveget, a megtalált szöveget, a pozíciót, a szövegkeretet és a származtatott dia számot későbbi csoportosításhoz vagy exportáláshoz.

A szövegcserélés megtartja-e a formázást?

Az ITextFrame.replaceText és az ITextFrame.replaceRegex módosítja a megtalált szöveget a meglévő szövegkereten belül, és megőrzi a környező rész formázását. Ha egy egyezés különböző formázású részeket fed le, ellenőrizze az eredményt, hogy a csere a kívánt stílust használja-e.