Skip to content

Commit f3483f1

Browse files
committed
feat: 增加缩略图功能
1 parent 492184f commit f3483f1

5 files changed

Lines changed: 92 additions & 4 deletions

File tree

src/components/BootstrapBlazor.PdfReader/PdfReader.razor

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@
3939
</div>
4040
</div>
4141
}
42+
@if (Options.ShowThumbnails)
43+
{
44+
<div class="bb-view-thumbnails"></div>
45+
}
4246
<div class="bb-view-container">
4347
<div class="pdfViewer"></div>
4448
</div>

src/components/BootstrapBlazor.PdfReader/PdfReader.razor.cs

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,8 @@ protected override async Task OnAfterRenderAsync(bool firstRender)
171171
{
172172
Options.Url,
173173
Options.IsFitToPage,
174-
TriggerPagesInit = Options.OnInitAsync != null,
174+
TriggerPagesInit = Options.OnPagesInitAsync != null,
175+
TriggerPagesLoaded = Options.OnPagesLoadedAsync != null,
175176
TriggerPageChanged = Options.OnPageChangedAsync != null,
176177
TriggerTowPagesOnViewChanged = Options.OnTwoPagesOneViewAsync != null
177178
});
@@ -220,9 +221,22 @@ public async Task RotateRight()
220221
[JSInvokable]
221222
public async Task PagesInit(int pagesCount)
222223
{
223-
if (Options.OnInitAsync != null)
224+
if (Options.OnPagesInitAsync != null)
224225
{
225-
await Options.OnInitAsync(pagesCount);
226+
await Options.OnPagesInitAsync(pagesCount);
227+
}
228+
}
229+
230+
/// <summary>
231+
/// 页面加载完毕时回调方法
232+
/// </summary>
233+
/// <returns></returns>
234+
[JSInvokable]
235+
public async Task PagesLoaded(int pagesCount)
236+
{
237+
if (Options.OnPagesLoadedAsync != null)
238+
{
239+
await Options.OnPagesLoadedAsync(pagesCount);
226240
}
227241
}
228242

src/components/BootstrapBlazor.PdfReader/PdfReader.razor.css

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,31 @@
66
height: calc(var(--bb-pdf-view-height) + var(--bb-pdf-toolbar-height));
77
}
88

9+
.bb-view-thumbnails {
10+
position: absolute;
11+
top: var(--bb-pdf-toolbar-height);
12+
left: 0;
13+
bottom: 0;
14+
width: 300px;
15+
overflow: auto;
16+
z-index: 5;
17+
background-color: #28292a;
18+
padding: 1rem 0;
19+
}
20+
21+
::deep .bb-view-thumbnail-item {
22+
display: block;
23+
text-align: center;
24+
}
25+
26+
::deep .bb-view-thumbnail-item:not(:last-child) {
27+
margin-block-end: 1rem;
28+
}
29+
30+
::deep .bb-view-thumbnail-item img {
31+
width: 42%;
32+
}
33+
934
.bb-view-toolbar {
1035
height: var(--bb-pdf-toolbar-height);
1136
background-color: var(--bb-toolbar-background-color);

src/components/BootstrapBlazor.PdfReader/PdfReader.razor.js

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,25 @@ const addEventListener = (el, pdfViewer, eventBus, invoke, options) => {
139139
}
140140
});
141141

142+
eventBus.on("pagesloaded", async e => {
143+
const thumbnailsContainer = el.querySelector(".bb-view-thumbnails");
144+
pdfViewer.getPagesOverview().map(async (p, i) => {
145+
var page = await pdfViewer.pdfDocument.getPage(i + 1);
146+
var canvas = await makeThumb(page);
147+
var img = document.createElement("img");
148+
img.src = canvas.toDataURL();
149+
150+
var item = document.createElement("div");
151+
item.classList.add("bb-view-thumbnail-item");
152+
item.appendChild(img);
153+
thumbnailsContainer.appendChild(item);
154+
});
155+
156+
if (options.triggerPagesLoaded === true) {
157+
await invoke.invokeMethodAsync("PagesLoaded", e.pagesCount);
158+
}
159+
})
160+
142161
eventBus.on("pagechanging", async evt => {
143162
const page = evt.pageNumber;
144163
const pageNumberEl = el.querySelector(".bb-view-num");
@@ -194,6 +213,22 @@ const updateScale = (pdfViewer, button, rate) => {
194213
pdfViewer.currentScaleValue = v / 100;
195214
}
196215

216+
const makeThumb = page => {
217+
const outputScale = window.devicePixelRatio || 1;
218+
var vp = page.getViewport({ scale: 1 });
219+
var canvas = document.createElement("canvas");
220+
var scalesize = 1;
221+
canvas.width = vp.width * scalesize * outputScale;
222+
canvas.height = vp.height * scalesize * outputScale;
223+
224+
return page.render({
225+
canvasContext: canvas.getContext("2d"),
226+
viewport: page.getViewport({ scale: scalesize * outputScale })
227+
}).promise.then(function () {
228+
return canvas;
229+
})
230+
}
231+
197232
export function dispose(id) {
198233
Data.remove(id);
199234

src/components/BootstrapBlazor.PdfReader/PdfReaderOptions.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,11 @@ public class PdfReaderOptions
1414
/// </summary>
1515
public bool ShowToolbar { get; set; } = true;
1616

17+
/// <summary>
18+
/// 获得/设置 是否显示缩略图 默认 true 显示
19+
/// </summary>
20+
public bool ShowThumbnails { get; set; } = true;
21+
1722
/// <summary>
1823
/// 获得/设置 PDF 文档路径
1924
/// </summary>
@@ -52,7 +57,12 @@ public class PdfReaderOptions
5257
/// <summary>
5358
/// 页面初始化回调方法
5459
/// </summary>
55-
public Func<int, Task>? OnInitAsync { get; set; }
60+
public Func<int, Task>? OnPagesInitAsync { get; set; }
61+
62+
/// <summary>
63+
/// 页面加载完毕回调方法
64+
/// </summary>
65+
public Func<int, Task>? OnPagesLoadedAsync { get; set; }
5666

5767
/// <summary>
5868
/// 页面初始化回调方法

0 commit comments

Comments
 (0)