Αναζήτηση και Αντικατάσταση Κειμένου σε Παρουσιάσεις PowerPoint με JavaScript

Επισκόπηση

Το Aspose.Slides for Node.js μέσω Java μπορεί να αναζητήσει, να επισημάνει και να αντικαταστήσει κείμενο σε ένα μεμονωμένο πλαίσιο κειμένου ή σε ολόκληρη παρουσίαση. Κάθε λειτουργία μπορεί επίσης να ενημερώνει μια εφαρμογή για κάθε αντιστοίχηση μέσω μιας κλήσης αντίδρασης (callback) αποτελέσματος. Αυτό καθιστά δυνατό τον ενημέρωση μιας παρουσίασης και ταυτόχρονα τη δημιουργία αρχείου ελέγχου που περιέχει το ταιριασμένο κείμενο, το περιεχόμενό του, τη θέση, το πλαίσιο κειμένου και τον αριθμό διαφάνειας.

Αυτές οι δυνατότητες είναι χρήσιμες για ανασκόπηση, αποκάλυψη, έλεγχο ορολογίας, καθαρισμό προτύπων και αυτοματοποιημένες ροές εργασίας αναφορών.

Στα πρώτα παραδείγματα παρακάτω, χρησιμοποιούμε ένα αρχείο με όνομα “sample.pptx”, το οποίο περιέχει ένα μοναδικό πλαίσιο κειμένου στην πρώτη διαφάνεια με το ακόλουθο κείμενο:

Δείγμα κειμένου

Επιλέξτε το Πεδίο Αναζήτησης

Χρησιμοποιήστε μεθόδους στο TextFrame για να περιορίσετε μια λειτουργία σε ένα πλαίσιο κειμένου. Χρησιμοποιήστε μεθόδους στο Presentation για να επεξεργαστείτε όλο το κείμενο που είναι εφαρμόσιμο στην παρουσίαση.

Λειτουργία Ένα πλαίσιο κειμένου Ολόκληρη παρουσίαση
Επισήμανση κυριολεκτικού κειμένου TextFrame.highlightText Presentation.highlightText
Επισήμανση αντιστοιχίσεων κανονικής έκφρασης TextFrame.highlightRegex Presentation.highlightRegex
Αντικατάσταση κυριολεκτικού κειμένου TextFrame.replaceText Presentation.replaceText
Αντικατάσταση αντιστοιχίσεων κανονικής έκφρασης TextFrame.replaceRegex Presentation.replaceRegex

Διαμόρφωση Ταίριαγματος Κειμένου

Για λειτουργίες κυριολεκτικού κειμένου, χρησιμοποιήστε το TextSearchOptions για να ελέγξετε το ταίριασμα:

  • TextSearchOptions.setWholeWordsOnly περιορίζει τις αντιστοιχίσεις σε ολόκληρες λέξεις.
  • TextSearchOptions.setCaseSensitive ελέγχει αν η διάκριση πεζών-κεφαλαίων πρέπει να ταιριάζει.
  • TextSearchOptions.setIncludeNotes περιλαμβάνει τις σημειώσεις διαφανειών στην αναζήτηση, αντικατάσταση και επισήμανση σε επίπεδο παρουσίασης.

Οι λειτουργίες κανονικής έκφρασης χρησιμοποιούν ένα Java Pattern, έτσι οι κανόνες ταίριασματος όπως η διάκριση πεζών-κεφαλαίων και τα όρια λέξεων ορίζονται από την έκφραση και τις σημαίες της.

Συλλογή Πληροφοριών Αντιστοιχίας με Callback

Δημιουργήστε έναν Java proxy για το callback αποτελέσματος ώστε να λαμβάνει ειδοποίηση για κάθε αντιστοίχηση. Η συνάρτηση proxy λαμβάνει το σχετικό πλαίσιο κειμένου, το πηγαίο κείμενο, το ταιριασμένο κείμενο και τη θέση της αντιστοίχης.

Το callback δεν λαμβάνει απευθείας τον αριθμό διαφάνειας. Η υλοποίηση παρακάτω τον προέρχεται μέσω των TextFrame.getSlide, Slide.getSlideNumber, και NotesSlide.getParentSlide. Επίσης διαχειρίζεται κείμενο που βρέθηκε στις σημειώσεις διαφάνειας.

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

Για λειτουργίες αντικατάστασης, το foundText περιέχει το αρχικό ταιριασμένο κείμενο, έτσι το callback μπορεί να καταγράψει με ακρίβεια ποιες λέξεις αντικαταστάθηκαν.

Επισήμανση Κειμένου

Χρησιμοποιήστε τη μέθοδο TextFrame.highlightText για να επισήμαντε τις κυριολεκτικές αντιστοιχίσεις σε ένα πλαίσιο κειμένου. Περάστε το TextSearchOptions για να ελέγξετε την αναζήτηση.

Το παρακάτω παράδειγμα κώδικα επισήμανε όλες τις εμφανίσεις των χαρακτήρων “try” και, στη συνέχεια, επισήμανε μόνο τη λέξη “to”.

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

    // Επισήμανση κάθε εμφάνισης του "try" στο πλαίσιο κειμένου.
    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");

    // Επισήμανση μόνο της πλήρους λέξης "to".
    shape.getTextFrame().highlightText(
        "to", wholeWordHighlightColor, wholeWordSearchOptions, null);

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

Το αποτέλεσμα:

Το επισημασμένο κείμενο

Επισήμανση Κειμένου Χρησιμοποιώντας Κανονικές Εκφράσεις

Η μέθοδος TextFrame.highlightRegex επισημαίνει τις αντιστοιχίσεις κειμένου που βρέθηκαν με μια κανονική έκφραση σε ένα πλαίσιο κειμένου.

Ο παρακάτω κώδικας επισημαίνει όλες τις λέξεις που περιέχουν επτά ή περισσότερους χαρακτήρες:

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

Το αποτέλεσμα:

Το επισημασμένο κείμενο με τη χρήση της κανονικής έκφρασης

Επισήμανση Κειμένου σε Ολόκληρη Παρουσίαση

Χρησιμοποιήστε τις Presentation.highlightText και Presentation.highlightRegex για να αναζητήσετε όλα τα εφαρμόσιμα πλαίσια κειμένου σε μια παρουσίαση. Το παρακάτω παράδειγμα επισημαίνει έναν κυριολεκτικό όρο και όλες τις διευθύνσεις email:

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

Αντικατάσταση Κειμένου σε Πλαίσιο Κειμένου

Χρησιμοποιήστε το TextFrame.replaceText για κυριολεκτικό κείμενο και το TextFrame.replaceRegex για αντικατάσταση βάσει μοτίβου. Αυτές οι μέθοδοι ενημερώνουν το ταιριασμένο κείμενο μέσα στο υπάρχον πλαίσιο κειμένου, διατηρώντας τη μορφοποίηση του περιβάλλοντος τμήματος αντί να ξαναχτίζουν το πλαίσιο κειμένου από μια απλή συμβολοσειρά.

Το παρακάτω παράδειγμα κανονικοποιεί μια παραλλαγή ορθογραφίας και στη συνέχεια αντικαθιστά ετικέτες έκδοσης:

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

Αν μία αντιστοίχηση καλύπτει τμήματα με διαφορετική μορφοποίηση, ελέγξτε το αποτέλεσμα για να επιβεβαιώσετε ποια μορφοποίηση πρέπει να εφαρμοστεί στο κείμενο αντικατάστασης.

Αντικατάσταση Κειμένου σε Ολόκληρη Παρουσίαση

Χρησιμοποιήστε τα Presentation.replaceText και Presentation.replaceRegex για να εφαρμόσετε τις ίδιες λειτουργίες σε όλη την παρουσίαση. Αυτό είναι χρήσιμο για τον καθαρισμό προτύπων, την ενημέρωση ορολογίας και την διαγραφή.

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

Ομαδοποίηση Αντιστοιχίσεων για Αναφορά

Επειδή κάθε συλλεγμένο αποτέλεσμα αποθηκεύει τον αριθμό της διαφάνειας και το πλαίσιο κειμένου, οι εφαρμογές μπορούν να ομαδοποιούν τις αντιστοιχίες για ελέγχους, αναφορές ή διαδικασίες ανασκόπησης. Το παρακάτω παράδειγμα ομαδοποιεί τα αποτελέσματα πρώτα ανά διαφάνεια και στη συνέχεια ανά πλαίσιο κειμένου:

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

FAQ

Πώς μπορώ να αναζητήσω μόνο ένα πλαίσιο κειμένου αντί για ολόκληρη την παρουσίαση;

Αποκτήστε το πλαίσιο κειμένου του σχήματος και καλέστε τις TextFrame.highlightText, TextFrame.highlightRegex, TextFrame.replaceText, ή TextFrame.replaceRegex σε αυτό το πλαίσιο κειμένου. Οι μέθοδοι σε επίπεδο παρουσίασης επεξεργάζονται όλα τα εφαρμόσιμα πλαίσια κειμένου αντί αυτού.

Πώς μπορώ να ταιριάξω πλήρεις λέξεις με τη σωστή κεφαλοποίηση;

Ορίστε τις TextSearchOptions.setWholeWordsOnly και TextSearchOptions.setCaseSensitive σε true και περάστε τις επιλογές σε μια μέθοδο επισήμανσης ή αντικατάστασης κυριολεκτικού κειμένου. Για κανονικές εκφράσεις, ορίστε τα όρια λέξεων και τη διάκριση πεζών-κεφαλαίων μέσα στο ίδιο το Java Pattern.

Μπορεί η αναζήτηση και η αντικατάσταση να περιλαμβάνουν κείμενο στις σημειώσεις διαφάνειας;

Ναι. Ορίστε το TextSearchOptions.setIncludeNotes σε true όταν χρησιμοποιείτε μια λειτουργία κυριολεκτικού κειμένου σε επίπεδο παρουσίασης. Η υλοποίηση του callback που φαίνεται παραπάνω αντιστοιχίζει μια αντιστοίχηση σε σημειώσεις διαφάνειας στον αριθμό της γονικής διαφάνειας.

Πώς μπορώ να δημιουργήσω αναφορά χωρίς να σαρώσω τη παρουσίαση για δεύτερη φορά;

Περάστε έναν Java proxy για το callback αποτελέσματος στην λειτουργία επισήμανσης ή αντικατάστασης. Το callback λαμβάνει κάθε αντιστοίχηση κατά τη διάρκεια της λειτουργίας, έτσι η εφαρμογή μπορεί να αποθηκεύσει το πηγαίο κείμενο, το ταιριασμένο κείμενο, τη θέση, το πλαίσιο κειμένου και τον προεξαχθέντα αριθμό διαφάνειας για μετέπειτα ομαδοποίηση ή εξαγωγή.

Διατηρεί η αντικατάσταση κειμένου τη μορφοποίησή του;

TextFrame.replaceText και TextFrame.replaceRegex τροποποιούν το ταιριασμένο κείμενο μέσα στο υπάρχον πλαίσιο κειμένου και διατηρούν τη μορφοποίηση του περιβάλλοντος τμήματος. Εάν μια αντιστοίχηση καλύπτει τμήματα με διαφορετική μορφοποίηση, ελέγξτε το αποτέλεσμα για να βεβαιωθείτε ότι η αντικατάσταση χρησιμοποιεί το επιθυμητό στυλ.