import 'package:flutter/material.dart'; import 'package:flutter_pdfview/flutter_pdfview.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:open_file/open_file.dart'; import 'package:path_provider/path_provider.dart'; import 'dart:io'; class PdfViewerPage extends StatefulWidget { final String filePath; final String fileName; const PdfViewerPage( {Key? key, required this.filePath, required this.fileName}) : super(key: key); @override _PdfViewerPageState createState() => _PdfViewerPageState(); } class _PdfViewerPageState extends State { late PDFViewController _pdfViewController; int? pages; int? currentPage; bool isReady = false; String errorMessage = ''; @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text("Visualizador de PDF"), actions: [ IconButton( icon: Icon(Icons.download), onPressed: _downloadPdf, ), ], ), body: Stack( children: [ PDFView( filePath: widget.filePath, enableSwipe: true, swipeHorizontal: true, autoSpacing: false, pageFling: false, onRender: (_pages) { setState(() { pages = _pages; isReady = true; }); }, onError: (error) { setState(() { errorMessage = error.toString(); }); print(error.toString()); }, onPageError: (page, error) { setState(() { errorMessage = '$page: ${error.toString()}'; }); print('$page: ${error.toString()}'); }, onViewCreated: (PDFViewController pdfViewController) { _pdfViewController = pdfViewController; }, onPageChanged: (int? page, int? total) { print('page change: $page/$total'); setState(() { currentPage = page; }); }, ), errorMessage.isEmpty ? !isReady ? Center( child: CircularProgressIndicator(), ) : Container() : Center( child: Text(errorMessage), ) ], ), ); } Future _downloadPdf() async { try { if (await Permission.storage.request().isGranted) { final directory = await getExternalStorageDirectory(); if (directory != null) { final filePath = '${directory.path}/${widget.fileName}'; final file = File(filePath); await file.writeAsBytes(await File(widget.filePath).readAsBytes()); ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text('Archivo guardado en $filePath')), ); OpenFile.open(filePath); } } else { ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text('Permisos de almacenamiento denegados')), ); } } catch (e) { ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text('Error al descargar el archivo: $e')), ); } } }