Vyhledávání a nahrazování textu v prezentacích PowerPoint v .NET

Přehled

Aspose.Slides pro .NET může vyhledávat, zvýrazňovat a nahrazovat text v jednotlivém textovém rámečku nebo v celé prezentaci. Každá operace může také upozornit aplikaci na každou shodu pomocí zpětného volání výsledku. To umožňuje aktualizovat prezentaci a současně vytvářet auditní stopu obsahující nalezený text, jeho kontext, pozici, textový rámeček a číslo snímku.

Tyto možnosti jsou užitečné pro revizi, redigování, kontrolu terminologie, úklid šablon a automatizované workflow reportování.

V prvních příkladech níže používáme soubor s názvem “sample.pptx”, který obsahuje jediný textový rámeček na prvním snímku s následujícím textem:

Ukázkový text

Zvolte rozsah vyhledávání

Použijte metody na ITextFrame pro omezení operace na jeden textový rámeček. Použijte metody na Presentation pro zpracování veškerého relevantního textu v prezentaci.

Operace Jeden textový rámeček Celá prezentace
Zvýraznit doslovný text ITextFrame.HighlightText Presentation.HighlightText
Zvýraznit shody regulárního výrazu ITextFrame.HighlightRegex Presentation.HighlightRegex
Nahradit doslovný text ITextFrame.ReplaceText Presentation.ReplaceText
Nahradit shody regulárního výrazu ITextFrame.ReplaceRegex Presentation.ReplaceRegex

Nastavení shody textu

Pro operace s doslovným textem použijte TextSearchOptions pro řízení shody:

Operace s regulárním výrazem používají .NET Regex, takže pravidla shody, jako je rozlišování velkých a malých písmen a hranice slov, jsou definována výrazem a jeho možnostmi.

Identifikace vlastníka textového rámečku

Obecné workflow zpracování textu často získají ITextFrame během vyhledávání, nahrazování, validace nebo exportu textu. Použijte ITextFrame.ParentShape a ITextFrame.ParentCell k určení, který objekt prezentace vlastní textový rámeček.

Očekávané hodnoty závisí na vlastníkovi:

Vlastník textového rámečku ParentShape ParentCell
AutoShape nebo jiný tvar obsahující text Vlastní IShape null
Buňka tabulky null Vlastní ICell

Obě vlastnosti jsou jen pro čtení a slouží k navigaci. Čtení neprovádí žádný přesun textového rámečku ani nezmění jeho vlastníka. Obecný kód by měl zkontrolovat oba hodnoty na null a řešit možnost, že žádný vlastník není k dispozici.

Následující příklad používá SlideUtil.GetAllTextFrames k iteraci přes textové rámečky v prezentaci. Pro tvary vypisuje název tvaru, typ tvaru a příslušný snímek. Pro buňky tabulky vypisuje nulově indexované souřadnice sloupce a řádku a příslušný snímek.

using System;
using Aspose.Slides;
using Aspose.Slides.Util;

using var presentation = new Presentation("presentation.pptx");

var textFrames = SlideUtil.GetAllTextFrames(presentation, false);

foreach (var textFrame in textFrames)
{
    var ownerShape = textFrame.ParentShape;
    if (ownerShape != null)
    {
        var shapeName = string.IsNullOrEmpty(ownerShape.Name) ? "(unnamed)" : ownerShape.Name;
        var shapeType = GetShapeType(ownerShape);
        var slideLabel = GetSlideLabel(ownerShape.Slide);
        Console.WriteLine($"Shape: {shapeName}; type: {shapeType}; {slideLabel}");

        continue;
    }

    var ownerCell = textFrame.ParentCell;
    if (ownerCell != null)
    {
        var slideLabel = GetSlideLabel(ownerCell.Slide);
        Console.WriteLine($"Table cell: column {ownerCell.FirstColumnIndex}, row {ownerCell.FirstRowIndex}; {slideLabel}");
        continue;
    }

    Console.WriteLine("The text frame owner is not available as a shape or table cell.");
}

static string GetShapeType(IShape shape)
{
    if (shape is IGeometryShape geometryShape)
    {
        return geometryShape.ShapeType.ToString();
    }

    return shape.GetType().Name;
}

static string GetSlideLabel(IBaseSlide baseSlide)
{
    if (baseSlide is ISlide slide)
    {
        return $"slide {slide.SlideNumber}";
    }

    if (baseSlide is INotesSlide notesSlide)
    {
        return $"notes for slide {notesSlide.ParentSlide.SlideNumber}";
    }

    return baseSlide.GetType().Name;
}

Pro obsah SmartArt iterujte přes tvary v ISmartArtNode.Shapes a přistupujte k jednotlivým ISmartArtShape.TextFrame. Textový rámeček lze sledovat k jeho souvisejícímu tvaru pomocí ITextFrame.ParentShape, zatímco ITextFrame.ParentCell je null. Proto větev pro tvary v příkladu také zpracovává text ze SmartArt uzlů.

Shromažďování informací o shodách pomocí zpětného volání

Implementujte IFindResultCallback pro získání oznámení o každé shodě. Jeho metoda IFindResultCallback.FoundResult poskytuje související textový rámeček, zdrojový text, nalezený text a pozici shody.

Zpětné volání nedostává číslo snímku přímo. Implementace níže odvozuje číslo ze snímku rodiče a také zpracovává text nalezený v poznámkách ke snímkům. Číslo snímku může být nullable, aby stejný model výsledku mohl reprezentovat text spojený s jinými typy snímků.

using System.Collections.Generic;
using Aspose.Slides;

public sealed class TextMatch
{
    public TextMatch(ITextFrame textFrame, string sourceText, string foundText, int textPosition, int? slideNumber)
    {
        TextFrame = textFrame;
        SourceText = sourceText;
        FoundText = foundText;
        TextPosition = textPosition;
        SlideNumber = slideNumber;
    }

    public ITextFrame TextFrame { get; }
    public string SourceText { get; }
    public string FoundText { get; }
    public int TextPosition { get; }
    public int? SlideNumber { get; }
}

public sealed class TextSearchCallback : IFindResultCallback
{
    public List<TextMatch> Results { get; } = new();

    public void FoundResult(ITextFrame textFrame, string sourceText, string foundText, int textPosition)
    {
        var slideNumber = GetSlideNumber(textFrame);
        var result = new TextMatch(textFrame, sourceText, foundText, textPosition, slideNumber);

        Results.Add(result);
    }

    private static int? GetSlideNumber(ITextFrame textFrame)
    {
        var parentSlide = textFrame.ParentShape?.Slide ?? textFrame.ParentCell?.Slide ?? textFrame.Slide;

        if (parentSlide is ISlide slide)
        {
            return slide.SlideNumber;
        }

        if (parentSlide is INotesSlide notesSlide)
        {
            return notesSlide.ParentSlide.SlideNumber;
        }

        return null;
    }
}

Pro operace nahrazování obsahuje FoundText původní nalezený text, takže zpětné volání může přesně zaznamenat, které termíny byly nahrazeny.

Zvýraznit text

Použijte metodu ITextFrame.HighlightText pro zvýraznění doslovných shod v textovém rámečku. Předejte TextSearchOptions pro řízení vyhledávání a zpětné volání pro sběr podrobností o shodách.

Následující kód zvýrazní všechny výskyty znaků “try” a poté zvýrazní pouze celé slovo “to”. Obě vyhledávání odesílají své shody do stejného zpětného volání.

using System;
using System.Drawing;
using Aspose.Slides;
using Aspose.Slides.Export;

using var presentation = new Presentation("sample.pptx");

// Získat první tvar z prvního snímku.
var shape = (IAutoShape)presentation.Slides[0].Shapes[0];
var callback = new TextSearchCallback();

var substringSearchOptions = new TextSearchOptions
{
    CaseSensitive = false
};

// Zvýraznit každý výskyt "try" v textovém rámečku.
shape.TextFrame.HighlightText("try", Color.LightBlue, substringSearchOptions, callback);

var wholeWordSearchOptions = new TextSearchOptions
{
    WholeWordsOnly = true,
    CaseSensitive = false
};

// Zvýraznit pouze úplné slovo "to".
shape.TextFrame.HighlightText("to", Color.Violet, wholeWordSearchOptions, callback);

foreach (var result in callback.Results)
{
    Console.WriteLine($"Found '{result.FoundText}' at position {result.TextPosition} on slide {result.SlideNumber}.");
}

presentation.Save("highlighted_text.pptx", SaveFormat.Pptx);

Výsledek:

Zvýrazněný text

Zvýraznit text pomocí regulárních výrazů

Metoda ITextFrame.HighlightRegex zvýrazní textové shody nalezené regulárním výrazem v textovém rámečku.

Následující kód zvýrazní všechna slova obsahující alespoň sedm znaků a shromáždí každou shodu:

using System.Drawing;
using System.Text.RegularExpressions;
using Aspose.Slides;
using Aspose.Slides.Export;

using var presentation = new Presentation("sample.pptx");

var shape = (IAutoShape)presentation.Slides[0].Shapes[0];
var callback = new TextSearchCallback();
var regex = new Regex(@"\b[^\s]{7,}\b");

shape.TextFrame.HighlightRegex(regex, Color.Yellow, callback);

presentation.Save("highlighted_text_using_regex.pptx", SaveFormat.Pptx);

Výsledek:

Zvýrazněný text pomocí regulárního výrazu

Zvýraznit text v celé prezentaci

Použijte Presentation.HighlightText a Presentation.HighlightRegex k vyhledání ve všech relevantních textových rámečcích v prezentaci. Následující příklad zvýrazní doslovný termín a všechny e‑mailové adresy při zachování samostatných kolekcí výsledků pro obě vyhledávání.

using System.Drawing;
using System.Text.RegularExpressions;
using Aspose.Slides;
using Aspose.Slides.Export;

using var presentation = new Presentation("presentation.pptx");

var termCallback = new TextSearchCallback();
var searchOptions = new TextSearchOptions
{
    WholeWordsOnly = true,
    CaseSensitive = false
};

presentation.HighlightText("confidential", Color.Orange, searchOptions, termCallback);

var emailCallback = new TextSearchCallback();
var emailRegex = new Regex(@"\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b", RegexOptions.IgnoreCase);

presentation.HighlightRegex(emailRegex, Color.Yellow, emailCallback);

presentation.Save("highlighted_presentation.pptx", SaveFormat.Pptx);

Nahradit text v textovém rámečku

Použijte ITextFrame.ReplaceText pro doslovný text a ITextFrame.ReplaceRegex pro nahrazování na základě vzoru. Tyto metody aktualizují nalezený text v existujícím textovém rámečku, čímž zachovají formátování okolních částí místo přestavby rámečku z prostého řetězce.

Následující příklad standardizuje variantu pravopisu a poté nahradí štítky verzí. Stejné zpětné volání zaznamenává původní termíny nalezené oběma operacemi.

using System.Text.RegularExpressions;
using Aspose.Slides;
using Aspose.Slides.Export;

using var presentation = new Presentation("presentation.pptx");

var shape = (IAutoShape)presentation.Slides[0].Shapes[0];
var callback = new TextSearchCallback();
var searchOptions = new TextSearchOptions
{
    WholeWordsOnly = true,
    CaseSensitive = false
};

shape.TextFrame.ReplaceText("colour", "color", searchOptions, callback);

var versionRegex = new Regex(@"\bv\d+(?:\.\d+)*\b", RegexOptions.IgnoreCase);
shape.TextFrame.ReplaceRegex(versionRegex, "current version", callback);

presentation.Save("updated_text_frame.pptx", SaveFormat.Pptx);

Pokud jedna shoda zasahuje do částí s různým formátováním, zkontrolujte výstup, abyste potvrdili, které formátování by se mělo použít na nahrazený text.

Nahradit text v celé prezentaci

Použijte Presentation.ReplaceText a Presentation.ReplaceRegex k provedení stejných operací v celé prezentaci. To je užitečné pro úklid šablon, aktualizace terminologie a redigování.

using System.Text.RegularExpressions;
using Aspose.Slides;
using Aspose.Slides.Export;

using var presentation = new Presentation("presentation.pptx");

var callback = new TextSearchCallback();
var searchOptions = new TextSearchOptions
{
    WholeWordsOnly = true,
    CaseSensitive = true
};

presentation.ReplaceText("Contoso", "Example Corp", searchOptions, callback);

var accountNumberRegex = new Regex(@"\bACCT-\d{6}\b");
presentation.ReplaceRegex(accountNumberRegex, "ACCT-REDACTED", callback);

presentation.Save("updated_presentation.pptx", SaveFormat.Pptx);

Seskupení shod pro reportování

Protože každý výsledek uchovává číslo snímku a textový rámeček, aplikace mohou shody seskupit pro audit, reportování nebo kontrolní workflow. Následující příklad nejprve seskupí shromážděné výsledky podle snímku a poté podle textového rámečku:

using System;
using System.Linq;

var matchesBySlide = callback.Results.GroupBy(result => result.SlideNumber);

foreach (var slideGroup in matchesBySlide)
{
    var slideLabel = slideGroup.Key.HasValue ? slideGroup.Key.Value.ToString() : "Other";
    Console.WriteLine($"Slide: {slideLabel}");

    var matchesByTextFrame = slideGroup.GroupBy(result => result.TextFrame);
    foreach (var textFrameGroup in matchesByTextFrame)
    {
        Console.WriteLine($"  Text frame: {textFrameGroup.Key.Text}");

        foreach (var result in textFrameGroup)
        {
            Console.WriteLine($"    '{result.FoundText}' at position {result.TextPosition}; context: '{result.SourceText}'");
        }
    }
}

Často kladené otázky

Jak mohu vyhledávat jen v jednom textovém rámečku místo celé prezentace?

Získejte textový rámeček tvaru a zavolejte ITextFrame.HighlightText, ITextFrame.HighlightRegex, ITextFrame.ReplaceText nebo ITextFrame.ReplaceRegex na tomto rámečku. Metody na úrovni prezentace zpracovávají všechny relevantní textové rámečky.

Jak mohu vyhledávat celá slova s správnou kapitalizací?

Nastavte TextSearchOptions.WholeWordsOnly a TextSearchOptions.CaseSensitive na true a předejte možnosti metodě pro zvýraznění nebo nahrazení doslovného textu. Pro regulární výrazy definujte hranice slov a rozlišování velikosti písmen přímo v .NET Regex.

Může vyhledávání a nahrazování zahrnovat text v poznámkách k snímkům?

Ano. Nastavte TextSearchOptions.IncludeNotes na true při používání operace doslovného textu na úrovni prezentace. Implementace zpětného volání uvedená výše mapuje shodu v poznámce snímku zpět na číslo nadřazeného snímku.

Jak mohu vytvořit report bez druhého skenování prezentace?

Předávejte implementaci IFindResultCallback do operace zvýraznění nebo nahrazení. Zpětné volání přijímá každou shodu během provádění operace, takže aplikace může uložit zdrojový text, nalezený text, pozici, textový rámeček a odvozené číslo snímku pro pozdější seskupení nebo export.

Zachovává nahrazování textu jeho formátování?

ITextFrame.ReplaceText a ITextFrame.ReplaceRegex upravují nalezený text v existujícím textovém rámečku a zachovávají formátování okolních částí. Pokud shoda zasahuje do částí s různým formátováním, zkontrolujte výsledek, abyste se ujistili, že nahrazení používá požadovaný styl.