123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- 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<PdfViewerPage> {
- 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: <Widget>[
- 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<void> _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')),
- );
- }
- }
- }
|