جستجو و جایگزینی متن در ارائه‌های PowerPoint در Android

بررسی کلی

Aspose.Slides for Android via Java می‌تواند متن را در یک فریم متن جداگانه یا در سرتاسر ارائه جستجو، برجسته و جایگزین کند. هر عملیات می‌تواند با یک فراخوانی نتیجه، برنامه را از هر تطبیق مطلع سازد. این امکان به‌روزرسانی ارائه و همزمان ساخت یک ردپای حسابرسی شامل متن تطبیق یافته، متن زمینه، موقعیت، فریم متن و شماره اسلاید را فراهم می‌کند.

این قابلیت‌ها برای بازنگری، محرمانه‌سازی، بررسی واژگان، پاک‌سازی قالب و گردش کارهای گزارش‌دهی خودکار مفید هستند.

در مثال‌های اولیه زیر، از فایلی به نام «sample.pptx» استفاده می‌کنیم که شامل یک جعبه متن در اولین اسلاید با متن زیر است:

متن نمونه

انتخاب دامنه جستجو

از متدهای ITextFrame برای محدود کردن یک عملیات به یک فریم متن استفاده کنید. برای پردازش تمام متن‌های قابل‌جستجو در ارائه، از متدهای IPresentation بهره ببرید.

عملیات یک فریم متن کل ارائه
برجسته‌سازی متن به صورت واژه‌ای ITextFrame.highlightText IPresentation.highlightText
برجسته‌سازی تطبیق‌های عبارت منظم ITextFrame.highlightRegex IPresentation.highlightRegex
جایگزینی متن به صورت واژه‌ای ITextFrame.replaceText IPresentation.replaceText
جایگزینی تطبیق‌های عبارت منظم ITextFrame.replaceRegex IPresentation.replaceRegex

پیکربندی تطبیق متن

برای عملیات‌های متن به صورت واژه‌ای، از TextSearchOptions برای کنترل تطبیق استفاده کنید:

عملیات‌های عبارت منظم از یک Pattern جاوا استفاده می‌کنند، بنابراین قوانین تطبیق مانند حساسیت به حروف و مرزهای واژه در خود الگو و پرچم‌های آن تعریف می‌شود.

جمع‌آوری اطلاعات تطبیق با فراخوانی بازگشتی

برای دریافت اعلان برای هر تطبیق، IFindResultCallback را پیاده‌سازی کنید. متد IFindResultCallback.foundResult فریم متن مرتبط، متن منبع، متن تطبیق یافته و موقعیت تطبیق را فراهم می‌کند.

این فراخوانی مستقیم شماره اسلاید را دریافت نمی‌کند. پیاده‌سازی زیر آن را از اسلاید والد استخراج می‌کند و همچنین متن یافت‌شده در یادداشت‌های اسلاید را مدیریت می‌نماید. یک Integer قابل‌null اجازه می‌دهد همان مدل نتیجه متن مرتبط با انواع دیگر اسلایدها را نیز نشان دهد.

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

برای عملیات‌های جایگزینی، foundText حاوی متن اصلی مطابقت یافته است، به‌طوری که فراخوانی می‌تواند دقیقاً ثبت کند کدام اصطلاحات جایگزین شده‌اند.

برجسته‌سازی متن

از متد ITextFrame.highlightText برای برجسته‌سازی تطبیق‌های متن به صورت واژه‌ای در یک فریم متن استفاده کنید. با پاس کردن TextSearchOptions جستجو را کنترل کنید و یک فراخوانی برای جمع‌آوری جزئیات تطبیق‌ها بدهید.

کد زیر تمام رخدادهای کاراکترهای “try” را برجسته می‌کند و سپس تنها کلمه کامل “to” را برجسته می‌سازد. هر دو جستجو تطبیق‌های خود را به همان فراخوانی اطلاع می‌دهند.

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

    // برجسته‌سازی هر رخداد "try" در فریم متن.
    shape.getTextFrame().highlightText("try", substringHighlightColor, substringSearchOptions, callback);

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

    // برجسته‌سازی فقط کلمهٔ کامل "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();
}

نتیجه:

متن برجسته‌شده

برجسته‌سازی متن با استفاده از عبارات منظم

متد ITextFrame.highlightRegex متن‌های یافت‌شده توسط یک عبارت منظم را در یک فریم متن برجسته می‌کند.

کد زیر تمام واژه‌هایی که دارای هفت یا بیش از هفت حرف هستند برجسته می‌کند و هر تطبیق را جمع‌آوری می‌نماید:

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

نتیجه:

متن برجسته‌شده با استفاده از عبارت منظم

برجسته‌سازی متن در سرتاسر یک ارائه

از IPresentation.highlightText و IPresentation.highlightRegex برای جستجو در تمام فریم‌های متن قابل اعمال در یک ارائه استفاده کنید. مثال زیر یک واژهٔ لغوی و تمام آدرس‌های ایمیل را برجسته می‌کند و نتایج دو جستجو را به‌صورت جداگانه جمع‌آوری می‌کند.

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

جایگزینی متن در یک فریم متن

برای متن به صورت واژه‌ای از ITextFrame.replaceText و برای جایگزینی مبتنی بر الگو از ITextFrame.replaceRegex استفاده کنید. این متدها متن مطابقت یافته را درون فریم متن موجود به‌روزرسانی می‌کنند و قالب‌بخشی بخش‌های اطراف را حفظ می‌نمایند، به‌جای بازسازی فریم متن از یک رشتهٔ ساده.

مثال زیر یک واریانت املا را استاندارد می‌کند و سپس برچسب‌های نسخه را جایگزین می‌سازد. همان فراخوانی واژه‌های اصلی مطابقت یافته در هر دو عملیات را ثبت می‌کند.

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

اگر یک تطبیق شامل بخش‌هایی با قالب‌بندی متفاوت باشد، خروجی را بررسی کنید تا اطمینان حاصل شود کدام قالب‌بندی باید بر متن جایگزین اعمال شود.

جایگزینی متن در سرتاسر یک ارائه

از IPresentation.replaceText و IPresentation.replaceRegex برای اعمال همان عملیات‌ها در تمام ارائه استفاده کنید. این روش برای پاک‌سازی قالب، به‌روزرسانی واژگان و محرمانه‌سازی مفید است.

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

گروه‌بندی تطبیق‌ها برای گزارش‌دهی

از آنجا که هر نتیجه شماره اسلاید و فریم متن خود را ذخیره می‌کند، برنامه‌ها می‌توانند تطبیق‌ها را برای حسابرسی، گزارش یا گردش کارهای بازنگری گروه‌بندی کنند. مثال زیر نتایج جمع‌آوری‌شده را ابتدا بر حسب اسلاید و سپس بر حسب فریم متن گروه‌بندی می‌کند:

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

سؤال‌های متداول

چگونه می‌توانم فقط یک جعبه متن را به جای کل ارائه جستجو کنم؟

فریم متن شکل را دریافت کنید و بر روی آن ITextFrame.highlightText، ITextFrame.highlightRegex، ITextFrame.replaceText یا ITextFrame.replaceRegex را فراخوانی کنید. متدهای سطح ارائه تمام فریم‌های متن قابل‌جستجو را پردازش می‌کنند.

چگونه می‌توانم کلمات کامل را با حروف بزرگ/کوچک صحیح مطابقت دهم؟

TextSearchOptions.setWholeWordsOnly و TextSearchOptions.setCaseSensitive را روی true تنظیم کنید و گزینه‌ها را به متد برجسته‌سازی یا جایگزینی متن به صورت واژه‌ای بدهید. برای عبارات منظم، مرزهای واژه و حساسیت به حروف را خود در Pattern تعریف کنید.

آیا جستجو و جایگزینی می‌تواند متن موجود در یادداشت‌های اسلاید را شامل شود؟

بله. هنگام استفاده از عملیات متن به صورت واژه‌ای در سطح ارائه، TextSearchOptions.setIncludeNotes را روی true تنظیم کنید. پیاده‌سازی فراخوانی نشان‌داده‌شده، تطبیق در اسلاید یادداشت‌ها را به شماره اسلاید والد خود بازمی‌گرداند.

چگونه می‌توانم گزارشی ایجاد کنم بدون اینکه دوباره ارائه را اسکن کنم؟

یک پیاده‌سازی از IFindResultCallback را به عملیات برجسته‌سازی یا جایگزینی پاس کنید. این فراخوانی در هنگام اجرای عملیات هر تطبیق را دریافت می‌کند، بنابراین برنامه می‌تواند متن منبع، متن تطبیق یافته، موقعیت، فریم متن و شماره اسلاید استخراج‌شده را برای گروه‌بندی یا صادرات بعدی ذخیره کند.

آیا جایگزینی متن قالب‌بندی آن را حفظ می‌کند؟

ITextFrame.replaceText و ITextFrame.replaceRegex متن مطابقت یافته را درون فریم متن موجود اصلاح می‌کنند و قالب‌بندی بخش‌های اطراف را حفظ می‌کنند. اگر یک تطبیق بخش‌هایی با قالب‌بندی متفاوت را شامل شود، نتیجه را بررسی کنید تا مطمئن شوید جایگزینی از سبک موردنظر استفاده می‌کند.