Flutter web - отображать PDF-файл, созданный в приложении. (Формат Uint8List) - PullRequest
1 голос
/ 22 апреля 2020

Я работаю над iOS / Android / веб-приложением, в котором я генерирую PDF на основе пользовательского ввода, используя плагин 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_render: ^ 0.57.2

Как я могу отобразить этот PDF-файл, созданный приложением, на веб-сайте? Есть ли способ подделать данные Uint8List в виде файла, или, возможно, другой способ подойти к этому? (Единственное, что я могу придумать, чтобы решить эту проблему, это загрузить файл в Интернет после его генерации, чтобы отобразить его, но это выглядит как перебор.)

1 Ответ

2 голосов
/ 23 апреля 2020

Мы можем сделать это без дополнительных плагинов, потому что сам веб-браузер может отображать (или загружать) pdf документ:

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,
        ),
      ),
    );
  }
}
...