如何在Flutter中解码Base64格式的PDF字符串?

6
我知道有一个名为dart:convert的包,可以让我解码base64图像。但显然,它不能用于pdf文件。如何在Flutter中解码base64 PDF文件?
我想将其存储在Firebase Storage中(我知道如何做),但我需要文件变量才能这样做。
我有一个用node js编写的web服务,其中有一个POST路由。在那里,我创建了一个pdf文件并将其编码为base64。响应是一个base64字符串,请查看代码。
router.post('/pdf', (req, res, next) => {
    //res.send('PDF');

    const fname = req.body.fname;
    const lname = req.body.lname;

    var documentDefinition = {
        content: [ write your pdf with pdfMake.org ],
        styles: { write your style };

    const pdfDoc = pdfMake.createPdf(documentDefinition);
    pdfDoc.getBase64((data) => {

        res.send({ "base64": data });

    });
});

如您所见,它将PDF呈现为Base64字符串。

现在,在Flutter中,我已经编写了以下代码:

http.post("https://mypostaddreess.com",body: json.encode({"data1":"data"}))
              .then((response) {
            print("Response status: ${response.statusCode}");
            print("Response body: ${response.body}");

            var data = json.decode(response.body);
            var pdf = base64.decode(data["base64"]);

          });

}

我有一个变量'pdf'保存了PDF文件,但我不知道如何解码以便下载该文件或在Flutter应用程序中显示它。

你好,你成功做到了吗? - Andrii Havrylyak
3个回答

11

@SwiftingDuster

可能除了解码之外,创建PDF文件并打开它也是必要的。

createPdf() async {
    var bytes = base64Decode(widget.base64String.replaceAll('\n', ''));
    final output = await getTemporaryDirectory();
    final file = File("${output.path}/example.pdf");
    await file.writeAsBytes(bytes.buffer.asUint8List());

    print("${output.path}/example.pdf");
    await OpenFile.open("${output.path}/example.pdf");
    setState(() {});
}

所需库: 1. open_file 2. path_provider 3. pdf


“File”不是一个函数。尝试更正名称以匹配现有函数,或定义一个名为“File”的方法或函数。如何修复它? - Mohd Sadham
导入dart:io而不是dart:http。 - Nikolay Atanasov

2
我认为最好获取BufferArray并将其转换为PDF文件。
请查看我的答案:从Blob数据获取PDF

1
这应该将base64编码的pdf数据转换为字节数组。
import 'packages:dart/convert.dart';

List<int> pdfDataBytes = base64.decode(pdfBase64)
  .map((number) => int.parse(number));

pdfimage插件似乎适合您展示PDF的需求。

代码应该大致如下:

import 'package:pdf/pdf.dart';
import 'package:image/image.dart';

...
Image img = decodeImage(pdfDataBytes);
PdfImage image = PdfImage(
  pdf,
  image: img.data.buffer.asUint8List(),
  width: img.width,
  height: img.height);
// Display it somehow
...

我收到了“参数类型'int'无法分配给参数类型'String'”的错误。 - markhorrocks
1
这里的代码不够让我弄清楚它是如何工作的。我在哪里获取“pdf”? - markhorrocks
@markhorrocks pdf 是来自 这里 的 Flutter 插件。我在我的回答中已经添加了超链接。 - Swift
@markhorrocks 你好,你成功做到了吗?? - Andrii Havrylyak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接