Skip to content

Commit bbb0d8f

Browse files
authored
feat(PdfReader): add load progress function (#819)
* feat: 增加进度样式 * chore: bump version 10.0.14 * refactor: 增加进度显示 * feat: 增加进度逻辑 * feat: 增加 revokeObjectURL 防止内存泄漏
1 parent ad68d1b commit bbb0d8f

4 files changed

Lines changed: 58 additions & 8 deletions

File tree

src/components/BootstrapBlazor.PdfReader/BootstrapBlazor.PdfReader.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk.Razor">
22

33
<PropertyGroup>
4-
<Version>10.0.13</Version>
4+
<Version>10.0.14</Version>
55
</PropertyGroup>
66

77
<PropertyGroup>

src/components/BootstrapBlazor.PdfReader/PdfReader.razor

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
@inherits BootstrapModuleComponentBase
44

55
<div @attributes="@AdditionalAttributes" id="@Id" class="@ClassString" style="@StyleString">
6+
<div class="bb-view-progress">
7+
<div class="bb-view-progress-bar"></div>
8+
</div>
69
<div class="bb-view-toolbar">
710
@if (ShowToolbar)
811
{

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

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -47,14 +47,12 @@ export async function setData(id, data) {
4747
return;
4848
}
4949

50-
const { options, objectUrl } = pdf;
51-
if (objectUrl) {
52-
URL.revokeObjectURL(objectUrl);
53-
}
50+
const objectUrl = createObjectURLFromByte(data);
51+
pdf.objectUrl = objectUrl;
5452

55-
options.url = createObjectURLFromByte(data);
53+
const { options } = pdf;
54+
options.url = objectUrl;
5655
options.data = null;
57-
pdf.objectUrl = options.url;
5856
await loadPdf(pdf);
5957
}
6058

@@ -125,8 +123,34 @@ export function resetThumbnails(id) {
125123
const loadPdf = async pdf => {
126124
const { el, invoke, options } = pdf;
127125
const loadingTask = pdfjsLib.getDocument(options);
126+
127+
const progressEl = el.querySelector('.bb-view-progress');
128+
if (progressEl) {
129+
progressEl.classList.add('show');
130+
}
131+
const bar = el.querySelector('.bb-view-progress-bar');
132+
if (bar) {
133+
bar.style.setProperty('--bb-view-progress-val', '0');
134+
}
135+
136+
let progressHandler = null;
128137
loadingTask.onProgress = function (progressData) {
138+
const { loaded, total } = progressData;
129139

140+
if (bar) {
141+
const val = loaded / total * 100;
142+
if (val > 100) {
143+
val = 100;
144+
}
145+
bar.style.setProperty('--bb-view-progress-val', `${val}%`);
146+
147+
if (progressHandler === null) {
148+
progressHandler = setTimeout(() => {
149+
clearTimeout(progressHandler);
150+
progressEl.classList.remove('show');
151+
}, 300);
152+
}
153+
}
130154
};
131155

132156
loadingTask.onPassword = function (updatePassword, reason) {
@@ -161,7 +185,11 @@ const loadPdf = async pdf => {
161185
}
162186

163187
const disposePdf = pdf => {
164-
const { el, observer, loadingTask } = pdf;
188+
const { el, observer, loadingTask, objectUrl } = pdf;
189+
if (objectUrl) {
190+
URL.revokeObjectURL(objectUrl);
191+
}
192+
165193
if (observer) {
166194
observer.disconnect();
167195
}

src/components/BootstrapBlazor.PdfReader/wwwroot/css/pdf_reader.css

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

11+
.bb-view-progress {
12+
position: absolute;
13+
top: 0;
14+
left: 0;
15+
right: 0;
16+
height: 0.25rem;
17+
}
18+
19+
.bb-view-progress:not(.show) {
20+
display: none;
21+
}
22+
23+
.bb-view-progress-bar {
24+
height: 100%;
25+
background-color: var(--bs-primary);
26+
width: var(--bb-view-progress-val, 0);
27+
transition: width .3s linear;
28+
}
29+
1130
.bb-view-toolbar {
1231
height: var(--bb-pdf-toolbar-height);
1332
background-color: var(--bb-toolbar-background-color);

0 commit comments

Comments
 (0)