PowerPoint Sunumlarında Metin Arama ve Değiştirme (JavaScript)

Genel Bakış

Aspose.Slides for Node.js via Java, bireysel bir metin çerçevesinde veya tüm bir sunumda metin arama, vurgulama ve değiştirme işlemleri yapabilir. Her işlem, her eşleşme hakkında bir sonuç geri çağrısı aracılığıyla uygulamaya bildirimde bulunabilir. Bu, bir sunumu güncellerken eşleşen metni, bağlamını, konumunu, metin çerçevesini ve slayt numarasını içeren bir denetim izini aynı anda oluşturmayı mümkün kılar.

Bu yetenekler, inceleme, sansür, terminoloji kontrolleri, şablon temizliği ve otomatik raporlama iş akışları için faydalıdır.

Aşağıdaki ilk örneklerde, ilk slaytta aşağıdaki metni içeren tek bir metin kutusu bulunan “sample.pptx” adlı dosyayı kullanıyoruz:

Örnek metin

Arama Kapsamını Seçin

Bir işlemi tek bir metin çerçevesi ile sınırlamak için TextFrame yöntemlerini kullanın. Sunumdaki tüm uygulanabilir metni işlemek için Presentation yöntemlerini kullanın.

İşlem Tek metin çerçevesi Tüm sunum
Doğrudan metni vurgula TextFrame.highlightText Presentation.highlightText
Düzenli ifade eşleşmelerini vurgula TextFrame.highlightRegex Presentation.highlightRegex
Doğrudan metni değiştir TextFrame.replaceText Presentation.replaceText
Düzenli ifade eşleşmelerini değiştir TextFrame.replaceRegex Presentation.replaceRegex

Metin Eşleşmesini Yapılandırın

Doğrudan metin işlemleri için eşleşmeyi kontrol etmek üzere TextSearchOptions kullanın:

Düzenli ifade işlemleri bir Java Pattern kullanır, bu yüzden harf duyarlılığı ve kelime sınırları gibi eşleşme kuralları ifadenin ve bayraklarının kendisi tarafından tanımlanır.

Eşleşme Bilgilerini Geri Çağrı ile Toplayın

Her eşleşme için bir bildirim almak amacıyla sonuç geri çağrısı için bir Java proxy’si oluşturun. Proxy işlevi ilgili metin çerçevesini, kaynak metni, eşleşen metni ve eşleşme konumunu alır.

Geri çağrı doğrudan bir slayt numarası almaz. Aşağıdaki uygulama bunu TextFrame.getSlide, Slide.getSlideNumber, ve NotesSlide.getParentSlide aracılığıyla türetir. Ayrıca slayt notlarında bulunan metni de işler.

const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");

function getSlideNumber(textFrame) {
    const parentSlide = textFrame.getSlide();

    if (java.instanceOf(parentSlide, "com.aspose.slides.Slide")) {
        return parentSlide.getSlideNumber();
    }

    if (java.instanceOf(parentSlide, "com.aspose.slides.NotesSlide")) {
        return parentSlide.getParentSlide().getSlideNumber();
    }

    return null;
}

function createTextSearchCallback(results) {
    return java.newProxy("com.aspose.slides.IFindResultCallback", {
        foundResult: function(textFrame, sourceText, foundText, textPosition) {
            results.push({
                textFrame: textFrame,
                sourceText: sourceText,
                foundText: foundText,
                textPosition: textPosition,
                slideNumber: getSlideNumber(textFrame)
            });
        }
    });
}

Değiştirme işlemleri için foundText orijinal eşleşen metni içerir, böylece geri çağrı tam olarak hangi terimlerin değiştirildiğini kaydedebilir.

Metni Vurgula

Bir metin çerçevesinde doğrudan metin eşleşmelerini vurgulamak için TextFrame.highlightText yöntemini kullanın. Aramayı kontrol etmek için TextSearchOptions geçirin.

Aşağıdaki kod örneği, “try” karakterlerinin tüm oluşumlarını vurgular ve ardından sadece tam kelime “to” yi vurgular.

const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");

const presentation = new aspose.slides.Presentation("sample.pptx");
try {
    const slide = presentation.getSlides().get_Item(0);
    const shape = slide.getShapes().get_Item(0);

    const substringSearchOptions = new aspose.slides.TextSearchOptions();
    substringSearchOptions.setCaseSensitive(false);
    const substringHighlightColor = java.getStaticFieldValue("java.awt.Color", "LIGHT_GRAY");

    // Metin çerçevesinde "try" ifadesinin her oluşumunu vurgula.
    shape.getTextFrame().highlightText(
        "try", substringHighlightColor, substringSearchOptions, null);

    const wholeWordSearchOptions = new aspose.slides.TextSearchOptions();
    wholeWordSearchOptions.setWholeWordsOnly(true);
    wholeWordSearchOptions.setCaseSensitive(false);
    const wholeWordHighlightColor = java.getStaticFieldValue("java.awt.Color", "MAGENTA");

    // Sadece tam kelime "to" yu vurgula.
    shape.getTextFrame().highlightText(
        "to", wholeWordHighlightColor, wholeWordSearchOptions, null);

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

Sonuç:

Vurgulanan metin

Düzenli İfadelerle Metni Vurgulama

TextFrame.highlightRegex yöntemi, bir metin çerçevesinde düzenli ifade ile bulunan metin eşleşmelerini vurgular.

Aşağıdaki kod, yedi veya daha fazla karakter içeren tüm kelimeleri vurgular:

const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");
const Pattern = java.import("java.util.regex.Pattern");

const presentation = new aspose.slides.Presentation("sample.pptx");
try {
    const slide = presentation.getSlides().get_Item(0);
    const shape = slide.getShapes().get_Item(0);
    const regex = Pattern.compile("\\b[^\\s]{7,}\\b");
    const highlightColor = java.getStaticFieldValue("java.awt.Color", "YELLOW");

    shape.getTextFrame().highlightRegex(regex, highlightColor, null);

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

Sonuç:

Düzenli ifade kullanılarak vurgulanan metin

Sunum Genelinde Metni Vurgulama

Sunumda tüm uygulanabilir metin çerçevelerini aramak için Presentation.highlightText ve Presentation.highlightRegex kullanın. Aşağıdaki örnek, bir doğrudan terimi ve tüm e-posta adreslerini vurgular:

const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");
const Pattern = java.import("java.util.regex.Pattern");

const presentation = new aspose.slides.Presentation("presentation.pptx");
try {
    const searchOptions = new aspose.slides.TextSearchOptions();
    searchOptions.setWholeWordsOnly(true);
    searchOptions.setCaseSensitive(false);
    const termHighlightColor = java.getStaticFieldValue("java.awt.Color", "ORANGE");

    presentation.highlightText(
        "confidential", termHighlightColor, searchOptions, null);

    const emailRegex = Pattern.compile(
        "\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}\\b",
        Pattern.CASE_INSENSITIVE);
    const emailHighlightColor = java.getStaticFieldValue("java.awt.Color", "YELLOW");

    presentation.highlightRegex(emailRegex, emailHighlightColor, null);
    presentation.save("highlighted_presentation.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

Bir Metin Çerçevesinde Metni Değiştir

Doğrudan metin için TextFrame.replaceText, desen tabanlı değiştirme için TextFrame.replaceRegex kullanın. Bu yöntemler, mevcut metin çerçevesindeki eşleşen metni günceller ve metin çerçevesini düz bir dizeden yeniden oluşturmak yerine çevreleyen bölüm biçimlendirmesini korur.

Aşağıdaki örnek, bir yazım varyantını standartlaştırır ve ardından sürüm etiketlerini değiştirir:

const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");
const Pattern = java.import("java.util.regex.Pattern");

const presentation = new aspose.slides.Presentation("presentation.pptx");
try {
    const slide = presentation.getSlides().get_Item(0);
    const shape = slide.getShapes().get_Item(0);
    const searchOptions = new aspose.slides.TextSearchOptions();
    searchOptions.setWholeWordsOnly(true);
    searchOptions.setCaseSensitive(false);

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

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

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

Eğer bir eşleşme farklı biçimlendirmeye sahip bölümleri kapsıyorsa, hangi biçimin değiştirme metnine uygulanması gerektiğini doğrulamak için çıktıyı inceleyin.

Sunum Genelinde Metni Değiştir

Aynı işlemleri sunum genelinde uygulamak için Presentation.replaceText ve Presentation.replaceRegex kullanın. Bu, şablon temizliği, terminoloji güncellemeleri ve sansür için faydalıdır.

const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");
const Pattern = java.import("java.util.regex.Pattern");

const presentation = new aspose.slides.Presentation("presentation.pptx");
try {
    const searchOptions = new aspose.slides.TextSearchOptions();
    searchOptions.setWholeWordsOnly(true);
    searchOptions.setCaseSensitive(true);

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

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

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

Raporlama için Eşleşmeleri Gruplandırma

Her toplanan sonuç slayt numarasını ve metin çerçevesini depoladığından, uygulamalar denetim, raporlama veya inceleme iş akışları için eşleşmeleri gruplayabilir. Aşağıdaki örnek, sonuçları önce slayta göre, ardından metin çerçevesine göre gruplar:

const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");

function getSlideNumber(textFrame) {
    const parentSlide = textFrame.getSlide();

    if (java.instanceOf(parentSlide, "com.aspose.slides.Slide")) {
        return parentSlide.getSlideNumber();
    }

    if (java.instanceOf(parentSlide, "com.aspose.slides.NotesSlide")) {
        return parentSlide.getParentSlide().getSlideNumber();
    }

    return null;
}

const results = [];
const callback = java.newProxy("com.aspose.slides.IFindResultCallback", {
    foundResult: function(textFrame, sourceText, foundText, textPosition) {
        results.push({
            textFrame: textFrame,
            sourceText: sourceText,
            foundText: foundText,
            textPosition: textPosition,
            slideNumber: getSlideNumber(textFrame)
        });
    }
});

const presentation = new aspose.slides.Presentation("presentation.pptx");
try {
    const searchOptions = new aspose.slides.TextSearchOptions();
    searchOptions.setCaseSensitive(false);
    const highlightColor = java.getStaticFieldValue("java.awt.Color", "YELLOW");

    presentation.highlightText(
        "confidential", highlightColor, searchOptions, callback);

    const matchesBySlide = new Map();

    for (const result of results) {
        const slideLabel = result.slideNumber === null ? "Other" : result.slideNumber;

        if (!matchesBySlide.has(slideLabel)) {
            matchesBySlide.set(slideLabel, new Map());
        }

        const matchesByTextFrame = matchesBySlide.get(slideLabel);
        if (!matchesByTextFrame.has(result.textFrame)) {
            matchesByTextFrame.set(result.textFrame, []);
        }

        matchesByTextFrame.get(result.textFrame).push(result);
    }

    for (const [slideLabel, matchesByTextFrame] of matchesBySlide) {
        console.log("Slide: " + slideLabel);

        for (const [textFrame, textFrameMatches] of matchesByTextFrame) {
            console.log("  Text frame: " + textFrame.getText());

            for (const result of textFrameMatches) {
                console.log(
                    "    '" + result.foundText + "' at position " +
                    result.textPosition + "; context: '" + result.sourceText + "'");
            }
        }
    }
} finally {
    presentation.dispose();
}

SSS

Sadece tüm sunum yerine tek bir metin kutusunda nasıl arama yapabilirim?

Şeklin metin çerçevesini alın ve bu çerçevede TextFrame.highlightText, TextFrame.highlightRegex, TextFrame.replaceText, veya TextFrame.replaceRegex yöntemlerini çağırın. Sunum düzeyindeki yöntemler ise tüm uygulanabilir metin çerçevelerini işler.

Doğru büyük/küçük harfle tam kelimeleri nasıl eşleştirebilirim?

TextSearchOptions.setWholeWordsOnly ve TextSearchOptions.setCaseSensitive değerlerini true olarak ayarlayın ve bu seçenekleri doğrudan metin vurgulama veya değiştirme yöntemine geçirin. Düzenli ifadeler için ise kelime sınırlarını ve harf duyarlılığını Java Pattern içinde tanımlayın.

Arama ve değiştirme slayt notlarındaki metni içerebilir mi?

Evet. Sunum düzeyinde bir doğrudan metin işlemi kullanırken TextSearchOptions.setIncludeNotes değerini true olarak ayarlayın. Yukarıda gösterilen geri çağrı uygulaması, bir not slaydındaki eşleşmeyi ana slayt numarasına geri eşler.

Sunumu ikinci kez taramadan bir rapor nasıl oluşturabilirim?

Vurgulama veya değiştirme işlemine bir Java sonuç‑geri‑çağrı proxy’si geçirin. Geri çağrı, işlem çalışırken her eşleşmeyi alır; böylece uygulama kaynak metni, eşleşen metni, konumu, metin çerçevesini ve türetilen slayt numarasını daha sonra gruplama veya dışa aktarma için depolayabilir.

Metni değiştirmek biçimlendirmesini korur mu?

TextFrame.replaceText ve TextFrame.replaceRegex mevcut metin çerçevesindeki eşleşen metni değiştirir ve çevreleyen bölüm biçimlendirmesini korur. Eğer bir eşleşme farklı biçimlendirmeye sahip bölümleri kapsıyorsa, değiştirme işleminin istenen stili kullandığından emin olmak için sonucu inceleyin.