如何在 blazor wasm 中创建可供下载的 pdf

2024-03-28

在 blazor wasm 中,我想创建一个 pdf 并使其可下载。我测试过pdfflow https://www.pdfflow.io/,但只能使其在控制台应用程序中运行。有几种商业解决方案(devexpress、syncfusion),但它们确实很昂贵。 接下来我就跨过博文了使用 html 模板和 Playwright 生成 PDF 文件 https://www.meziantou.net/generate-pdf-files-using-an-html-template-and-playwright.htm,这对我来说似乎很有希望。不幸的是,它不包含完整的示例,我无法让它运行。这是我尝试过的: 我将 template.html 添加到 wwwroot 文件夹中。

模板.html

<!DOCTYPE html>
<html>
<head>
    <link rel="stylesheet" href="invoice.css">
</head>
<body style="padding: 3rem">
    <h1>Invoice</h1>
    Awesome company<br />
</body>
</html>

我添加了一个按钮,调用CreatePdf()。我从上面的链接复制了代码并根据我的需要进行了修改(并且因为例如没有提供方法 LoadOrder(orderId) )。

索引剃刀

@page "/"
@using Scriban
@using System.IO
@using Microsoft.Playwright
@inject HttpClient Http

<button class="btn btn-primary" @onclick="CreatePdf">pdf</button>

@code{ 
private async Task CreatePdf()
{
    //var templateContent = File.ReadAllText("template.html");
    var templateContent = await Http.GetStringAsync("template.html");
    var template = Template.Parse(templateContent);

    //var templateData = new { Invoice = LoadOrder(orderId) };
    //var pageContent = template.Render(templateData);
    var pageContent = "testString";

    //var dataUrl = "data:text/html;base64," + Convert.ToBase64String(Encoding.UTF8.GetBytes(pageContent));
    var dataUrl = "data:text/html;base64," + pageContent;

我添加了以下两行,因为未声明“浏览器”(来源自剧作家 https://playwright.dev/dotnet/docs/api/class-browser#browser-contexts).

// Here, the app crashes.
using var playwright = await Playwright.CreateAsync();
var browser = await playwright.Webkit.LaunchAsync();

await using var context = await browser.NewContextAsync();
var page = await context.NewPageAsync();
await page.GotoAsync(dataUrl, new PageGotoOptions { WaitUntil = WaitUntilState.NetworkIdle });

var output = await page.PdfAsync(new PagePdfOptions
{
    Format = "A4",
    Landscape = false,
});

await File.WriteAllBytesAsync("output.pdf", output);
} }

我怎样才能让上面的代码运行?


您无法从浏览器(js / wasm)使用 Playwright。所以,你必须使用另一种解决方案。例如,您可以使用jsPDF https://artskydj.github.io/jsPDF/docs/jsPDF.html。这个库在将 html 转换为 pdf 时并不完美,但也许它适合您的使用。

添加一些脚本引用index.html使用 jsPDF(如果您愿意,也可以使用 npm 安装它们)

<script src="_framework/blazor.webassembly.js"></script>

<!-- jsPDF references -->
<script src="https://unpkg.com/jspdf@latest/dist/jspdf.umd.min.js"></script>
<script src="https://html2canvas.hertzen.com/dist/html2canvas.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected] /cdn-cgi/l/email-protection/dist/purify.min.js"></script>

创建文件wwwroot/HtmlToPdf.js包含以下内容:

export function generateAndDownloadPdf(htmlOrElement, filename) {
    const doc = new jspdf.jsPDF({
        orientation: 'p',
        unit: 'pt',
        format: 'a4'
    });

    return new Promise((resolve, reject) => {
        doc.html(htmlOrElement, {
            callback: doc => {
                doc.save(filename);
                resolve();
            }
        });
    });
}

export function generatePdf(htmlOrElement) {
    const doc = new jspdf.jsPDF();
    return new Promise((resolve, reject) => {
        doc.html(htmlOrElement, {
            callback: doc => {
                const output = doc.output("arraybuffer");
                resolve(new Uint8Array(output));
            }
        });
    });
}

然后,您可以使用 Razor 组件中的脚本:

@inject IJSRuntime JSRuntime

<button type="button" @onclick="DownloadPdf">Generate</button>

@code {
    async Task DownloadPdf()
    {
        await using var module = await JSRuntime.InvokeAsync<IJSObjectReference>("import", "./HtmlToPdf.js");

        // Generate and download the PDF
        await module.InvokeVoidAsync("generateAndDownloadPdf", "<h1>sample</h1>", "sample.pdf");

        // Generate the PDF and get its content as byte[] (need .NET 6 to support Uint8Array)
        var bytes = await module.InvokeAsync<byte[]>("generatePdf", "<h1>sample</h1>");
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 blazor wasm 中创建可供下载的 pdf 的相关文章

  • 如何确定 nsstring 的哪一部分适合矩形?

    这是关于使用核心图形进行 PDF 格式化 但当涉及到在两页上打印字符串时 它可能涉及任何类型的分页 我需要将一个字符串分散到几页上 对于较小的字符串 这不是真正的问题 对于那些我使用 NSString UIKit 扩展的人sizeWithF
  • 当我使用模板时,我的文字方向写错了

    我想使用 Rails 在现有 PDF 上添加文本 所以我这样做了 filename Rails root app assets images sample pdf Prawn Document generate Rails root app
  • 自定义“AuthenticationStateProvider”身份验证失败

    我创建了一个自定义ApiAuthenticationStateProvider返回后AuthenticationState仍在说明 info Microsoft AspNetCore Authorization DefaultAuthori
  • Python PyPDF2 合并旋转页面

    我正在使用Python报告实验室 https bitbucket org rptlab reportlab canvas 生成带有水印的覆盖文档 将其合并到源 pdf 文档中 带有PyPDF2 https github com mstamy
  • 使用 iTextSharp 实现 PDF 中的图像透明度

    我有一个传入的 jpg 文件 我可以将其颜色设置为透明 当我将图像添加到另一个图像时 效果非常好 我正在尝试使用 iTextSharp 将相同的图像添加到 PDF 但我无法使透明度发挥作用 我尝试了两种方法 但都不起作用 第一种方法是在位图
  • 使用适用于 Android 的 XSL-FO 生成 PDF

    是否可以使用 XSL FO 在 Android 应用程序中生成 PDF 下载 Apache FOP 并查看 Android 运行时中是否包含所需的依赖项 可能会比较慢 您可以使用 iText 或 PDFBox 来呈现 PDF 或者使用服务器
  • 动态 HTML 到 PDF [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我需要能够将动态 HTML 通过 javascript 在页面加载时呈现的 html 转换为 PDF 我
  • 如何在PDF BOX中创建按钮?

    我想在 PDFBOX 中创建一个按钮 即验证或重置按钮 它将调用 PDF 中嵌入 JavaScript 的某些功能 如何在 PDFBOX 中创建这样的按钮 我已尝试使用 PDPushButton 代码片段执行以下代码 但它现在可以正常工作
  • 合并两个 PDF

    import PyPDF2 import glob import os from fpdf import FPDF import shutil class MyPDF FPDF adding a footer containing the
  • Schmooze:: 使用 grover gem 转换 html2pdf 时处理失败+

    respond to do format format html format pdf do grover Grover new http localhost 3000 generate report format A4 pdf grove
  • Python Reportlab 中的动态帧大小

    我尝试生成一个发货清单报告实验室 questions tagged reportlab在Python中 我试图使用 Platypus 将所有部分 如发件人地址 收件人地址 表格 放在适当的位置Frames 第一个问题我遇到的问题是我需要很多
  • 为什么 Blazor 模板使用工厂来创建 HttpClient 实例

    当处置HttpClient 可能会遇到 套接字耗尽 的情况problem https learn microsoft com en us dotnet architecture microservices implement resilie
  • 将 Highcharts 导出为 PDF(使用 javascript 和本地服务器 - 无互联网连接)

    我在我的应用程序中使用 Highcharts 没有任何互联网连接 我的 html 页面上有多个图表 我想生成一个包含该页面中所有图表的 PDF 报告 我怎样才能做到这一点而不将数据发送到互联网上的任何服务器 我将感谢您提供的任何帮助或任何示
  • 免费 RTF 转 PDF .NET 组件或工具? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我正在尝试将 RTF 文件转换为 PDF 到目前为止我发现的所有工具都花了很多钱 是否有我可以调用的工具或组件可以将现有 RTF 文件转换为 PDF
  • 在 Blazor 中以编程方式注册页面,而不是使用 LazyAssemblyLoader 使用 @page 指令

    目前我加载程序集OnNavigateAsync包含带有 page 指令的 Razor 页面的事件 例如 page extrapage 并且工作正常 例如 我想以编程方式声明路由页面 而不声明 page并且 代替这个 使用Dictionary
  • 使用 pdfkit 和 FastAPI 下载 PDF 文件

    我将使用 FastAPI 创建一个 API 将HTML页面到 PDF 文件 使用pdfkit 但是 它将文件保存到我的本地磁盘 当我在线提供此API后 用户如何将该PDF文件下载到他们的计算机上 from typing import Opt
  • 如何使用 iTextSharp 插入 HTML 标记以使用 C# 创建 PDF?

    I am new to iTextSharp API to create PDF I want to Create the a PDF similar shown in following image I have added Table
  • 使用 JavaScript 生成 PDF 文件

    我正在尝试将 XML 数据从网页转换为 PDF 文件 并且希望能够完全在 JavaScript 中完成此操作 我需要能够绘制文本 图像和简单的形状 我希望能够完全在浏览器中完成此操作 我刚刚写了一个名为jsPDF https github
  • 邪恶的pdf在两页上渲染最后一行

    我在用邪恶 pdf https github com mileszs wicked pdf生成 pdf 我面临的问题是 有时它会跨两页显示页面中的最后一行 如果 wicked pdf 无法容纳该页面中的整个行 或者对页面中的行数设置限制 有
  • TCPDF 为一个文档中的不同页面设置不同的页眉

    有没有办法使文档中第一页的页眉徽标和第二页的页眉徽标不同 我认为在添加页面之间更改标题数据可能会解决问题 但在我的测试中 添加第一页后设置标题似乎没有效果 other stuff pdf gt setHeaderFont array PDF

随机推荐

  • 如何使用 Python 在网格中创建 10 个随机 x、y 坐标

    我需要创建一个 8x8 网格 并将 10 个硬币分布在网格上的随机位置 我面临的问题是 randint 函数有时会生成相同的随机坐标 因此只生成 9 或 8 个硬币并放置在网格上 我怎样才能确保这种情况不会发生 干杯 这是我到目前为止的代码
  • 在 SpannableStringBuilder 中对齐位图

    如何将位图与 SpannableString 中的文本对齐 SpannableStringBuilder ssb new SpannableStringBuilder arr messages get position String msg
  • CloudFront 分配未显示为 Route53 别名目标

    我正在尝试添加指向我的 Cloudfront 分发的路线 53 记录集 但是 当我在路由 53 中选择 创建记录集 并单击后续面板中的别名目标时 未列出云前端分布 我得到的只是 没有可用的目标 我的发行版已创建并已启用 并且正在运行 我已在
  • ChromeDriver 2.33 的 driver.manage().window().maximize() 问题

    ChromeDriver 2 33 的发行说明表示 修复了导致调整大小 定位窗口命令在 Chrome 62 上失败的错误 但是当我使用 Chrome 62 浏览器时这似乎仍然是一个问题 使用 chrome 驱动程序最大化 chrome 窗口
  • 如何在 PHP 中设置 $PATH?

    我目前正在开发自己的小项目 但有一个小问题 我想将 PATH 环境变量设置为 bin 这样当我使用exec 和类似的功能 它只会搜索该目录中的二进制文件 除非我明确告诉它 我已经尝试过了putenv 除非我启用了安全模式 否则它将无法工作
  • Elasticsearch - 如果术语出现频率越高,得分越高

    我有 2 个文档 正在搜索关键字 Twitter 假设两个文档都是带有 标签 字段的博客文章 文档 A 在 标签 字段中只有 1 个术语 它是 Twitter 文档 B 在 标签 字段中有 100 个术语 但其中 3 个是 Twitter
  • Erlang 代码的持续集成服务器

    您使用什么类型的敏捷工具进行 Erlang 开发 什么持续集成 http en wikipedia org wiki Continuous integration您使用 CI 服务器来构建 Erlang 代码吗 我得到的唯一参考来自 Quo
  • Maven 中央存储库的官方镜像有哪些?

    有谁知道是否有已知 和工作的 Maven 中央存储库 http repo1 maven org maven2 镜像的列表 如果没有 当中央存储库关闭时您使用什么镜像 这是取自 rvxnet 的答案 以及为什么仅链接答案不可取的示例 我从20
  • Tomcat 的接受计数

    我对Tomcat有以下问题acceptCount 它说 当所有传入连接请求的最大队列长度 可能的请求处理线程正在使用中 收到的任何请求 当队列已满时将被拒绝 默认值为 10 我不确定这是如何运作的 我的意思是我知道有一个单独的 TCP 队列
  • QScreenRayCaster 未找到实体。我做错了什么?

    Qt3D 中新 QScreenRayCaster 的描述看起来正是我想要使用的 但我无法让它为我工作 我想在初始化中我需要做一些事情 但我在网上找不到任何示例来为我指明正确的方向 我编写了一个非常简单的程序来测试该功能 它在窗口的中心绘制一
  • Spring Security 将 URL 参数传递给身份验证提供程序

    有没有办法将 URL 参数传递给 Spring Security 3 中的身份验证提供程序 我们的登录页面需要接收电子邮件令牌作为参数 身份验证系统在设置用户状态时需要了解该参数 具体来说 它将允许具有正确令牌的用户登录 否则该用户将无法登
  • Pandas 根据拆分另一列添加新列

    我有一个如下所示的 pandas 数据框 A B US 65 AMAZON 2016 US 65 EBAY 2016 我的目标是看起来像这样 A B country code com US 65 AMAZON 2016 US 65 AMAZ
  • PE 文件中的 OSMajor 和 OSMinor 版本号

    最近我偶然发现了一个奇怪的现象 我正在为 PE 文件构建一个转储程序 很好地阅读了节标题和 可选 节标题 现在 当我到达 OS Major 和 OS Minor 字段时 我注意到一个奇怪的值 WORD OS VERSION major 0x
  • 我应该在 URL 中使用重音字符吗?

    当用英语以外的语言创建网页内容时 搜索引擎优化和用户友好 URL 的问题就会出现 我想知道在 URL 中使用去重音字母是否是最佳实践 冒着某些单词在有或没有某些重音的情况下具有完全不同含义的风险 或者最好坚持使用非英语字符在不太高级的环境
  • CCAvenue:“解密应用程序请求时出错!”

    我正在尝试将 CCAvenue 支付网关集成到我用 swift 4 开发的 iOS 应用程序中 我正进入 状态 错误 解密应用程序请求时出现问题 我已检查以下网址给出的答案 https stackoverflow com a 3732712
  • codegen 和标量结构参数

    Codegen 命令如下 codegen config dll ep1 args single 0 ep2 args 0 0 对于这样的函数来说很容易 function y ep1 u codegen y u function y ep2
  • Python基线校正库

    我目前正在处理一些拉曼光谱数据 并且正在尝试纠正由花期偏差引起的数据 看看下面的图表 我已经非常接近实现我想要的了 正如您所看到的 我试图在所有数据中拟合多项式 而我实际上应该在局部最小值处拟合多项式 理想情况下 我想要一个多项式拟合 当从
  • 如何确定 rspec 控制器测试的主题?

    所以除了好奇之外 我没有什么充分的理由需要知道这一点 最好的理由 但我不确定这里发生了什么 背景 我正在研究 RSpec 书并更新示例 第 24 章 Rails 控制器有一个消息控制器的测试 spec controllers message
  • .NET 结构中的成员相等测试使用什么算法?

    NET 结构中的成员相等测试使用什么算法 我想知道这一点 以便我可以将其用作我自己的算法的基础 我正在尝试为任意对象 在 C 中 编写递归成员相等测试 以测试 DTO 的逻辑相等性 如果 DTO 是结构 则这会容易得多 因为 ValueTy
  • 如何在 blazor wasm 中创建可供下载的 pdf

    在 blazor wasm 中 我想创建一个 pdf 并使其可下载 我测试过pdfflow https www pdfflow io 但只能使其在控制台应用程序中运行 有几种商业解决方案 devexpress syncfusion 但它们确