Szöveg keresése és cseréje PowerPoint-prezentációkban .NET-ben
Áttekintés
Az Aspose.Slides for .NET képes keresni, kiemelni és helyettesíteni a szöveget egy egyedi szövegkeretben vagy egy teljes prezentációban. Minden művelet értesítheti az alkalmazást minden egyes találatról egy eredmény‑visszahíváson keresztül. Ez lehetővé teszi a prezentáció frissítését, miközben egy audit nyomvonalat épít a megtalált szövegről, annak környezetéről, pozíciójáról, szövegkeretről és diaszámról.
Ezek a képességek hasznosak felülvizsgálathoz, szerkesztéshez, terminológiai ellenőrzésekhez, sablonok tisztításához és automatizált jelentéskészítési munkafolyamatokhoz.
Az alábbi első példákban egy “sample.pptx” nevű fájlt használunk, amely az első dián egyetlen szövegdobozt tartalmaz a következő szöveggel:

A keresési hatókör kiválasztása
Használja a ITextFrame metódusait egy művelet egyetlen szövegkeretre korlátozásához. Használja a Presentation metódusait a prezentációban található összes alkalmazható szöveg feldolgozásához.
| Művelet | Egy szövegkeret | Teljes prezentáció |
|---|---|---|
| Literális szöveg kiemelése | ITextFrame.HighlightText | Presentation.HighlightText |
| Reguláris kifejezés egyezéseinek kiemelése | ITextFrame.HighlightRegex | Presentation.HighlightRegex |
| Literális szöveg helyettesítése | ITextFrame.ReplaceText | Presentation.ReplaceText |
| Reguláris kifejezés egyezéseinek helyettesítése | ITextFrame.ReplaceRegex | Presentation.ReplaceRegex |
Szövegillesztés beállítása
Literal szöveg műveletekhez használja a TextSearchOptions‑t a keresés szabályozásához:
- Az TextSearchOptions.WholeWordsOnly csak teljes szavakra korlátozza a találatokat.
- Az TextSearchOptions.CaseSensitive szabályozza, hogy a karakterek nagybetű‑érzékenysége kötelező legyen-e.
- Az TextSearchOptions.IncludeNotes a diák jegyzeteit is belefoglalja a prezentáció szintű keresésbe, helyettesítésbe és kiemelésbe.
A reguláris kifejezéseket használó műveletek egy .NET Regex‑et használnak, ezért a nagybetű‑érzékenység és a szóhatárok szabályait a kifejezés és annak beállításai határozzák meg.
A szövegkeret tulajdonosának azonosítása
Az általános szövegfeldolgozó munkafolyamatok gyakran egy ITextFrame objektumot kapnak a keresés, helyettesítés, érvényesítés vagy exportálás során. Használja az ITextFrame.ParentShape és az ITextFrame.ParentCell hivatkozásokat annak meghatározásához, hogy melyik prezentációs objektum a szövegkeret tulajdonosa.
Az elvárt értékek a tulajdonostól függnek:
| Szövegkeret tulajdonosa | ParentShape |
ParentCell |
|---|---|---|
| AutoShape vagy egy másik szöveget tartalmazó alakzat | A tulajdonos IShape | null |
| Táblázat cella | null |
A tulajdonos ICell |
Mindkét tulajdonság csak olvasható navigációs tulajdonság. Olvasásuk nem mozgatja a szövegkeretet, és nem változtatja meg a tulajdonost. Az általános kódban ellenőrizni kell mindkét értéket null‑ra, és kezelni kell azt a lehetőséget, hogy egyik tulajdonos sem érhető el.
Az alábbi példa a SlideUtil.GetAllTextFrames‑t használja a prezentáció szövegkereteinek bejárásához. Alakzatok esetén jelenti az alakzat nevét, típusát és a tartalmazó diát. Táblázat cellák esetén jelenti a nullától kezdődő oszlop- és sorkoordinátákat valamint a tartalmazó diát.
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;
}
SmartArt tartalom esetén járja be az alakzatokat a ISmartArtNode.Shapes‑ben, és érje el minden ISmartArtShape.TextFrame‑t. A szövegkeret a kapcsolódó alakzatra visszakövethető az ITextFrame.ParentShape segítségével, míg az ITextFrame.ParentCell null. Ezért a példában szereplő alakzatág szintén kezeli a SmartArt csomópontok szövegét.
Találati információk gyűjtése visszahívással
Implementálja a IFindResultCallback interfélt, hogy minden találatról értesítést kapjon. Az IFindResultCallback.FoundResult metódusa a kapcsolódó szövegkeretet, a forrás szöveget, a megtalált szöveget és a találat pozícióját adja.
A visszahívás nem kap közvetlenül diaszámot. Az alábbi implementáció a szülő diából származtatja azt, és kezeli a diák jegyzeteiben található szöveget is. A nullable (nullázható) diaszám lehetővé teszi, hogy ugyanaz a eredménymodell a többi diatípushoz tartozó szöveget is ábrázolja.
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;
}
}
Helyettesítési műveleteknél a FoundText tartalmazza az eredeti megtalált szöveget, így a visszahívás pontosan rögzítheti, mely kifejezéseket cserélték le.
Szöveg kiemelése
Használja az ITextFrame.HighlightText metódust a literális szöveg egyezéseinek kiemelésére egy szövegkeretben. Adjon át TextSearchOptions beállításokat a keresés vezérléséhez, valamint egy visszahívást a találati részletek gyűjtéséhez.
Az alábbi kódrészlet kiemeli a “try” összes előfordulását, majd csak a teljes “to” szót. Mindkét keresés a találatokat ugyanarra a visszahívásra jelenti.
using System;
using System.Drawing;
using Aspose.Slides;
using Aspose.Slides.Export;
using var presentation = new Presentation("sample.pptx");
// Az első dián lévő első alakzat lekérése.
var shape = (IAutoShape)presentation.Slides[0].Shapes[0];
var callback = new TextSearchCallback();
var substringSearchOptions = new TextSearchOptions
{
CaseSensitive = false
};
// Kiemeli a szövegkeretben a "try" minden előfordulását.
shape.TextFrame.HighlightText("try", Color.LightBlue, substringSearchOptions, callback);
var wholeWordSearchOptions = new TextSearchOptions
{
WholeWordsOnly = true,
CaseSensitive = false
};
// Kiemeli csak a "to" teljes szót.
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);
Az eredmény:

Szöveg kiemelése reguláris kifejezésekkel
Az ITextFrame.HighlightRegex metódus kiemeli egy reguláris kifejezés által talált szövegegyezéseket egy szövegkeretben.
Az alábbi kód kiemeli a hét vagy több karaktert tartalmazó összes szót, és összegyűjti az egyes találatokat:
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);
Az eredmény:

Szöveg kiemelése a teljes prezentációban
Használja a Presentation.HighlightText és a Presentation.HighlightRegex metódusokat a prezentációban található összes alkalmazható szövegkeret keresésére. Az alábbi példa kiemeli egy literális kifejezést és az összes e‑mail címet, miközben külön eredménygyűjteményeket tart a két kereséshez.
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);
Szöveg cseréje egy szövegkeretben
Használja az ITextFrame.ReplaceText metódust literális szöveghez és az ITextFrame.ReplaceRegex metódust mintára alapozott helyettesítéshez. Ezek a metódusok a meglévő szövegkereten belül frissítik a megtalált szöveget, megőrizve a környező rész formázását ahelyett, hogy egy egyszerű karakterláncból újjáépítenék a szövegkeretet.
Az alábbi példa egységesíti egy helyesírási változatot, majd lecseréli a verziócímkéket. Az ugyanaz a visszahívás rögzíti mindkét művelet által megtalált eredeti kifejezéseket.
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);
Ha egy találat több, eltérő formázású részt ölel fel, ellenőrizze a kimenetet, hogy melyik formázás legyen érvényes a helyettesített szövegre.
Szöveg cseréje a teljes prezentációban
Használja a Presentation.ReplaceText és a Presentation.ReplaceRegex metódusokat a prezentáció egészére kiterjedő műveletekhez. Ez hasznos sablonok tisztításához, terminológiai frissítésekhez és szerkesztéshez.
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);
Találatok csoportosítása jelentéshez
Mivel minden eredmény tárolja a diaszámát és a szövegkeretét, az alkalmazások csoportosíthatják a találatokat audit, jelentés vagy felülvizsgálati munkafolyamatok céljából. Az alábbi példa a gyűjtött eredményeket először diánként, majd szövegkeretként csoportosítja:
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}'");
}
}
}
GYIK
Hogyan kereshetek csak egy szövegdobozban a teljes prezentáció helyett?
Szerezze meg az alakzat szövegkeretét, és hívja meg a ITextFrame.HighlightText, ITextFrame.HighlightRegex, ITextFrame.ReplaceText vagy a ITextFrame.ReplaceRegex metódusokat azon a szövegkereten. A prezentációszintű metódusok minden alkalmazható szövegkeretet feldolgoznak.
Hogyan illeszthetek teljes szavakat a helyes nagybetű‑érzékenységgel?
Állítsa a TextSearchOptions.WholeWordsOnly és a TextSearchOptions.CaseSensitive értékét true‑ra, és adja át ezeket a beállításokat egy literális szöveg kiemelő vagy helyettesítő metódusnak. Reguláris kifejezéseknél a szóhatárokat és a nagybetű‑érzékenységet a .NET Regex maga határozza meg.
A keresés és helyettesítés tartalmazhat szöveget a diák jegyzeteiben?
Igen. Állítsa a TextSearchOptions.IncludeNotes értékét true‑ra, amikor prezentációszintű literális szöveg műveletet használ. A fent bemutatott visszahívás-implementáció a jegyzetdián található találatot visszakapcsolja a szülődiára.
Hogyan készíthetek jelentést a prezentáció újbóli beolvasása nélkül?
Adjon át egy IFindResultCallback implementációt a kiemeléshez vagy helyettesítéshez. A visszahívás minden találatot megkap a művelet futása során, így az alkalmazás tárolhatja a forrás szöveget, a megtalált szöveget, a pozíciót, a szövegkeretet és a származtatott diaszámot későbbi csoportosításhoz vagy exportáláshoz.
Megőrzi-e a szöveg cseréje a formázását?
Az ITextFrame.ReplaceText és az ITextFrame.ReplaceRegex a meglévő szövegkereten belül módosítják a megtalált szöveget, és megtartják a környező rész formázását. Ha egy találat több, különböző formázású részt foglal magába, ellenőrizze az eredményt, hogy a helyettesítés a kívánt stílust használja.