pdf_viewer.dart 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. import 'package:flutter/material.dart';
  2. import 'package:flutter_pdfview/flutter_pdfview.dart';
  3. import 'package:permission_handler/permission_handler.dart';
  4. import 'package:open_file/open_file.dart';
  5. import 'package:path_provider/path_provider.dart';
  6. import 'dart:io';
  7. class PdfViewerPage extends StatefulWidget {
  8. final String filePath;
  9. final String fileName;
  10. const PdfViewerPage(
  11. {Key? key, required this.filePath, required this.fileName})
  12. : super(key: key);
  13. @override
  14. _PdfViewerPageState createState() => _PdfViewerPageState();
  15. }
  16. class _PdfViewerPageState extends State<PdfViewerPage> {
  17. late PDFViewController _pdfViewController;
  18. int? pages;
  19. int? currentPage;
  20. bool isReady = false;
  21. String errorMessage = '';
  22. @override
  23. Widget build(BuildContext context) {
  24. return Scaffold(
  25. appBar: AppBar(
  26. title: const Text("Visualizador de PDF"),
  27. actions: [
  28. IconButton(
  29. icon: Icon(Icons.download),
  30. onPressed: _downloadPdf,
  31. ),
  32. ],
  33. ),
  34. body: Stack(
  35. children: <Widget>[
  36. PDFView(
  37. filePath: widget.filePath,
  38. enableSwipe: true,
  39. swipeHorizontal: true,
  40. autoSpacing: false,
  41. pageFling: false,
  42. onRender: (_pages) {
  43. setState(() {
  44. pages = _pages;
  45. isReady = true;
  46. });
  47. },
  48. onError: (error) {
  49. setState(() {
  50. errorMessage = error.toString();
  51. });
  52. print(error.toString());
  53. },
  54. onPageError: (page, error) {
  55. setState(() {
  56. errorMessage = '$page: ${error.toString()}';
  57. });
  58. print('$page: ${error.toString()}');
  59. },
  60. onViewCreated: (PDFViewController pdfViewController) {
  61. _pdfViewController = pdfViewController;
  62. },
  63. onPageChanged: (int? page, int? total) {
  64. print('page change: $page/$total');
  65. setState(() {
  66. currentPage = page;
  67. });
  68. },
  69. ),
  70. errorMessage.isEmpty
  71. ? !isReady
  72. ? Center(
  73. child: CircularProgressIndicator(),
  74. )
  75. : Container()
  76. : Center(
  77. child: Text(errorMessage),
  78. )
  79. ],
  80. ),
  81. );
  82. }
  83. Future<void> _downloadPdf() async {
  84. try {
  85. if (await Permission.storage.request().isGranted) {
  86. final directory = await getExternalStorageDirectory();
  87. if (directory != null) {
  88. final filePath = '${directory.path}/${widget.fileName}';
  89. final file = File(filePath);
  90. await file.writeAsBytes(await File(widget.filePath).readAsBytes());
  91. ScaffoldMessenger.of(context).showSnackBar(
  92. SnackBar(content: Text('Archivo guardado en $filePath')),
  93. );
  94. OpenFile.open(filePath);
  95. }
  96. } else {
  97. ScaffoldMessenger.of(context).showSnackBar(
  98. SnackBar(content: Text('Permisos de almacenamiento denegados')),
  99. );
  100. }
  101. } catch (e) {
  102. ScaffoldMessenger.of(context).showSnackBar(
  103. SnackBar(content: Text('Error al descargar el archivo: $e')),
  104. );
  105. }
  106. }
  107. }