从 assets flutter 打开 pdf 文件

open pdf file from assets flutter

我正在尝试使用 flutter_fullpdfview 1.0.12 打开 PDF 文件,我的 PDF 文件位于 assets 文件夹下,但不知何故我收到无法找到文件的错误。我尝试了几个选项,但其中 none 个都工作 return 相同的错误。以下是我尝试加载文件的函数,它们都因相同的错误而失败。

  Future<File> copyAsset() async {
      Directory tempDir = await getTemporaryDirectory();
      String tempPath = tempDir.path;
      File tempFile = File('$tempPath/copy.pdf');
      ByteData bd = await rootBundle.load('assets/jainaarti.pdf');
      await tempFile.writeAsBytes(bd.buffer.asUint8List(), flush: true);
      return tempFile;
    }

Future<File> fromAsset(String asset, String filename) async {
// To open from assets, you can copy them to the app storage folder, and the access them "locally"
    Completer<File> completer = Completer();
    try {
      var dir = await getApplicationDocumentsDirectory();
      File file = File("${dir.path}/$filename");
      var data = await rootBundle.load(asset);
      var bytes = data.buffer.asUint8List();
      await file.writeAsBytes(bytes, flush: true);
      completer.complete(file);
    } catch (e) {
      throw Exception('Error parsing asset file!');
    }
    return completer.future;

}

您使用的 pdf 库似乎设置为使用系统文件路径加载 pdf。不幸的是,这与您有权访问的资产路径不同,并且 Flutter 目前不支持在运行时获取资产系统文件路径的能力。我能找到使用该库的唯一方法是将文件传输到已知目录,然后从那里加载。而不是这样做,我会推荐 native_pdf_view 库,因为它支持资产加载和全屏。您应该能够按如下方式实现它:

final pdfController = PdfController(
  document: PdfDocument.openAsset('assets/copy.pdf'),
);

return Scaffold(
  body: Center(
    child: PdfView(
      controller: pdfController,
    )
  ),
);

-- 编辑--

要切换页面,如果你想在不同的页面上启动查看器,只需编辑 pdfController 中的 initialPage

final pdfController = PdfController(
    document: PdfDocument.openAsset('assets/copy.pdf'),
    initialPage: 2
  );

如果你想在 pdfView 创建后切换页面,你可以从任何地方调用 jumpToPage() 或 animateToPage() ,前提是你可以获得对 pdfController 的引用,并且它和 pdfView 已经被实例化.

return Scaffold(
      body: Stack(
        children: [
          Center(
            child: PdfView(
              controller: pdfController,
            )
          ),
          RaisedButton(
            child: Text("Page 2"),
            onPressed: (){
              pdfController.jumpToPage(2);
              //  -- or --
              pdfController.animateToPage(2, duration: Duration(seconds: 1), curve: Curves.linear);
            },
          ),
        ],
      ),
    );