Skip to content

Commit 492184f

Browse files
authored
feat(PdfReader): add TwoPagesOnView function (#721)
* refactor: 增加两页视图 * Revert "refactor: 增加两页视图" This reverts commit b980542. * refactor: 增加 tow page one view 功能 * chore: bump version 10.0.1-beta04 * feat: 增加两页一视图方法 * feat: 增加联动功能 * refactor: 精简代码
1 parent 69d3be6 commit 492184f

6 files changed

Lines changed: 103 additions & 10 deletions

File tree

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

Lines changed: 5 additions & 2 deletions
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.1-beta01</Version>
4+
<Version>10.0.1-beta04</Version>
55
</PropertyGroup>
66

77
<PropertyGroup>
@@ -17,10 +17,13 @@
1717
</ItemGroup>
1818

1919
<ItemGroup>
20-
<ProjectReference Include="..\..\..\..\BootstrapBlazor\src\BootstrapBlazor\BootstrapBlazor.csproj" />
2120
<!--<PackageReference Include="BootstrapBlazor" Version="$(BBVersion)" />-->
2221
</ItemGroup>
2322

23+
<ItemGroup>
24+
<ProjectReference Include="..\..\..\..\BootstrapBlazor\src\BootstrapBlazor\BootstrapBlazor.csproj" />
25+
</ItemGroup>
26+
2427
<ItemGroup>
2528
<Using Include="Microsoft.JSInterop" />
2629
</ItemGroup>

src/components/BootstrapBlazor.PdfReader/PdfReader.razor

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,21 @@
2121
<div class="bb-view-icon bb-view-fit-width" @onclick="FitToWidth"><i class="fa-solid fa-arrows-left-right-to-line"></i></div>
2222
<div class="bb-view-icon bb-view-fit-rotate" @onclick="RotateLeft"><i class="fa-solid fa-rotate-left"></i></div>
2323
<div class="bb-view-icon bb-view-fit-rotate" @onclick="RotateRight"><i class="fa-solid fa-rotate-right"></i></div>
24-
<div class="bb-view-divider"></div>
25-
<div class="bb-view-icon bb-view-draw"><i class="fa-solid fa-pen-to-square"></i></div>
2624
</div>
2725
<div class="bb-view-controls">
2826
<div class="bb-view-icon bb-view-download"><i class="fa-solid fa-arrow-right-to-bracket fa-rotate-90"></i></div>
2927
<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>
28+
<Dropdown TValue="string" Color="Color.None" SkipValidate="true" ShowLabel="false"
29+
IsPopover="false" MenuAlignment="Alignment.Right" Icon="@MoreButtonIcon">
30+
<ItemsTemplate>
31+
@if (Options.ShowTwoPagesOnViewButton)
32+
{
33+
<div class="dropdown-item dropdown-item-pages" @onclick="OnToggleTwoPagesOneView"><i class="@_twoPagesOneViewIcon"></i><span>Two pages on view</span></div>
34+
<Divider></Divider>
35+
}
36+
<div class="dropdown-item"><i class="fa-solid fa-fw"></i><span>Document properties</span></div>
37+
</ItemsTemplate>
38+
</Dropdown>
3139
</div>
3240
</div>
3341
}

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

Lines changed: 27 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,8 @@ public partial class PdfReader
3844
private uint _currentPage;
3945
private string? _url;
4046
private string? _currentScale;
47+
private bool _enableTwoPagesOneView;
48+
private string? _twoPagesOneViewIcon;
4149

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

@@ -82,6 +90,14 @@ private void SetCurrentScale(string value)
8290
}
8391
}
8492

93+
private void OnToggleTwoPagesOneView()
94+
{
95+
_enableTwoPagesOneView = !_enableTwoPagesOneView;
96+
Options.EnableTwoPagesOnView = _enableTwoPagesOneView;
97+
98+
_twoPagesOneViewIcon = _enableTwoPagesOneView ? "fa-solid fa-fw fa-check" : "fa-solid fa-fw";
99+
}
100+
85101
/// <summary>
86102
/// <inheritdoc/>
87103
/// </summary>
@@ -96,6 +112,9 @@ protected override void OnParametersSet()
96112
Options.CurrentPage = 1;
97113
}
98114
_docTitle = Path.GetFileName(Options.Url);
115+
116+
MoreButtonIcon ??= "fa-solid fa-ellipsis-vertical";
117+
_twoPagesOneViewIcon ??= "fa-solid fa-fw";
99118
}
100119

101120
/// <summary>
@@ -113,6 +132,7 @@ protected override async Task OnAfterRenderAsync(bool firstRender)
113132
_currentPage = Options.CurrentPage;
114133
_url = Options.Url;
115134
_currentScale = Options.CurrentScale;
135+
_enableTwoPagesOneView = Options.EnableTwoPagesOnView;
116136
}
117137

118138
if (_url != Options.Url)
@@ -136,6 +156,11 @@ protected override async Task OnAfterRenderAsync(bool firstRender)
136156
_currentScale = Options.CurrentScale;
137157
await InvokeVoidAsync("scale", Id, _currentScale);
138158
}
159+
if (_enableTwoPagesOneView != Options.EnableTwoPagesOnView)
160+
{
161+
_currentScale = Options.CurrentScale;
162+
await InvokeVoidAsync("setPages", Id, _enableTwoPagesOneView);
163+
}
139164
}
140165

141166
/// <summary>
@@ -147,7 +172,8 @@ protected override async Task OnAfterRenderAsync(bool firstRender)
147172
Options.Url,
148173
Options.IsFitToPage,
149174
TriggerPagesInit = Options.OnInitAsync != null,
150-
TriggerPageChanged = Options.OnPageChangedAsync != null
175+
TriggerPageChanged = Options.OnPageChangedAsync != null,
176+
TriggerTowPagesOnViewChanged = Options.OnTwoPagesOneViewAsync != null
151177
});
152178

153179
/// <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: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -102,13 +102,25 @@ 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+
if (enableTowPagesOnView) {
109+
pdfViewer.spreadMode = 1;
110+
}
111+
else {
112+
pdfViewer.spreadMode = 0;
113+
}
114+
}
115+
}
116+
105117
const addEventListener = (el, pdfViewer, eventBus, invoke, options) => {
106118
eventBus.on("pagesinit", async () => {
107119
if (options.isFitToPage) {
108120
pdfViewer.currentScaleValue = "page-width";
109121
}
110122
else {
111-
pdfViewer.currentScaleValue = 1.0;
123+
pdfViewer.currentScaleValue = "page-actual";
112124
}
113125

114126
const numPages = pdfViewer.pagesCount;
@@ -149,6 +161,18 @@ const addEventListener = (el, pdfViewer, eventBus, invoke, options) => {
149161

150162
EventHandler.on(minus, "click", e => updateScale(pdfViewer, e.target, -1));
151163
EventHandler.on(plus, "click", e => updateScale(pdfViewer, e.target, 1));
164+
165+
const towPagesOneView = el.querySelector(".dropdown-item-pages");
166+
if (towPagesOneView) {
167+
EventHandler.on(towPagesOneView, "click", e => {
168+
if (pdfViewer.spreadMode === 0) {
169+
pdfViewer.spreadMode = 1;
170+
}
171+
else {
172+
pdfViewer.spreadMode = 0;
173+
}
174+
});
175+
}
152176
}
153177

154178
const updateScale = (pdfViewer, button, rate) => {
@@ -159,7 +183,7 @@ const updateScale = (pdfViewer, button, rate) => {
159183
const scale = pdfViewer.currentScale;
160184
const current = Math.round(parseFloat(scale * 100), 0);
161185
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);
186+
const findValues = step.filter(s => rate > 0 ? current < s : current > s);
163187
let v = 100;
164188
if (rate > 0) {
165189
v = findValues.shift();
@@ -177,7 +201,16 @@ export function dispose(id) {
177201
if (el) {
178202
const minus = el.querySelector(".bb-page-minus");
179203
const plus = el.querySelector(".bb-page-plus");
180-
EventHandler.off(minus, "click");
181-
EventHandler.off(plus, "click");
204+
if (minus) {
205+
EventHandler.off(minus, "click");
206+
}
207+
if (plus) {
208+
EventHandler.off(plus, "click");
209+
}
210+
211+
const towPagesOneView = el.querySelector(".dropdown-item-pages");
212+
if (towPagesOneView) {
213+
EventHandler.off(towPagesOneView, "click");
214+
}
182215
}
183216
}

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 ShowTwoPagesOnViewButton { 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)