Quản lý Siêu Liên Kết trong Bản Trình Bày bằng .NET
Giới thiệu
Liên kết siêu văn bản kết nối nội dung bản trình bày với một trang web hoặc một vị trí trong bản trình bày. Trong PowerPoint, các liên kết siêu văn bản thường phục vụ hai mục đích:
- Mở một trang web từ văn bản, hình dạng hoặc khung phương tiện.
- Điều hướng đến một slide khác, ví dụ, từ mục lục.
Aspose.Slides for .NET cho phép bạn thêm các liên kết này, kiểm soát giao diện và âm thanh của chúng, cập nhật các thuộc tính và xóa chúng. Các ví dụ dưới đây cho thấy cách làm việc với siêu liên kết trên các yếu tố riêng lẻ và cách truy cập siêu liên kết ở mức bản trình bày, slide hoặc khung văn bản.
Note
Bạn cũng có thể chỉnh sửa các bản trình bày bằng trình chỉnh sửa PowerPoint trực tuyến miễn phí của Aspose.Thêm Siêu Liên Kết URL
Bạn có thể gán URL của một trang web cho văn bản, hình dạng hoặc khung phương tiện. Yếu tố mà bạn gán siêu liên kết xác định khu vực có thể nhấp: một phần văn bản sẽ liên kết văn bản đã chọn, trong khi một hình dạng hoặc khung sẽ liên kết đối tượng slide.
Đối với các bản trình bày chứa siêu liên kết tương đối, xem Quản lý Cơ Sở Siêu Liên Kết để đọc, thay đổi hoặc xóa cơ sở ở mức tài liệu.
Thêm Siêu Liên Kết URL vào Văn Bản
Để liên kết văn bản với một trang web, gán một Hyperlink cho thuộc tính HyperlinkClick của phần văn bản, như được minh họa bên dưới. Chỉ phần văn bản đó sẽ trở thành có thể nhấp.
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);
Thêm Siêu Liên Kết URL vào Hình Dạng và Khung Phương Tiện
Để làm cho một hình dạng hoặc khung có thể nhấp, đặt thuộc tính HyperlinkClick của chúng. Siêu liên kết thuộc về đối tượng đó chứ không phải một phần văn bản bên trong.
Cùng một cách tiếp cận áp dụng cho khung hình ảnh, âm thanh và video: gán siêu liên kết cho khung và đặt Tooltip của liên kết nếu cần.
Ví dụ dưới đây làm cho một hình chữ nhật có thể nhấp:
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);
Sử Dụng Siêu Liên Kết Để Tạo Mục Lục
Các siêu liên kết nội bộ cho phép người đọc chuyển từ mục lục đến một slide cụ thể. Ví dụ dưới đây sử dụng SetInternalHyperlinkClick để liên kết văn bản “Page 2” trên slide đầu tiên tới slide thứ hai.
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);
Định Dạng Siêu Liên Kết
Màu Sắc
Thuộc tính ColorSource của IHyperlink xác định liệu siêu liên kết có sử dụng màu siêu liên kết của bản trình bày hay định dạng của phần văn bản. Để áp dụng màu văn bản tùy chỉnh, chọn HyperlinkColorSource.PortionFormat và đặt màu nền cho phần. Tính năng này được giới thiệu trong PowerPoint 2019; các phiên bản cũ hơn không áp dụng thiết lập này.
Ví dụ dưới đây thêm hai siêu liên kết văn bản vào cùng một slide. Siêu liên kết đầu tiên sử dụng màu nền văn bản đỏ, trong khi siêu liên kết thứ hai giữ màu siêu liên kết mặc định.
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);
Âm Thanh
Một siêu liên kết có thể phát âm thanh khi được kích hoạt hoặc dừng âm thanh đang phát. Sử dụng các thuộc tính sau để cấu hình các hành vi này:
- IHyperlink.Sound chỉ định âm thanh liên quan đến siêu liên kết.
- IHyperlink.StopSoundOnClick kiểm soát việc kích hoạt siêu liên kết có dừng âm thanh trước đó hay không.
Thêm Âm Thanh Siêu Liên Kết
Ví dụ dưới đây tải sampleaudio.wav và gán nó với một nút trên slide đầu tiên. Nhấp vào nút sẽ phát âm thanh và chuyển đến slide tiếp theo. Một hình dạng thứ hai trên slide đó sẽ dừng âm thanh trước khi nhấp, mà không thực hiện hành động chuyển hướng.
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);
Trích Xuất Âm Thanh Siêu Liên Kết
Ví dụ dưới đây mở bản trình bày được tạo ở trên và đọc âm thanh siêu liên kết của hình dạng đầu tiên vào bộ nhớ thông qua Sound và BinaryData.
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.");
}
Cài Đặt Tooltip và Tương Tác
Bạn có thể cập nhật các thuộc tính IHyperlink sau khi gán siêu liên kết cho văn bản hoặc hình dạng:
- Tooltip đặt văn bản mà người xem có thể hiển thị như một gợi ý cho liên kết.
- TargetFrame chỉ định khung mục tiêu trong một khung HTML cha mẹ, nếu áp dụng.
- History kiểm soát việc kích hoạt liên kết có thêm đích đến của nó vào danh sách các siêu liên kết đã xem hay không.
- HighlightClick kiểm soát việc siêu liên kết có được làm nổi bật khi nhấp hay không.
Xóa Siêu Liên Kết khỏi Bản Trình Bày
Sử dụng GetAnyHyperlinks để thu thập các container siêu liên kết, bao gồm cả các liên kết phần văn bản, trước khi thay đổi chúng. Ví dụ dưới đây xóa cả hai kiểu kích hoạt khỏi slide đầu tiên. Để xóa chỉ một kiểu, gọi chỉ RemoveHyperlinkClick hoặc RemoveHyperlinkMouseOver; việc xóa hành động nhấp không xóa đối tác di chuộ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.");
}
Đối với việc xóa không điều kiện, RemoveAllHyperlinks xóa cả hai kiểu kích hoạt trong phạm vi đã chọn trong một lần gọi. Đối với việc dọn dẹp có chọn lọc và bao phủ các master, layout và ghi chú, xem Báo cáo, Làm sạch và Xác minh Siêu Liên Kết.
Xây Dựng Kho Lưu Trữ Siêu Liên Kết Đầy Đủ
Trước khi phân phối một bản trình bày, hãy kiểm kê các hành động tương tác cũng như các liên kết web của nó. GetAnyHyperlinks trả về các đối tượng IHyperlinkContainer, không phải danh sách phẳng các chuỗi URL. Kiểm tra cả HyperlinkClick và HyperlinkMouseOver trên mỗi container. Chúng là độc lập: cùng một container có thể hiển thị cả hai hành động, vì vậy một báo cáo đầy đủ có thể cần tới hai dòng cho mỗi container.
Quét chỉ các siêu liên kết ở cấp độ hình dạng có thể bỏ sót các liên kết gắn vào các phần văn bản. Thay vào đó, truy vấn phạm vi phù hợp và giữ lại các container được trả về để sau này bạn có thể cập nhật hoặc xóa các hành động của chúng.
Truy Vấn Phạm Vi Bản Trình Bày, Slide và Khung Văn Bản
Giao diện IHyperlinkQueries có sẵn thông qua IPresentation.HyperlinkQueries, IBaseSlide.HyperlinkQueries và ITextFrame.HyperlinkQueries. Mỗi phạm vi hỗ trợ cùng các truy vấn:
- GetHyperlinkClicks trả về các container có hành động nhấp.
- GetHyperlinkMouseOvers trả về các container có hành động di chuột.
- GetAnyHyperlinks trả về các container có một hoặc cả hai hành động.
Ví dụ dưới đây tạo hyperlink-audit-input.pptx với một liên kết nhấp ngoài, một liên kết di chuột tới tệp, điều hướng slide nội bộ, một liên kết di chuột văn bản và một hành động macro. Nó không thực thi bất kỳ hành động nào trong số này. Cùng ba truy vấn hoạt động ở mọi phạm vi; các đếm mô tả số container, không phải tổng hành động. Phạm vi khung văn bản loại trừ các liên kết của hình dạng bao quanh.
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}");
}
Trong ví dụ này, các truy vấn bản trình bày và slide mỗi báo cáo ba container nhấp, hai container di chuột và ba container có một trong hai hành động. Truy vấn khung văn bản báo cáo một container trong mỗi danh mục.
Phân Loại Hành Động và Đích Đến
Sử dụng IHyperlink.ActionType để giải thích một hành động trước khi giải thích đích đến của nó. Các giá trị HyperlinkActionType bao phủ nhiều hơn chỉ điều hướng web:
| Giời Trị | Ý Nghĩa cho việc kiểm toán |
|---|---|
Hyperlink |
Liên kết ngoài; kiểm tra URL và giao thức của nó. |
JumpSpecificSlide |
Điều hướng nội bộ tới một slide cụ thể. |
JumpFirstSlide, JumpPreviousSlide, JumpNextSlide, JumpLastSlide, JumpLastViewedSlide |
Điều hướng trình chiếu tích hợp, được giải quyết trong ngữ cảnh trình chiếu. |
JumpEndShow, StartCustomSlideShow |
Kết thúc buổi chiếu hiện tại hoặc bắt đầu một buổi chiếu tùy chỉnh. |
StartMacro |
Thực thi macro. |
StartProgram |
Khởi chạy chương trình. |
OpenFile, OpenPresentation |
Mở tệp hoặc bản trình bày khác; xem xét riêng biệt so với URL web. |
StartStopMedia |
Bắt đầu hoặc dừng phát phương tiện. |
NoAction, Unknown |
Không có hành động điều hướng, hoặc một hành động không xác định cần xem xét. |
Đọc các đích đến bên ngoài từ ExternalUrl và các đích đến nội bộ cụ thể từ TargetSlide. Các hành động nội bộ và các lệnh tích hợp có thể không có URL bên ngoài; một URL trống không có nghĩa là container không có hành động. Giữ lại ExternalUrlOriginal khi nó khác URL đã chuẩn hoá, và bao gồm Tooltip nếu có.
Báo Cáo, Làm Sạch và Xác Minh Siêu Liên Kết
Ví dụ .NET 6+ dưới đây đọc một bản trình bày hiện có (sử dụng tệp đã tạo ở trên), ghi hyperlink-audit.json, áp dụng một chính sách, lưu hyperlink-sanitized.pptx, và mở lại để kiểm tra lại cả hai kiểu kích hoạt. Nó thu thập các container trước khi thay đổi chúng và sử dụng so sánh tham chiếu để tránh xử lý cùng một container hai lần. Các truy vấn bản trình bày bao gồm các slide thông thường; để có một kho lưu trữ toàn gói, nó cũng truy vấn một cách rõ ràng các master, layout, ghi chú và các master ghi chú và handout khi có.
Báo cáo ghi lại chỉ mục slide bắt đầu từ 1 và SlideId nếu có. ISlideComponent.Slide cung cấp slide sở hữu cho các container được hỗ trợ. Các master, layout và ghi chú không có chỉ mục slide thông thường và được xác định bằng phạm vi của chúng. Các container hình dạng và container định dạng phần văn bản được gắn nhãn riêng; các loại container khác giữ tên kiểu thời gian chạy của chúng. Mỗi container nhận một ID cục bộ trong báo cáo để hai hành động của nó có thể được liên kết.
Chính sách ứng dụng có mục đích hạn chế này chỉ cho phép các URL HTTPS tuyệt đối và các đích slide nội bộ hợp lệ. Nó từ chối macro, chương trình, hành động tệp, các hành động trình chiếu khác, hành động không xác định và các giao thức URL khác. Những sự từ chối này là quyết định chính sách, không phải là phán quyết an toàn của Aspose.Slides. Chỉ HTTPS không đủ để thiết lập niềm tin: hãy thêm danh sách trắng máy chủ và các kiểm tra khác cho ứng dụng của bạn. Cả URL bên ngoài gốc và đã chuẩn hoá đều được kiểm tra. Ví dụ kiểm toán siêu dữ liệu mà không theo dõi liên kết hoặc chạy hành động.
Để khắc phục, HyperlinkManager của container hỗ trợ SetExternalHyperlinkClick, RemoveHyperlinkClick và RemoveHyperlinkMouseOver. Ở đây, các liên kết nhấp ngoài bị cấm được thay thế bằng một trang đích HTTPS cố định; các nhấp ngoài và hành động di chuột bị cấm khác được xóa độc lập. Đặt replaceExternalClicks thành false để loại bỏ tất cả các vi phạm chính sách. Chọn một trang thay thế do ứng dụng sở hữu trước khi triển khai.
Thẻ xuất khẩu của báo cáo sử dụng chính sách xem xét PDF thận trọng: đánh dấu các hành động di chuột và bất kỳ thứ gì khác không phải là liên kết ngoài hoặc chuyển slide cụ thể là có khả năng không được hỗ trợ. Đây là gợi ý xem xét, không phải là kiểm tra năng lực hay bảo đảm các liên kết không được đánh dấu sẽ tồn tại khi xuất. Các xuất PDF và HTML được hỗ trợ PDF và HTML có thể giữ lại siêu liên kết, tùy thuộc vào hành động, tùy chọn xuất và trình xem. Các hình ảnh và video raster không thể giữ lại siêu liên kết tương tác; hãy đánh dấu mọi hành động khi kiểm toán cho các đầu ra đó.
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());
}
}
Với đầu vào được tạo ở trên, báo cáo chứa năm dòng hành động. Liên kết di chuột tệp và nhấp macro bị xóa, trong khi các liên kết HTTPS và điều hướng slide nội bộ vẫn còn. Việc xác minh in ra không có hành động bị cấm. Một đầu vào chứa URL nhấp ngoài bị cấm cũng thực hiện nhánh thay thế. Một container có nhấp cho phép và di chuột bị cấm vẫn giữ hành động nhấp.
Việc dọn dẹp có chọn lọc này khác với RemoveAllHyperlinks, vốn xóa cả hai kiểu kích hoạt trong toàn bộ phạm vi đã chọn bất kể chính sách. Việc xác minh ở đây chỉ kiểm tra các hành động siêu liên kết; nó không xóa các dự án VBA nhúng, đối tượng OLE hoặc nội dung hoạt động khác, và không xác thực tệp PDF hoặc HTML đã xuất.
Câu Hỏi Thường Gặp
Làm sao tôi có thể liên kết tới một phần hoặc slide đầu tiên của nó?
Các phần trong PowerPoint nhóm các slide, nhưng một siêu liên kết nội bộ nhắm tới một slide riêng lẻ. Để tạo điều hướng tới một phần, hãy liên kết tới slide đầu tiên trong phần đó.
Tôi có thể gắn siêu liên kết vào các thành phần slide master sao cho nó hoạt động trên mọi slide không?
Có. Các thành phần slide master và layout hỗ trợ siêu liên kết. Các liên kết trên các thành phần này sẽ khả dụng trong buổi trình chiếu trên các slide sử dụng master hoặc layout tương ứng.
Liên kết sẽ được giữ lại khi xuất sang PDF, HTML, hình ảnh hoặc video không?
Các xuất PDF và HTML được hỗ trợ có thể giữ lại siêu liên kết; các hình ảnh raster và video không thể. Xem các cân nhắc xuất trong Báo cáo, Làm sạch và Xác minh Siêu Liên Kết.