Генерация PDF-файлов с помощью Flutter web

#flutter #dart

#flutter #dart

Вопрос:

Я нахожусь в процессе веб-разработки мобильного приложения Flutter и пытаюсь обойти проблему отсутствия поддержки поставщика путей в Web.

Я использую пакет PDF (pdf: ^ 1.9.0) для создания PDF-документа и загрузки его на Google Диск, и я пытаюсь выяснить, могу ли я сгенерировать и сохранить PDF-файл в памяти, чтобы сделать его совместимым с Интернетом.

Пример текущего кода с использованием поставщика путей.

 createFile() async {
  final downloads = await getApplicationSupportDirectory();
  final file = File("${downloads.path}/$filename.pdf");
  await file.writeAsBytes(pdf.save());
  await GoogleDriveController.uploadFileToGoogleDrive(file.path);
}
  

Вопрос: Есть ли способ генерировать и сохранять файлы в памяти для web с использованием Flutter web?

Комментарии:

1. нет, вы не можете сохранить File файлы в памяти

2. @pskink Спасибо за подтверждение, похоже, мне придется перенести это в функцию GCP.

Ответ №1:

Мне удалось найти обходной путь для генерации PDF-файла и вместо этого запустить загрузку через браузер, и я подумал, что должен опубликовать, если кто-нибудь наткнется на это.

 //Create PDF in Bytes 
Uint8List pdfInBytes = pdf.save();
    
//Create blob and link from bytes
final blob = html.Blob([pdfInBytes], 'application/pdf');
final url = html.Url.createObjectUrlFromBlob(blob);
final anchor = html.document.createElement('a') as html.AnchorElement
     ..href = url
     ..style.display = 'none'
     ..download = 'pdf.pdf';
html.document.body.children.add(anchor);
    
//Trigger the download of this PDF in the browser.
    
RaisedButton(
   child: Text('Press'),
       onPressed: () {
         anchor.click();
         Navigator.pop(context);
       },
   )
  

Комментарии:

1. Я использую этот подход и он отлично работает в Chrome во время отладки и в Safari на моем Macbook. Но это вообще ничего не дает, если я захожу в веб-приложение на своем iPhone. Есть идеи, почему это может происходить?

Ответ №2:

Мой ответ — это вариант на Yonkee, приведенный выше, специально для flutter web. В этом ответе я добавил необходимый импорт (dart: html и dart: typed_data) и добавил форматирование текста, поскольку мне нужна была эта функция.

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

class PDFSave extends StatefulWidget {

  @override
  _PDFSaveState createState() => _PDFSaveState();
}

class _PDFSaveState extends State<PDFSave> {

  final pdf = pw.Document();
  var anchor;

  savePDF() async {
    Uint8List pdfInBytes = await pdf.save();
    final blob = html.Blob([pdfInBytes], 'application/pdf');
    final url = html.Url.createObjectUrlFromBlob(blob);
    anchor = html.document.createElement('a') as html.AnchorElement
      ..href = url
      ..style.display = 'none'
      ..download = 'pdf.pdf';
    html.document.body.children.add(anchor);
  }


  createPDF() async {

  pdf.addPage(
    pw.Page(
      build: (pw.Context context) => pw.Column(
        children: [
          pw.Text('Hello World', style: pw.TextStyle(fontSize: 40)),
        ],
      ),
    ),
  );
  savePDF();
}

@override
  void initState() {
    super.initState();
    createPDF();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(backgroundColor: Colors.transparent,
        appBar: AppBar(
      title: Text('PDF Creator'),
    ),
    body: Center(
      child:RaisedButton(
        child: Text('Press'),
        onPressed: () {
          anchor.click();
          Navigator.pop(context);
        },
      )
    ));
  }
}