Flutter web - 显示应用程序中生成的 pdf 文件。 (Uint8List格式)

2024-03-03

我正在开发一个 iOS/Android/Web 应用程序,我使用此处的 pdf 插件根据用户输入生成 PDF:https://pub.dev/packages/pdf https://pub.dev/packages/pdf。在 iOS 和 Android 上,我可以访问文件系统,因此我可以先保存生成的 pdf,然后使用任何 pdf 显示插件打开它。

然而,对于Flutter web,据我所知,无法访问任何类型的文件系统。我见过的所有 pdf 渲染插件都假设 pdf 文件存储在文件中或存储在网络上。 我在看:

  • flutter_full_pdf_viewer:^1.0.6
  • flutter_pdf_viewer:^0.6.1
  • pdf_渲染:^0.57.2

如何在 flutter web 上显示此应用程序生成的 pdf?有没有办法将 Uint8List 数据欺骗为文件,或者也许有另一种方法来解决这个问题? (我能想到的解决这个问题的唯一方法是在生成文件后将其上传到网络上以显示它,但这似乎有点过头了。)


我们不需要额外的插件就可以做到这一点,因为网络浏览器本身可以显示(或下载)pdf文档。

更新为 pdf 2.0.0 及更高版本

由于方法save https://pub.dev/documentation/pdf/latest/pdf/PdfDocument/save.html现在返回 Future,按钮处理程序变得异步(当然你可以使用未来建造者或者是其他东西)。

import 'dart:html' as html;
import 'package:flutter/material.dart';
import 'package:pdf/pdf.dart';
import 'package:pdf/widgets.dart' as pw;

class PdfLabPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final pdf = pw.Document();
    pdf.addPage(pw.Page(
        pageFormat: PdfPageFormat.a4,
        build: (pw.Context context) {
          return pw.Center(
            child: pw.Text('Hello World'),
          );
        }));

    return Scaffold(
      appBar: AppBar(),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: () async {
                final bytes = await pdf.save();
                final blob = html.Blob([bytes], 'application/pdf');
                final url = html.Url.createObjectUrlFromBlob(blob);
                html.window.open(url, '_blank');
                html.Url.revokeObjectUrl(url);
              },
              child: Text('Open'),
            ),
            ElevatedButton(
              onPressed: () async {
                final bytes = await pdf.save();
                final blob = html.Blob([bytes], 'application/pdf');
                final url = html.Url.createObjectUrlFromBlob(blob);
                final anchor = html.AnchorElement()
                  ..href = url
                  ..style.display = 'none'
                  ..download = 'some_name.pdf';
                html.document.body?.children.add(anchor);
                anchor.click();
                html.document.body?.children.remove(anchor);
                html.Url.revokeObjectUrl(url);
              },
              child: Text('Download'),
            ),
          ],
        ),
      ),
    );
  }
}

原答案

import 'package:flutter/material.dart';
import 'package:pdf/pdf.dart';
import 'package:pdf/widgets.dart' as pw;
import 'package:universal_html/html.dart' as html;

class PdfDemo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final pdf = pw.Document();
    pdf.addPage(pw.Page(
        pageFormat: PdfPageFormat.a4,
        build: (pw.Context context) {
          return pw.Center(
            child: pw.Text("Hello World"),
          );
        }));
    final bytes = pdf.save();
    final blob = html.Blob([bytes], 'application/pdf');

    return Scaffold(
      appBar: AppBar(),
      body: Center(
        child: Column(
          children: <Widget>[
            RaisedButton(
              child: Text("Open"),
              onPressed: () {
                final url = html.Url.createObjectUrlFromBlob(blob);
                html.window.open(url, "_blank");
                html.Url.revokeObjectUrl(url);
              },
            ),
            RaisedButton(
              child: Text("Download"),
              onPressed: () {
                final url = html.Url.createObjectUrlFromBlob(blob);
                final anchor =
                    html.document.createElement('a') as html.AnchorElement
                      ..href = url
                      ..style.display = 'none'
                      ..download = 'some_name.pdf';
                html.document.body.children.add(anchor);
                anchor.click();
                html.document.body.children.remove(anchor);
                html.Url.revokeObjectUrl(url);
              },
            ),
          ],
          mainAxisAlignment: MainAxisAlignment.center,
        ),
      ),
    );
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flutter web - 显示应用程序中生成的 pdf 文件。 (Uint8List格式) 的相关文章

  • 天文台服务器启动失败 - 无法创建套接字服务器

    我正在为自己构建一些内部工具 以使用我设置的一些模板以及可以在应用程序之间共享的一些附加功能来生成 Flutter 应用程序 目前 代码可以编译 构建并部署 但它会卡在第一个视图 空白屏幕 上 并在失败之 前重试启动 Observatory
  • 保存用户可以访问的 Flutter Android 应用程序中的文本文件

    我在 Flutter 中开发的 Android 应用程序的用户应该能够将一些数据保存 导出 到文本文件中 用户应该能够使用其他应用程序 包括文件管理器 在其 Android 设备上找到并访问此文件 我想 final directory aw
  • java中的csv到pdf文件

    我正在尝试获得一个csv文件解析为pdf 到目前为止我所拥有的内容附在下面 我的问题是这段代码最终出现在 pdf 中的文件在 csv 文件的第一行被截断 我不明白为什么 附示例 本质上我想要一个没有任何操作的 csv 文件的 pdf 版本
  • Flutter:在 Android 上获取本地 IP 地址

    如何在 Flutter 中获取我的 Android 设备的本地 IP 地址 这应该是 当连接到 WIFI 时 我的路由器通过 DHCP 分配的本地 IP 地址 如果连接到 VPN 则由我的 VPN 服务器分配的 VPN 网络中的本地 IP
  • 无法解析符号 FlutterActivity

    我使用 VCS gt Checkout from Version Control 将 flutter 项目从 github 导入到 Android Studio 中 现在我面临的问题是 Cannot resolve symbol Flutt
  • 使用 Flutter Flavor 运行调试?

    我正在尝试在 Visual Studio 代码上为我的 flutter 应用程序运行调试模式 单击 运行和调试 但是当我这样做时 我面临以下问题 The Xcode project defines schemes release priva
  • 字符串的外部文件,而不是对它们进行硬编码

    我有开发一些 Android 应用程序的经验 这些应用程序可以轻松地拥有可以存储字符串的 XML 字符串文件 上次我开发桌面 Java 应用程序时 我对字符串进行了硬编码 例如按钮标题 标签等 我后来了解到这是不好的做法 我应该将字符串存储
  • 如何通过单击颤动推送通知来打开特定屏幕

    我试图在单击推送通知时打开特定屏幕 我的有效负载如下所示 var payload notification title notificationTitle body notificationMessage click action scre
  • Flutter 应用程序错误 - 类型“Timestamp”不是类型“DateTime”的子类型

    我正在获取数据云 firestore 并尝试使用以下代码在我的应用程序中显示 new Text timeago format document data tripDoc docCreatedOn 我在用着timeagodart 包来格式化它
  • PDF:在现有 PDF 文件中插入一行文本

    我有一个 PDF 文件 我希望在所有页面 前两页除外 的页脚上添加一行纯文本 不是徽标或类似内容 有谁有一个如何做到这一点的例子 用任何语言 Update 原始 PDF 是用 Scribus 制作的 我可以完全控制它 因此 如果更容易进行查
  • Python 文件创建日期和重命名 - 请求批评

    场景 当我拍摄一个物体时 我会从多个角度拍摄多张图像 乘以我 拍摄 的物体数量 我可以生成大量图像 问题 相机生成标识为 DSCN100001 DSCN100002 等的图像 神秘 我编写了一个脚本 提示输入目录规范 Windows 以及
  • 将 unicode 字符/字符串写入文件

    我正在尝试将 unicode 字符写入文件std wofstream但是put or write函数不写入任何字符 示例代码 include
  • 我可以使用 iTextSharp 从现有 PDF 中删除文本对象并输出到新 PDF 吗?

    这个问题是我的旧问题的另一个版本 我想使用 iTextSharp 从 PDF 获取除文本对象之外的所有对象作为图像 https stackoverflow com questions 54003886 i want to get all o
  • 在 Android 中使用 PhoneGap 打开 PDF

    我需要打开一个位于 url 中的 PDF 文件 我需要用 PDF 查看器打开它 有可能的 谢谢大家 此致 我建议使用儿童浏览器插件 https build phonegap com blog childbrowser plugin并使用 G
  • Flutter:从 Hive 盒创建对象流

    我正在尝试访问一些在整个应用程序中更改和访问的用户设置 为此 我使用 Hive 从框中检索用户设置 我想通过转动UserSettings对象检索自Hive box settings get userID 到一个流中 该流将被馈送到Strea
  • 在 iOS 上将 SwiftUI 视图转换为 PDF

    我用 SwiftUI 画了一些漂亮的图表 因为它非常简单且容易做 然后我想将整个 SwiftUI 视图导出为 PDF 以便其他人可以以良好的方式查看图表 SwiftUI 没有直接为此提供解决方案 Cheers Alex 经过一番思考 我想到
  • 如何快速从文件夹树中选取随机文件?

    我试图从文件夹树中选择一个随机文件 从固定路径开始 并在所有子文件夹 或所选文件夹本身 中递归 搜索 我的想法是 创建文件列表 计算文件数量 在该范围内选择一个随机数 然后选择该索引处的文件 这是我的代码 create list of al
  • 如何在 flutter 插件的 Swift 编写的 iOS 部分中使用 Objective-C 框架

    In a 颤振插件 我想用一个Objective C我的框架iOS部分用swift编写 然后将其用于使用 Swift 的 Flutter 项目作为 iOS 语言 经过一些研究 我不是 iOS 开发人员 后 我发现我想要做的事情可以通过导入文
  • 在 Flutter 中将 base64 字符串转换为 PDF 文件

    我正在尝试显示 PDF 文件 但是我从服务器接收到 Base64 字符串格式的 PDF 文件 有什么方法可以直接将 Base64 字符串显示到 PDF 查看器或 WebView 中 而不将其保存到 File 中 检查一下 https sta
  • Flutter in_app_purchase 未在 Android 上加载

    我确实使用 https pub dev packages in app purchase https pub dev packages in app purchase 以下代码在IOS真机上完美运行 但在Android上无法连接到Googl

随机推荐