Reading time: 2 minutes
Hello, today we are going to learn how we can open a PDF file sent from a REST API in our Flutter app.
The first thing we are going to do is to install the PDF library for mobile in the pubspec.yaml file:
flutter_pdfview: ^1.0.0
To install the library, use:
flutter pub get
Now, let’s create a Widget that receives the PDF file in Base64 format.
import 'dart:convert'; import 'dart:typed_data'; import 'package:flutter/foundation.dart' show kIsWeb; import 'package:flutter/material.dart'; import 'package:flutter_pdfview/flutter_pdfview.dart'; import 'dart:html' as html; class PDFViewerWidget extends StatelessWidget { final Uint8List pdfData; const PDFViewerWidget({super.key, required this.pdfData}); @override Widget build(BuildContext context) { if (isWeb()) { // Download PDF: html.AnchorElement anchorElement = html.AnchorElement( href: "data:application/octet-stream;charset=utf-16le;base64,${base64Encode(pdfData)}") ..setAttribute("download", "pdf.pdf") ..click(); return Container(); } else { // If we are in a mobile application, use PDFView from flutter_pdfview return Scaffold( appBar: AppBar( title: Text('PDF Viewer'), ), body: PDFView( pdfData: pdfData, enableSwipe: true, swipeHorizontal: true, autoSpacing: false, pageFling: true, onRender: (pages) { // Optional callback when the PDF has been rendered }, onError: (error) { // Optional callback to handle errors }, onPageError: (page, error) { // Optional callback to handle errors for individual pages }, onViewCreated: (PDFViewController viewController) { // You can save a reference to the controller if you need to interact with the PDF }, ), ); } } bool isWeb() { // Check if it is running on the web return kIsWeb; } }
This file first checks whether it is running on the web or mobile to determine which library to use.
In the case of mobile, it will generate a new window using PDFView to load the PDF inside it.
In the case of the web, it will directly download the PDF as a file.
Remember to import the Widget like this:
await Navigator.push( context, MaterialPageRoute( builder: (context) => PDFViewerWidget(pdfData: pdfBytes), ), );
This way, it will create a new navigable window that opens this container.