-
-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathPdfViewer.razor.cs
More file actions
151 lines (130 loc) · 4.58 KB
/
PdfViewer.razor.cs
File metadata and controls
151 lines (130 loc) · 4.58 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
// Copyright (c) Argo Zhang (argo@163.com). All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
// Website: https://www.blazor.zone or https://argozhang.github.io/
using Microsoft.AspNetCore.Components;
namespace BootstrapBlazor.Components;
/// <summary>
/// <para lang="zh">PdfViewer 组件</para>
/// <para lang="en">PdfViewer component for displaying PDF files in a Blazor application</para>
/// </summary>
public partial class PdfViewer
{
/// <summary>
/// <para lang="zh">获得/设置 文档 Url 属性</para>
/// <para lang="en">Gets or sets the url for the PDF file to be displayed</para>
/// </summary>
[Parameter]
public string? Url { get; set; }
/// <summary>
/// <para lang="zh">获得/设置 页码索引</para>
/// <para lang="en">Gets or sets the page index of the PDF file</para>
/// </summary>
[Parameter]
public int PageIndex { get; set; }
/// <summary>
/// <para lang="zh">获得/设置 查看器高度</para>
/// <para lang="en">Gets or sets the viewer height</para>
/// </summary>
[Parameter]
public string? Height { get; set; }
/// <summary>
/// <para lang="zh">获得/设置 文档加载完成回调事件</para>
/// <para lang="en">Gets or sets the document loaded event callback</para>
/// </summary>
[Parameter]
public Func<Task>? OnLoaded { get; set; }
/// <summary>
/// <para lang="zh">获得/设置 文档不支持回调事件</para>
/// <para lang="en">Gets or sets the document not supported event callback</para>
/// </summary>
[Parameter]
public Func<Task>? NotSupportCallback { get; set; }
/// <summary>
/// <para lang="zh">获得/设置 是否使用 Google Docs 渲染 PDF</para>
/// <para lang="en">Gets or sets whether to use Google Docs for PDF rendering</para>
/// </summary>
[Parameter]
public bool UseGoogleDocs { get; set; }
/// <summary>
/// <para lang="zh">获得/设置 是否显示工具栏与缩略图侧边栏</para>
/// <para lang="en">Gets or sets whether to display toolbar and thumbnail sidebar</para>
/// </summary>
[Parameter]
public bool ShowToolbar { get; set; } = true;
[Inject, NotNull]
private NavigationManager? NavigationManager { get; set; }
private string? ClassString => CssBuilder.Default("bb-pdf-viewer-container")
.AddClassFromAttributes(AdditionalAttributes)
.Build();
private string? StyleString => CssBuilder.Default()
.AddClass($"--bb-pdf-viewer-height: {Height};", !string.IsNullOrEmpty(Height))
.Build();
private string? UseGoogleDocsString => UseGoogleDocs ? "true" : null;
/// <summary>
/// <inheritdoc/>
/// </summary>
/// <param name="firstRender"></param>
protected override async Task OnAfterRenderAsync(bool firstRender)
{
await base.OnAfterRenderAsync(firstRender);
if (!firstRender)
{
await InvokeVoidAsync("loadPdf", Id, GetAbsoluteUri(Url));
}
}
/// <summary>
/// <inheritdoc/>
/// </summary>
protected override Task InvokeInitAsync() => InvokeVoidAsync("init", Id, Interop, new
{
LoadedCallaback = nameof(TriggerOnLoaded),
NotSupportCallback = nameof(TriggerNotSupportCallback),
Url = GetAbsoluteUri(Url)
});
private string GetAbsoluteUri(string? url)
{
if (string.IsNullOrEmpty(url))
{
return string.Empty;
}
var uri = NavigationManager.ToAbsoluteUri(url);
var builder = new UriBuilder(uri.AbsoluteUri);
builder.Fragment = BuildFragment(builder);
return builder.Uri.ToString();
}
private string BuildFragment(UriBuilder builder)
{
var fragments = new List<string>();
if (PageIndex > 0)
{
fragments.Add($"page={PageIndex}");
}
if (!ShowToolbar)
{
fragments.Add("toolbar=0&navpanes=0");
}
return string.Join('&', fragments);
}
/// <summary>
/// Trigger OnLoaded callback when the PDF document is loaded.
/// </summary>
[JSInvokable]
public async Task TriggerOnLoaded()
{
if (OnLoaded != null)
{
await OnLoaded();
}
}
/// <summary>
/// Trigger NotSupportCallback when the PDF viewer does not support the document.
/// </summary>
[JSInvokable]
public async Task TriggerNotSupportCallback()
{
if (NotSupportCallback != null)
{
await NotSupportCallback();
}
}
}