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:

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:
- TextSearchOptions.WholeWordsOnly omezuje shody na celá slova.
- TextSearchOptions.CaseSensitive řídí, zda se musí shodovat velikost písmen.
- TextSearchOptions.IncludeNotes zahrnuje poznámky k snímkům při vyhledávání, nahrazování a zvýrazňování na úrovni prezentace.
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ý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ý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.