How to render Uint8List as a pdf?

2,114

You can save the file locally and render it using some pdf viewer

final String dir = (await getApplicationDocumentsDirectory()).path;
final String path = '$dir/example.pdf';
final File file = File(path);
await file.writeAsBytes(doc.save());

Now you can use this path to view the pdf using a pdf viewer.

You can check this medium post for reference.

Share:
2,114
CS-learner
Author by

CS-learner

Updated on December 04, 2022

Comments

  • CS-learner
    CS-learner over 1 year

    I currently have this function that returns a Uint8List. I would like to render it as a pdf in my android app so I can see it. Not sure how to do this, any help is appreciated! This is the source code if that is also of any help. Thank you https://github.com/DavBfr/dart_pdf/blob/master/demo/lib/invoice.dart

     Future<Uint8List> generateInvoice(PdfPageFormat pageFormat) async {
      final lorem = pw.LoremText();
    
      final products = <Product>[
        Product('19874', lorem.sentence(4), 3.99, 2),
        Product('98452', lorem.sentence(6), 15, 2),
        Product('28375', lorem.sentence(4), 6.95, 3),
        Product('95673', lorem.sentence(3), 49.99, 4),
        Product('23763', lorem.sentence(2), 560.03, 1),
        Product('55209', lorem.sentence(5), 26, 1),
        Product('09853', lorem.sentence(5), 26, 1),
       
      ];
    
      final invoice = Invoice(
        invoiceNumber: '982347',
        products: products,
        customerName: 'Abraham Swearegin',
        customerAddress: '54 rue de Rivoli\n75001 Paris, France',
        paymentInfo:
            '4509 Wiseman Street\nKnoxville, Tennessee(TN), 37929\n865-372-0425',
        tax: .15,
        baseColor: PdfColors.teal,
        accentColor: PdfColors.blueGrey900,
      );
    
      return await invoice.buildPdf(pageFormat);
    }
    
    class Invoice {
      Invoice({
        this.products,
        this.customerName,
        this.customerAddress,
        this.invoiceNumber,
        this.tax,
        this.paymentInfo,
        this.baseColor,
        this.accentColor,
      });
    
      final List<Product> products;
      final String customerName;
      final String customerAddress;
      final String invoiceNumber;
    
    
      static const _darkColor = PdfColors.blueGrey800;
      static const _lightColor = PdfColors.white;
    
      PdfColor get _baseTextColor =>
          baseColor.luminance < 0.5 ? _lightColor : _darkColor;
    
      PdfColor get _accentTextColor =>
          baseColor.luminance < 0.5 ? _lightColor : _darkColor;
    
      double get _total =>
          products.map<double>((p) => p.total).reduce((a, b) => a + b);
    
      double get _grandTotal => _total * (1 + tax);
    
      PdfImage _logo;
    
      Future<Uint8List> buildPdf(PdfPageFormat pageFormat) async {
        // Create a PDF document.
        final doc = pw.Document();
    
        final font1 = await rootBundle.load('assets/roboto1.ttf');
        final font2 = await rootBundle.load('assets/roboto2.ttf');
        final font3 = await rootBundle.load('assets/roboto3.ttf');
    
        _logo = PdfImage.file(
          doc.document,
          bytes: (await rootBundle.load('assets/logo.png')).buffer.asUint8List(),
        );
    
        // Add page to the PDF
        doc.addPage(
          pw.MultiPage(
            pageTheme: _buildTheme(
              pageFormat,
              font1 != null ? pw.Font.ttf(font1) : null,
              font2 != null ? pw.Font.ttf(font2) : null,
              font3 != null ? pw.Font.ttf(font3) : null,
            ),
            header: _buildHeader,
            footer: _buildFooter,
            build: (context) => [
              _contentHeader(context),
              _contentTable(context),
              pw.SizedBox(height: 20),
              _contentFooter(context),
              pw.SizedBox(height: 20),
              _termsAndConditions(context),
            ],
          ),
        );
    
        // Return the PDF file content
        return doc.save();
      }
    
  • sj_959
    sj_959 over 2 years
    Thanks. Although this does generate a pdf file, when I try to open the file, I get an error saying Failed to load PDF document.