flutter_pdfview icon indicating copy to clipboard operation
flutter_pdfview copied to clipboard

Can not read from assets.

Open safield opened this issue 4 years ago • 1 comments

I have placed a pdf in my flutter app assets folder.

When I try to point the PDFView filePath parameter to my assets directory, I get....

"java.io.FileNotFoundException: No such file or directory".

safield avatar Apr 29 '21 17:04 safield

same problem here, did you know what went wrong?

mkarenko avatar Nov 28 '23 16:11 mkarenko

@endigo Why was this closed with no explanation? I'm having the same issue on android.

JakeHadley avatar Sep 30 '24 19:09 JakeHadley

meaby someone will want it, to do like I did

final ByteData data = await rootBundle.load('assets/pdf/form_template_$currentLocale.pdf'); final List bytes = data.buffer.asUint8List(); final PdfDocument document = PdfDocument(inputBytes: bytes); final PdfForm form = document.form;`

mkarenko avatar Oct 24 '24 18:10 mkarenko

Suppose widget.path contains the asset path (ex.: assets/my-document.pdf), use rootBundle to load asset byte data:

import 'dart:async';

import 'package:bovpro_app/core/helpers/custom_logger.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_pdfview/flutter_pdfview.dart';

class PDFPage extends StatefulWidget {
  final String title;
  final String path;

  const PDFPage({super.key, required this.title, required this.path});

  @override
  State<PDFPage> createState() => _PDFPageState();
}

class _PDFPageState extends State<PDFPage> with WidgetsBindingObserver {
  final Completer<PDFViewController> _controller =
      Completer<PDFViewController>();
  int? pages = 0;
  int? currentPage = 0;
  bool isReady = false;
  String errorMessage = '';
  ByteData? pdfData;

  @override
  void initState() {
    super.initState();
    rootBundle.load(widget.path).then((data) {
      setState(() {
        pdfData = data;
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Stack(
        children: <Widget>[
          PDFView(
            pdfData: pdfData!.buffer.asUint8List(),
            enableSwipe: true,
            autoSpacing: false,
            pageFling: true,
            pageSnap: true,
            defaultPage: currentPage!,
            fitPolicy: FitPolicy.BOTH,
            preventLinkNavigation:
                false, // if set to true the link is handled in flutter
            onRender: (pages) {
              setState(() {
                pages = pages;
                isReady = true;
              });
            },
            onError: (error) {
              setState(() {
                errorMessage = error.toString();
              });
              logger.i(error.toString());
            },
            onPageError: (page, error) {
              setState(() {
                errorMessage = '$page: ${error.toString()}';
              });
              logger.i('$page: ${error.toString()}');
            },
            onViewCreated: (PDFViewController pdfViewController) {
              _controller.complete(pdfViewController);
            },
            onLinkHandler: (String? uri) {
              logger.i('goto uri: $uri');
            },
            onPageChanged: (int? page, int? total) {
              logger.i('page change: $page/$total');
              setState(() {
                currentPage = page;
              });
            },
          ),
          errorMessage.isEmpty
              ? !isReady
                  ? const Center(
                      child: CircularProgressIndicator(),
                    )
                  : Container()
              : Center(
                  child: Text(errorMessage),
                )
        ],
      ),
    );
  }
}

tiagolpadua avatar Nov 23 '24 00:11 tiagolpadua