Skip to content

Commit 0db83d7

Browse files
authored
feat(Mermaid): add DownloadPdfAsync method (#705)
* chore: updated to version 11.12.1 * chore: bump version 10.0.1 * doc: 代码格式化 * feat: 增加导出 Pdf 方法
1 parent 4eae11b commit 0db83d7

4 files changed

Lines changed: 963 additions & 409 deletions

File tree

src/components/BootstrapBlazor.Mermaid/BootstrapBlazor.Mermaid.csproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
<Project Sdk="Microsoft.NET.Sdk.Razor">
22

3+
<PropertyGroup>
4+
<Version>10.0.1</Version>
5+
</PropertyGroup>
6+
37
<PropertyGroup>
48
<PackageTags>Bootstrap Blazor WebAssembly wasm UI Components Mermaid</PackageTags>
59
<Description>Bootstrap UI components extensions of Mermaid</Description>

src/components/BootstrapBlazor.Mermaid/Mermaid.razor.cs

Lines changed: 45 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright (c) Argo Zhang (argo@163.com). All rights reserved.
1+
// Copyright (c) BootstrapBlazor & Argo Zhang (argo@live.ca). All rights reserved.
22
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
33
// Website: https://www.blazor.zone or https://argozhang.github.io/
44

@@ -37,6 +37,12 @@ public partial class Mermaid
3737
[Parameter]
3838
public string? Title { set; get; }
3939

40+
[Inject, NotNull]
41+
private IHtml2Pdf? Html2PdfService { get; set; }
42+
43+
[Inject, NotNull]
44+
private DownloadService? DownloadService { get; set; }
45+
4046
private string? ClassString => CssBuilder.Default("bb-mermaid mermaid")
4147
.AddClassFromAttributes(AdditionalAttributes)
4248
.Build();
@@ -48,7 +54,8 @@ public partial class Mermaid
4854
protected override async Task OnParametersSetAsync()
4955
{
5056
await base.OnParametersSetAsync();
51-
await MermaidChanged();
57+
58+
await Render();
5259
}
5360

5461
/// <summary>
@@ -58,21 +65,53 @@ protected override async Task OnParametersSetAsync()
5865
protected override Task InvokeInitAsync() => InvokeVoidAsync("init", Id, BuildDiagramText());
5966

6067
/// <summary>
61-
/// 内容改变时重新渲染mermaid
68+
/// 内容改变时重新渲染 mermaid
6269
/// </summary>
63-
/// <returns></returns>
70+
[Obsolete("已弃用,请使用 Render 代替; Deprecated; please use Render instead.")]
71+
[ExcludeFromCodeCoverage]
6472
public Task MermaidChanged() => InvokeVoidAsync("init", Id, BuildDiagramText());
6573

74+
/// <summary>
75+
/// 内容改变时重新渲染 mermaid
76+
/// </summary>
77+
public Task Render() => InvokeVoidAsync("render", Id, BuildDiagramText());
78+
6679
/// <summary>
6780
/// 导出图为 base64 字符串
6881
/// </summary>
6982
/// <returns>base64 string of the diagram</returns>
7083
public Task<string?> ExportBase64MermaidAsync() => InvokeAsync<string>("getContent", Id);
7184

7285
/// <summary>
73-
/// 构造 Mermaid 代码
86+
/// 导出图为 Pdf 文档流
7487
/// </summary>
75-
/// <returns></returns>
88+
public async Task<Stream?> ExportPdfAsync(CancellationToken token = default)
89+
{
90+
Stream? stream = null;
91+
var html = await InvokeAsync<string?>("getSvgHtml", token, Id);
92+
if (html != null)
93+
{
94+
stream = await Html2PdfService.PdfStreamFromHtmlAsync(html);
95+
}
96+
97+
return stream;
98+
}
99+
100+
/// <summary>
101+
/// 下载 Pdf 文档
102+
/// </summary>
103+
/// <returns>base64 string of the diagram</returns>
104+
public async Task DownloadPdfAsync(string fileName, CancellationToken token = default)
105+
{
106+
ArgumentNullException.ThrowIfNull(fileName);
107+
108+
var stream = await ExportPdfAsync(token);
109+
if (stream != null)
110+
{
111+
await DownloadService.DownloadFromStreamAsync(fileName, stream);
112+
}
113+
}
114+
76115
private string BuildDiagramText()
77116
{
78117
StringBuilder sb = new();

src/components/BootstrapBlazor.Mermaid/Mermaid.razor.js

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,20 @@
1-
import mermaid from './mermaid.min.js';
1+
import { addScript } from '../BootstrapBlazor/modules/utility.js'
22

33
export async function init(id, content) {
4+
await addScript('./_content/BootstrapBlazor.Mermaid/mermaid.min.js');
5+
6+
await render(id, content);
7+
}
8+
9+
export async function render(id, content) {
410
mermaid.initialize({ startOnLoad: false });
5-
const render = await mermaid.render(id + '-svg', content);
11+
const render = await mermaid.render(`${id}-svg`, content);
612
if (render) {
713
const el = document.getElementById(id);
8-
el.innerText = "";
914
el.innerHTML = render.svg;
1015
}
1116
}
17+
1218
export function getContent(id) {
1319
let svgDataUrl = "";
1420
const el = document.getElementById(id);
@@ -25,3 +31,13 @@ export function getContent(id) {
2531
}
2632
}
2733
}
34+
35+
export function getSvgHtml(id) {
36+
const el = document.getElementById(id);
37+
const svg = el.querySelector('svg');
38+
if (svg) {
39+
return svg.outerHTML;
40+
}
41+
42+
return "";
43+
}

0 commit comments

Comments
 (0)