Prezentációs hiperhivatkozások kezelése .NET-ben

Bevezetés

A hiperhivatkozás összekapcsolja a prezentáció tartalmát egy weboldallal vagy a prezentáción belüli egy helyszínnel. A PowerPointban a hiperhivatkozások általában két célra szolgálnak:

  • Weboldal megnyitása szövegből, alakzatból vagy médiakeretből.
  • Navigálás egy másik diára, például egy tartalomjegyzékből.

Az Aspose.Slides for .NET lehetővé teszi ezeknek a hivatkozásoknak a hozzáadását, megjelenésük és hangjuk vezérlését, tulajdonságaik frissítését és eltávolítását. Az alábbi példák bemutatják, hogyan lehet hiperhivatkozásokkal dolgozni egyedi elemeknél, valamint hogyan lehet hozzáférni a hiperhivatkozásokhoz a prezentáció, dia vagy szövegkeret szintjén.

URL hiperhivatkozások hozzáadása

Weboldal URL-t rendelhet szöveghez, alakzathoz vagy médiakerethez. Az elem, amelyhez a hiperhivatkozást rendeli, meghatározza a kattintható területet: a szövegrész linkeli a kijelölt szöveget, míg az alakzat vagy keret a diaobjektumot linkeli.

Relatív hiperhivatkozásokat tartalmazó prezentációk esetén nézze meg a A hiperhivatkozás alapjának kezelése útmutatót, hogy elolvassa, módosítsa vagy törölje a dokumentumszintű alapot.

URL hiperhivatkozások hozzáadása szöveghez

A szöveget egy weboldalra linkeléshez rendelje hozzá a Hyperlink objektumot a szövegrész HyperlinkClick tulajdonságához, ahogy az alább látható. Csak ez a szövegrész lesz kattintható.

using Aspose.Slides;
using Aspose.Slides.Export;

using var presentation = new Presentation();

var textShape = presentation.Slides[0].Shapes.AddAutoShape(ShapeType.Rectangle, 100, 100, 600, 50, false);
textShape.AddTextFrame("Aspose: File Format APIs");
var portionFormat = textShape.TextFrame.Paragraphs[0].Portions[0].PortionFormat;
portionFormat.HyperlinkClick = new Hyperlink("https://www.aspose.com/");
portionFormat.HyperlinkClick.Tooltip = "Explore Aspose file format APIs";
portionFormat.FontHeight = 32;

presentation.Save("presentation-out.pptx", SaveFormat.Pptx);

URL hiperhivatkozások hozzáadása alakzatokhoz és médiakeretekhez

Az alakzat vagy keret kattinthatóvá tételéhez állítsa be a HyperlinkClick tulajdonságát. A hiperhivatkozás az objektumhoz tartozik, nem egy benne lévő szövegrészhez.

Ugyanez a megközelítés alkalmazható kép-, hang- és videokeretekre: rendelje a hiperhivatkozást a kerethez, és szükség esetén állítsa be a link Tooltip attribútumát.

Az alábbi példa egy téglalapot tesz kattinthatóvá:

using Aspose.Slides;
using Aspose.Slides.Export;

using var presentation = new Presentation();

var shape = presentation.Slides[0].Shapes.AddAutoShape(ShapeType.Rectangle, 100, 100, 600, 50);

shape.HyperlinkClick = new Hyperlink("https://www.aspose.com/");
shape.HyperlinkClick.Tooltip = "Explore Aspose file format APIs";

presentation.Save("presentation-out.pptx", SaveFormat.Pptx);

Hiperhivatkozások használata tartalomjegyzék létrehozásához

A belső hiperhivatkozások lehetővé teszik, hogy az olvasók a tartalomjegyzékből egy adott diára ugorjanak. Az alábbi példa a SetInternalHyperlinkClick metódust használja, hogy az első dia „Page 2” szövegét a második diára linkelje.

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

using var presentation = new Presentation();

var firstSlide = presentation.Slides[0];
var secondSlide = presentation.Slides.AddEmptySlide(firstSlide.LayoutSlide);

var tableOfContents = firstSlide.Shapes.AddAutoShape(ShapeType.Rectangle, 40, 40, 300, 100);
tableOfContents.FillFormat.FillType = FillType.NoFill;
tableOfContents.LineFormat.FillFormat.FillType = FillType.NoFill;
tableOfContents.TextFrame.Paragraphs.Clear();

var paragraph = new Paragraph();
paragraph.ParagraphFormat.DefaultPortionFormat.FillFormat.FillType = FillType.Solid;
paragraph.ParagraphFormat.DefaultPortionFormat.FillFormat.SolidFillColor.Color = Color.Black;
paragraph.Text = "Title of slide 2 .......... ";

var linkPortion = new Portion();
linkPortion.Text = "Page 2";
linkPortion.PortionFormat.HyperlinkManager.SetInternalHyperlinkClick(secondSlide);

paragraph.Portions.Add(linkPortion);
tableOfContents.TextFrame.Paragraphs.Add(paragraph);

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

Hiperhivatkozások formázása

Szín

Az IHyperlink ColorSource tulajdonsága határozza meg, hogy a hiperhivatkozás a prezentáció hiperhivatkozás-színét vagy a szövegrész formázását használja-e. Egy egyéni szövegszín alkalmazásához válassza a HyperlinkColorSource.PortionFormat értéket, és állítsa be a rész kitöltőszínét. Ez a funkció a PowerPoint 2019‑ben került bevezetésre; a régebbi verziók nem alkalmazzák ezt a beállítást.

Az alábbi példa két szöveges hiperhivatkozást ad ugyanarra a diára. Az első piros szövegkitöltést használ, míg a második az alapértelmezett hiperhivatkozás-színt tartja meg.

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

using var presentation = new Presentation();

var coloredShape = presentation.Slides[0].Shapes.AddAutoShape(ShapeType.Rectangle, 100, 100, 450, 50, false);
coloredShape.AddTextFrame("This hyperlink uses a custom color.");
var coloredPortionFormat = coloredShape.TextFrame.Paragraphs[0].Portions[0].PortionFormat;
coloredPortionFormat.HyperlinkClick = new Hyperlink("https://www.aspose.com/");
coloredPortionFormat.HyperlinkClick.ColorSource = HyperlinkColorSource.PortionFormat;
coloredPortionFormat.FillFormat.FillType = FillType.Solid;
coloredPortionFormat.FillFormat.SolidFillColor.Color = Color.Red;

var defaultShape = presentation.Slides[0].Shapes.AddAutoShape(ShapeType.Rectangle, 100, 200, 450, 50, false);
defaultShape.AddTextFrame("This hyperlink uses the default color.");
defaultShape.TextFrame.Paragraphs[0].Portions[0].PortionFormat.HyperlinkClick = new Hyperlink("https://www.aspose.com/");

presentation.Save("presentation-out-hyperlink.pptx", SaveFormat.Pptx);

Hang

A hiperhivatkozás aktiváláskor lejátszhat egy hangot, vagy leállíthat egy már futó hangot. Az alábbi tulajdonságokkal állíthatja be ezeket a viselkedéseket:

Hiperhivatkozás hangjának hozzáadása

Az alábbi példa betölti a sampleaudio.wav fájlt, és egy gombhoz rendeli az első dián. A gomb megnyomásakor a hang lejátszódik, és a következő diára navigál. Egy másik alakzat ugyanazon a dián leállítja az előző hangot a kattintáskor, anélkül, hogy navigációt végezne.

using System.IO;
using Aspose.Slides;
using Aspose.Slides.Export;

using var presentation = new Presentation();

var audioData = File.ReadAllBytes("sampleaudio.wav");
var hyperlinkSound = presentation.Audios.AddAudio(audioData);

var firstSlide = presentation.Slides[0];

var playButton = firstSlide.Shapes.AddAutoShape(ShapeType.SoundButton, 100, 100, 100, 50);
playButton.HyperlinkClick = Hyperlink.NextSlide;

if (!playButton.HyperlinkClick.StopSoundOnClick && playButton.HyperlinkClick.Sound == null)
{
    playButton.HyperlinkClick.Sound = hyperlinkSound;
}

var secondSlide = presentation.Slides.AddEmptySlide(firstSlide.LayoutSlide);

var stopButton = secondSlide.Shapes.AddAutoShape(ShapeType.Rectangle, 100, 100, 100, 50);
stopButton.HyperlinkClick = Hyperlink.NoAction;

stopButton.HyperlinkClick.StopSoundOnClick = true;

presentation.Save("hyperlink-sound.pptx", SaveFormat.Pptx);

Hiperhivatkozás hangjának kinyerése

Az alábbi példa megnyitja a fenti példában létrehozott prezentációt, és a Sound és a BinaryData segítségével beolvassa az első alakzat hiperhivatkozás-audióját a memóriába.

using System;
using Aspose.Slides;

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

if (presentation.Slides.Count > 0 && presentation.Slides[0].Shapes.Count > 0)
{
    var hyperlink = presentation.Slides[0].Shapes[0].HyperlinkClick;
    var sound = hyperlink?.Sound;
    if (sound != null)
    {
        var audioData = sound.BinaryData;
        Console.WriteLine($"Extracted {audioData.Length} bytes of hyperlink audio.");
    }
    else
    {
        Console.WriteLine("The first shape has no hyperlink sound.");
    }
}
else
{
    Console.WriteLine("The presentation has no first slide or shape to inspect.");
}

Tooltip és interakciós beállítások

A hiperhivatkozás szöveghez vagy alakzathoz való hozzárendelése után frissítheti a következő IHyperlink tulajdonságokat:

  • Tooltip a megjelenő szöveges tippet határozza meg a linkhez.
  • TargetFrame a szülő HTML‑framesetben megcélzott keretet jelöli, ha alkalmazható.
  • History szabályozza, hogy a link aktiválása felvegye‑e a célt a megtekintett hiperhivatkozások listájába.
  • HighlightClick meghatározza, hogy a hiperhivatkozás kattintáskor kiemelésre kerül‑e.

Hiperhivatkozások eltávolítása a prezentációkból

A GetAnyHyperlinks segítségével először gyűjtse össze a hiperhivatkozás‑konténereket, beleértve a szövegrész‑linkeket is, mielőtt módosítaná őket. Az alábbi példa eltávolítja mindkét aktiválási típust az első diáról. Egy típus eltávolításához csak a RemoveHyperlinkClick vagy a RemoveHyperlinkMouseOver hívást használja; egy kattintási művelet eltávolítása nem vonja vissza az egér‑over megfelelőjét.

using System;
using System.Linq;
using Aspose.Slides;
using Aspose.Slides.Export;

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

if (presentation.Slides.Count > 0)
{
    var containers = presentation.Slides[0].HyperlinkQueries.GetAnyHyperlinks().ToList();
    foreach (var container in containers)
    {
        container.HyperlinkManager.RemoveHyperlinkClick();
        container.HyperlinkManager.RemoveHyperlinkMouseOver();
    }
    presentation.Save("pres-removed-hyperlinks.pptx", SaveFormat.Pptx);
}
else
{
    Console.WriteLine("The presentation has no slides to process.");
}

Feltétel nélküli eltávolításhoz a RemoveAllHyperlinks mindkét aktiválási típust egy hívásban törli a kiválasztott hatókörben. Szelektív takarításhoz és a master‑ek, elrendezések és jegyzetek lefedéséhez tekintse meg a Hiperhivatkozások jelentése, tisztítása és ellenőrzése részt.

Átfogó hiperhivatkozás‑leltár összeállítása

A prezentáció terjesztése előtt készítsen leltárt az interaktív műveletekről és a webes linkekről. A GetAnyHyperlinks IHyperlinkContainer objektumokat ad vissza, nem egy egyszerű URL‑lista. Vizsgálja meg mind a HyperlinkClick , mind a HyperlinkMouseOver tulajdonságokat minden egyes konténeren. Ezek függetlenek: egy konténer mindkét műveletet is tartalmazhat, ezért egy teljes jelentéshez akár két sorra is szükség lehet konténerenként.

Az alakzatszintű hiperhivatkozások vizsgálata kimaradhat a szövegrész‑linkekhez kapcsolt hivatkozásokról. Használja a megfelelő hatókört, és tartsa meg a visszakapott konténereket, hogy később frissíthesse vagy eltávolíthassa a műveleteiket.

Prezentáció, dia és szövegkeret hatókörök lekérdezése

Az IHyperlinkQueries felület a IPresentation.HyperlinkQueries, IBaseSlide.HyperlinkQueries és ITextFrame.HyperlinkQueries segítségével érhető el. Minden hatókör ugyanazokat a lekérdezéseket támogatja:

Az alábbi példa létrehozza a hyperlink-audit-input.pptx‑et egy külső kattintási linkkel, egy fájl egér‑over linkkel, egy belső dia‑navigációval, egy szöveg egér‑over linkkel és egy makró‑művelettel. A példában egyik művelet sem hajtódik végre. A három lekérdezés minden hatókörben használható; a számlálók konténereket jelentenek, nem a műveletek összegét. A szövegkeret‑hatókör kizárja a körülvevő alakzat saját linkjeit.

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

using var presentation = new Presentation();
var slide = presentation.Slides[0];
var destination = presentation.Slides.AddEmptySlide(slide.LayoutSlide);
var shape = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 20, 20, 400, 60);
shape.TextFrame.Text = "Click the text to go to slide 2";
shape.HyperlinkManager.SetExternalHyperlinkClick("https://example.com/");
shape.HyperlinkClick.Tooltip = "Public website";
shape.HyperlinkManager.SetExternalHyperlinkMouseOver("file:///C:/private/report.xlsx");

var portionFormat = shape.TextFrame.Paragraphs[0].Portions[0].PortionFormat;
portionFormat.HyperlinkManager.SetInternalHyperlinkClick(destination);
portionFormat.HyperlinkManager.SetExternalHyperlinkMouseOver("https://example.com/help");
var macroButton = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 20, 120, 200, 60);
macroButton.HyperlinkManager.SetMacroHyperlinkClick("ReviewPresentation");

PrintCounts("Presentation", presentation.HyperlinkQueries);
PrintCounts("Slide 1", slide.HyperlinkQueries);
PrintCounts("Text frame", shape.TextFrame.HyperlinkQueries);
presentation.Save("hyperlink-audit-input.pptx", SaveFormat.Pptx);

static void PrintCounts(string scope, IHyperlinkQueries queries)
{
    var clickContainers = queries.GetHyperlinkClicks();
    var mouseOverContainers = queries.GetHyperlinkMouseOvers();
    var allContainers = queries.GetAnyHyperlinks();
    Console.WriteLine($"{scope}: click={clickContainers.Count}, mouse-over={mouseOverContainers.Count}, any={allContainers.Count}");
}

Ebben a példában a prezentáció‑ és dia‑lekérdezések három kattintási, két egér‑over és három összesített konténert jelentenek. A szövegkeret‑lekérdezés egy konténert ad minden kategóriában.

Műveletek és célpontok osztályozása

Az IHyperlink.ActionType segítségével értelmezze a műveletet, mielőtt a célpontot vizsgálná. A HyperlinkActionType értékek a webes navigáción túl is kiterjednek:

Értékek Jelentés jelentésben
Hyperlink Külső hiperhivatkozás; vizsgálja meg az URL‑t és annak sémáját.
JumpSpecificSlide Belső navigáció egy adott diára.
JumpFirstSlide, JumpPreviousSlide, JumpNextSlide, JumpLastSlide, JumpLastViewedSlide Beépített diavetítés‑navigáció, a diavetítés kontextusában értelmezett.
JumpEndShow, StartCustomSlideShow Az aktuális bemutató befejezése vagy egy egyéni bemutató indítása.
StartMacro Makró végrehajtása.
StartProgram Program indítása.
OpenFile, OpenPresentation Fájl vagy másik prezentáció megnyitása; külön kezelendő a webes URL‑ktől.
StartStopMedia Média lejátszás indítása vagy leállítása.
NoAction, Unknown Nincs navigációs művelet, vagy ismeretlen művelet, amely felülvizsgálatot igényel.

Olvassa ki a külső célpontokat az ExternalUrl segítségével, a belső célpontokat pedig a TargetSlide mezőből. A belső műveletek és a beépített parancsok gyakran nem rendelkeznek külső URL‑lel; egy üres URL nem jelenti azt, hogy a konténernek nincs művelete. Tartsa meg az ExternalUrlOriginal értékét, ha eltér a normalizált URL‑től, és adja hozzá a Tooltip‑et, ha elérhető.

Hiperhivatkozások jelentése, tisztítása és ellenőrzése

Az alábbi .NET 6+ példa egy meglévő prezentációt (a fenti bemeneti fájlt) beolvas, a hyperlink-audit.json‑t írja, egy szabályzatot alkalmaz, a hyperlink-sanitized.pptx‑t menti, majd újra megnyitja, hogy újra ellenőrizze mindkét aktiválási típust. A módosítások előtt a konténereket gyűjti, és referenciális egyenlőséget használ, hogy ne dolgozza fel ugyanazt a konténert kétszer. A prezentáció‑lekérdezések a szokásos diákra vonatkoznak; a csomagon belüli átfogó leltárhoz explicit módon lekérdezi a master‑eket, elrendezéseket, jegyzeteket és a jegyzet‑, valamint a kézibeszámoló‑master‑eket, ha jelen vannak.

A jelentés egy egy‑alapú dianévszámot és a rendelkezésre álló SlideId‑t rögzíti. Az ISlideComponent.Slide a támogatott konténerekhez a tulajdonos diát adja vissza. A master‑ek, elrendezések és jegyzetek nem rendelkeznek szokásos diaindexszel, ezért a hatókörük alapján azonosítjuk őket. Az alakzat‑konténereket és a szövegrész‑formázási konténereket külön jelöljük; a többi konténer a futás‑idő típusnevével marad. Minden konténer kap egy jelentés‑helyi azonosítót, hogy a két művelet összekapcsolható legyen.

Ez a szándékosan korlátozó alkalmazási szabályzat csak abszolút HTTPS‑URL‑eket és érvényes belső dia‑célpontokat engedélyez. A makrókat, programokat, fájl‑műveleteket, egyéb diavetítés‑műveleteket, ismeretlen műveleteket és egyéb URL‑sémákat elutasítja. Ezek az elutasítások szabályzat‑döntések, nem az Aspose.Slides biztonsági ítélete. A HTTPS önmagában nem teremt bizalmat: adjon hozzá hoszt‑fehérlistákat és egyéb ellenőrzéseket az alkalmazásához. Mind az eredeti, mind a normalizált külső URL‑ket ellenőrizzük. A példa metaadat‑ellenőrzést végez anélkül, hogy a linkeket követné vagy a műveleteket lefuttatná.

Javításhoz a konténer HyperlinkManager támogatja a SetExternalHyperlinkClick, a RemoveHyperlinkClick és a RemoveHyperlinkMouseOver metódusokat. Itt a tiltott külső kattintási linkek egy rögzített HTTPS‑céloldalra cserélődnek; a többi tiltott kattintás és a tiltott egér‑over művelet külön‑külön kerül eltávolításra. Állítsa a replaceExternalClicks‑t false‑ra, ha minden szabálysértést el szeretne távolítani. Válasszon egy alkalmazás‑tulajdonú csereoldalt a telepítés előtt.

A jelentés export‑jelzője konzervatív PDF‑ellenőrzési szabályzatot használ: az egér‑over műveleteket és minden egyéb, mint a külső link vagy egy specifikus dia‑ugrás, potenciálisan nem támogatottként jelöli. Ez egy ellenőrzési tipp, nem képesség‑teszt vagy garancia arra, hogy a jelöletlen linkek megmaradnak az export során. A támogatott PDF és HTML exportok megőrizhetik a hiperhivatkozásokat, a művelet, az export‑opciók és a megjelenítő függvényében. A raszteres images és video nem tudják megőrizni az interaktív hiperhivatkozásokat; ezeknél az audit során minden műveletet jelöljen.

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text.Json;
using Aspose.Slides;
using Aspose.Slides.Export;

const bool replaceExternalClicks = true;
const string replacementUrl = "https://example.com/blocked-link";
using var presentation = new Presentation("hyperlink-audit-input.pptx");
var containers = CollectContainers(presentation);
var rows = new List<object>();

for (var index = 0; index < containers.Count; index++)
{
    var container = containers[index];
    AddRow(container.HyperlinkClick, "click", container, index + 1);
    AddRow(container.HyperlinkMouseOver, "mouse-over", container, index + 1);
}

var jsonOptions = new JsonSerializerOptions { WriteIndented = true };
var json = JsonSerializer.Serialize(rows, jsonOptions);
File.WriteAllText("hyperlink-audit.json", json);

foreach (var container in containers)
{
    var click = container.HyperlinkClick;
    if (PolicyViolation(click) != null)
    {
        if (replaceExternalClicks && click.ActionType == HyperlinkActionType.Hyperlink)
        {
            container.HyperlinkManager.SetExternalHyperlinkClick(replacementUrl);
        }
        else
        {
            container.HyperlinkManager.RemoveHyperlinkClick();
        }
    }
    if (PolicyViolation(container.HyperlinkMouseOver) != null)
    {
        container.HyperlinkManager.RemoveHyperlinkMouseOver();
    }
}

presentation.Save("hyperlink-sanitized.pptx", SaveFormat.Pptx);
using var reopened = new Presentation("hyperlink-sanitized.pptx");
var remainingContainers = CollectContainers(reopened);
var violations = 0;
foreach (var container in remainingContainers)
{
    if (PolicyViolation(container.HyperlinkClick) != null) violations++;
    if (PolicyViolation(container.HyperlinkMouseOver) != null) violations++;
}
Console.WriteLine($"Audit rows: {rows.Count}; prohibited actions after reopening: {violations}");
if (violations != 0)
{
    Console.WriteLine("Verification failed: do not distribute the saved presentation.");
    Environment.ExitCode = 1;
}

void AddRow(IHyperlink? link, string activation, IHyperlinkContainer container, int containerId)
{
    if (link == null) return;
    var ownerSlide = (container as ISlideComponent)?.Slide;
    var targetSlide = link.TargetSlide;
    var violation = PolicyViolation(link);
    var ownerType = container is IShape ? "Shape" : container is IPortionFormat ? "Text portion" : container.GetType().Name;
    var ordinaryAction = link.ActionType == HyperlinkActionType.Hyperlink || link.ActionType == HyperlinkActionType.JumpSpecificSlide;
    rows.Add(new
    {
        ContainerId = containerId,
        SlideIndex = SlideIndex(presentation, ownerSlide),
        SlideId = ownerSlide?.SlideId,
        Scope = ownerSlide?.GetType().Name,
        OwnerType = ownerType,
        Activation = activation,
        ActionType = link.ActionType.ToString(),
        ExternalUrl = link.ExternalUrl,
        TargetSlideIndex = SlideIndex(presentation, targetSlide),
        TargetSlideId = targetSlide?.SlideId,
        Tooltip = link.Tooltip,
        OriginalExternalUrl = link.ExternalUrlOriginal != link.ExternalUrl ? link.ExternalUrlOriginal : null,
        PotentiallyUnsafe = violation != null,
        PolicyViolation = violation,
        TargetExport = "PDF",
        PotentiallyUnsupportedByExport = activation == "mouse-over" || !ordinaryAction
    });
}

static int? SlideIndex(IPresentation presentation, IBaseSlide? slide)
{
    for (var index = 0; index < presentation.Slides.Count; index++)
    {
        if (ReferenceEquals(presentation.Slides[index], slide)) return index + 1;
    }
    return null;
}

static string? PolicyViolation(IHyperlink? link)
{
    if (link == null) return null;
    if (link.ActionType == HyperlinkActionType.JumpSpecificSlide)
    {
        return link.TargetSlide == null ? "Missing target slide" : null;
    }
    if (link.ActionType != HyperlinkActionType.Hyperlink) return "Action is not allowed";
    if (!IsHttps(link.ExternalUrl)) return "Normalized URL is not absolute HTTPS";
    var original = link.ExternalUrlOriginal;
    if (!string.IsNullOrEmpty(original) && !IsHttps(original)) return "Original URL is not absolute HTTPS";
    return null;
}

static bool IsHttps(string? value)
{
    return Uri.TryCreate(value, UriKind.Absolute, out var uri) && uri.Scheme == Uri.UriSchemeHttps;
}

static List<IHyperlinkContainer> CollectContainers(IPresentation presentation)
{
    var found = new List<IHyperlinkContainer>();
    found.AddRange(presentation.HyperlinkQueries.GetAnyHyperlinks());
    foreach (var master in presentation.Masters) AddScope(master);
    foreach (var layout in presentation.LayoutSlides) AddScope(layout);
    foreach (var slide in presentation.Slides) AddScope(slide.NotesSlideManager.NotesSlide);
    AddScope(presentation.MasterNotesSlideManager.MasterNotesSlide);
    AddScope(presentation.MasterHandoutSlideManager.MasterHandoutSlide);
    return found.Distinct<IHyperlinkContainer>(ReferenceEqualityComparer.Instance).ToList();

    void AddScope(IBaseSlide? slide)
    {
        if (slide != null) found.AddRange(slide.HyperlinkQueries.GetAnyHyperlinks());
    }
}

A fenti bemenettel a jelentés öt műveleti sort tartalmaz. A fájl egér‑over link és a makró‑kattintás eltávolításra kerül, míg a HTTPS‑linkek és a belső dia‑navigáció megmarad. Az ellenőrzés nulla tiltott műveletet jelez. Egy tiltott külső kattintási URL‑t tartalmazó bemenet a cserélő ágat is futtatja. Egy engedélyezett kattintással és tiltott egér‑overrel rendelkező konténer megtartja a kattintási műveletet.

Ez a szelektív takarítás eltér a RemoveAllHyperlinks működésétől, amely a kiválasztott hatókörön belül a szabálysértésektől függetlenül eltávolítja mindkét aktiválási típust. A jelen ellenőrzés csak a hiperhivatkozás‑műveleteket vizsgálja; nem távolítja el a beágyazott VBA‑projket, OLE‑objektumokat vagy egyéb aktív tartalmakat, és nem ellenőrzi a kiexportált PDF‑ vagy HTML‑fájlt.

GYIK

Hogyan linkelhetek egy szakaszra vagy annak első diájára?

A PowerPointban a szakaszok diákat csoportosítanak, de egy belső hiperhivatkozás egyetlen diát céloz meg. A szakaszra való navigáláshoz linkelje a szakasz első diájára.

Csatolhatok-e hiperhivatkozást a mesterdia‑elemekhez, hogy minden dián működjön?

Igen. A mesterdia‑ és elrendezés‑elemek támogatják a hiperhivatkozásokat. Ezek a linkek a diavetítés során elérhetők azoknál a diáknál, amelyek a megfelelő mester‑ vagy elrendezés‑elemet használják.

Megmaradnak‑e a hiperhivatkozások PDF, HTML, képek vagy videó exportálásakor?

A támogatott PDF‑ és HTML‑exportok megőrizhetik a hiperhivatkozásokat; a raszteres képek és videó nem. Lásd az export‑szempontokat a Hiperhivatkozások jelentése, tisztítása és ellenőrzése részben.