Skip to content

Commit 950e6e6

Browse files
committed
feat: 增加两页一视图方法
1 parent dc35378 commit 950e6e6

5 files changed

Lines changed: 80 additions & 5 deletions

File tree

src/components/BootstrapBlazor.PdfReader/PdfReader.razor

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,15 @@
2727
<div class="bb-view-controls">
2828
<div class="bb-view-icon bb-view-download"><i class="fa-solid fa-arrow-right-to-bracket fa-rotate-90"></i></div>
2929
<div class="bb-view-icon bb-view-print"><i class="fa-solid fa-print"></i></div>
30-
<div class="bb-view-icon bb-view-home"><i class="fa-solid fa-flag"></i></div>
30+
<Dropdown TValue="string" Color="Color.None" SkipValidate="true" ShowLabel="false"
31+
IsPopover="true" Icon="@MoreButtonIcon">
32+
<ItemsTemplate>
33+
@if (Options.ShowTowPagesOnViewButton)
34+
{
35+
<div class="dropdown-item dropdown-item-pages">Two pages on view</div>
36+
}
37+
</ItemsTemplate>
38+
</Dropdown>
3139
</div>
3240
</div>
3341
}

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

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,12 @@ public partial class PdfReader
2020
[NotNull]
2121
public PdfReaderOptions? Options { get; set; }
2222

23+
/// <summary>
24+
/// 获得/设置 更多按钮图标 默认为 null 使用内置图标
25+
/// </summary>
26+
[Parameter]
27+
public string? MoreButtonIcon { get; set; }
28+
2329
private string? ClassString => CssBuilder.Default("bb-pdf-reader")
2430
.AddClassFromAttributes(AdditionalAttributes)
2531
.Build();
@@ -38,6 +44,7 @@ public partial class PdfReader
3844
private uint _currentPage;
3945
private string? _url;
4046
private string? _currentScale;
47+
private bool _enableTwoPagesOnView;
4148

4249
private readonly HashSet<string> AllowedScaleValues = ["page-actual", "page-width", "page-height", "page-fit", "auto"];
4350

@@ -96,6 +103,8 @@ protected override void OnParametersSet()
96103
Options.CurrentPage = 1;
97104
}
98105
_docTitle = Path.GetFileName(Options.Url);
106+
107+
MoreButtonIcon ??= "fa-solid fa-ellipsis-vertical";
99108
}
100109

101110
/// <summary>
@@ -113,6 +122,7 @@ protected override async Task OnAfterRenderAsync(bool firstRender)
113122
_currentPage = Options.CurrentPage;
114123
_url = Options.Url;
115124
_currentScale = Options.CurrentScale;
125+
_enableTwoPagesOnView = Options.EnableTwoPagesOnView;
116126
}
117127

118128
if (_url != Options.Url)
@@ -136,6 +146,11 @@ protected override async Task OnAfterRenderAsync(bool firstRender)
136146
_currentScale = Options.CurrentScale;
137147
await InvokeVoidAsync("scale", Id, _currentScale);
138148
}
149+
if (_enableTwoPagesOnView != Options.EnableTwoPagesOnView)
150+
{
151+
_currentScale = Options.CurrentScale;
152+
await InvokeVoidAsync("setPages", Id, _enableTwoPagesOnView);
153+
}
139154
}
140155

141156
/// <summary>
@@ -147,7 +162,8 @@ protected override async Task OnAfterRenderAsync(bool firstRender)
147162
Options.Url,
148163
Options.IsFitToPage,
149164
TriggerPagesInit = Options.OnInitAsync != null,
150-
TriggerPageChanged = Options.OnPageChangedAsync != null
165+
TriggerPageChanged = Options.OnPageChangedAsync != null,
166+
TriggerTowPagesOnViewChanged = Options.OnTwoPagesOneViewAsync != null
151167
});
152168

153169
/// <summary>

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,14 @@
1818
visibility: hidden;
1919
}
2020

21+
.bb-view-toolbar ::deep .btn {
22+
--bs-btn-color: #fff;
23+
}
24+
25+
.bb-view-toolbar ::deep .dropdown-toggle::after {
26+
content: none;
27+
}
28+
2129
.bb-view-title {
2230
display: flex;
2331
align-items: center;

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

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,13 @@ export function scale(id, scale) {
102102
}
103103
}
104104

105+
export function setPages(id, enableTowPagesOnView) {
106+
const { el, pdfViewer } = Data.get(id);
107+
if (pdfViewer) {
108+
pdfViewer.spreadMode = 1;
109+
}
110+
}
111+
105112
const addEventListener = (el, pdfViewer, eventBus, invoke, options) => {
106113
eventBus.on("pagesinit", async () => {
107114
if (options.isFitToPage) {
@@ -149,6 +156,18 @@ const addEventListener = (el, pdfViewer, eventBus, invoke, options) => {
149156

150157
EventHandler.on(minus, "click", e => updateScale(pdfViewer, e.target, -1));
151158
EventHandler.on(plus, "click", e => updateScale(pdfViewer, e.target, 1));
159+
160+
const towPagesOneView = el.querySelector(".dropdown-item-pages");
161+
if (towPagesOneView) {
162+
EventHandler.on(towPagesOneView, "click", e => {
163+
if (pdfViewer.spreadMode === 0) {
164+
pdfViewer.spreadMode = 1;
165+
}
166+
else {
167+
pdfViewer.spreadMode = 0;
168+
}
169+
});
170+
}
152171
}
153172

154173
const updateScale = (pdfViewer, button, rate) => {
@@ -159,7 +178,7 @@ const updateScale = (pdfViewer, button, rate) => {
159178
const scale = pdfViewer.currentScale;
160179
const current = Math.round(parseFloat(scale * 100), 0);
161180
const step = [25, 33, 50, 67, 75, 80, 90, 100, 110, 125, 150, 175, 200, 250, 300, 400, 500];
162-
const findValues = step.filter(s => rate > 0 ? current < s : current > s);
181+
const findValues = step.filter(s => rate > 0 ? current < s : current > s);
163182
let v = 100;
164183
if (rate > 0) {
165184
v = findValues.shift();
@@ -177,7 +196,16 @@ export function dispose(id) {
177196
if (el) {
178197
const minus = el.querySelector(".bb-page-minus");
179198
const plus = el.querySelector(".bb-page-plus");
180-
EventHandler.off(minus, "click");
181-
EventHandler.off(plus, "click");
199+
if (minus) {
200+
EventHandler.off(minus, "click");
201+
}
202+
if (plus) {
203+
EventHandler.off(plus, "click");
204+
}
205+
206+
const towPagesOneView = el.querySelector(".dropdown-item-pages");
207+
if (towPagesOneView) {
208+
EventHandler.off(towPagesOneView, "click");
209+
}
182210
}
183211
}

src/components/BootstrapBlazor.PdfReader/PdfReaderOptions.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,16 @@ public class PdfReaderOptions
3939
/// </summary>
4040
public bool IsFitToPage { get; set; }
4141

42+
/// <summary>
43+
/// 获得/设置 是否显示双页单视图按钮 默认 true 显示
44+
/// </summary>
45+
public bool ShowTowPagesOnViewButton { get; set; } = true;
46+
47+
/// <summary>
48+
/// 获得/设置 是否启用双页单视图模式 默认 false
49+
/// </summary>
50+
public bool EnableTwoPagesOnView { get; set; }
51+
4252
/// <summary>
4353
/// 页面初始化回调方法
4454
/// </summary>
@@ -48,4 +58,9 @@ public class PdfReaderOptions
4858
/// 页面初始化回调方法
4959
/// </summary>
5060
public Func<uint, Task>? OnPageChangedAsync { get; set; }
61+
62+
/// <summary>
63+
/// 设置双页单视图模式回调方法
64+
/// </summary>
65+
public Func<bool, Task>? OnTwoPagesOneViewAsync { get; set; }
5166
}

0 commit comments

Comments
 (0)