Flutter PDF全屏查看插件flutter_fullpdfview_fork的使用

Flutter PDF全屏查看插件flutter_fullpdfview_fork的使用

flutter_fullpdfview_fork

原生PDF视图插件,适用于iOS和Android平台。基于https://github.com/arnaudelub/flutter_fullpdfview

使用此插件作为库

1. 添加依赖

在你的pubspec.yaml文件中添加以下依赖:

dependencies:
  flutter_fullpdfview_fork: latest_version

2. 安装依赖

你可以通过命令行安装包:

用Flutter:

$ flutter packages get

或者,你可以使用编辑器支持的pub getflutter pub get功能。具体方法取决于你的编辑器。

3. 配置

iOS

在应用的Info.plist文件中添加一个布尔属性,键名为io.flutter.embedded_views_preview,值为YES

4. 导入插件

在你的Dart代码中导入插件:

import 'package:flutter_fullpdfview_fork/flutter_fullpdfview_fork.dart';

参数选项

名称 Android iOS
onViewCreated V V
onRender V V
onPageChanged V V
onError V V
onPageError V X
gestureRecognizers V V
filePath V V
fitEachPage V V
defaultPage V V
dualPageMode V V
displayAsBook V V
dualPageWithBreak V V
enableSwipe V V
swipeHorizontal V V
password V V
nightMode V X
autoSpacing V V
pageFling V V
pageSnap V V
backgroundColor V V
fitPolicy V X

目前只支持黑白模式!

控制器选项

名称 描述 参数 返回类型
getPageCount 获取总页数 - Future<int>
getCurrentPage 获取当前页 - Future<int>
setPage 跳转到指定页 int page Future<bool>
setPageWithAnimation 带动画跳转到指定页 int page Future<bool>
resetZoom 跳转到指定页并适应宽度 int page Future<bool>
getZoom 获取当前缩放比例 double zoom Future<double>
setZoom 设置当前缩放比例 double zoom Future<double>
getPageWidth 获取PDF宽度 double width Future<double>
getPageHeight 获取PDF高度 double height Future<double>

示例

以下是使用flutter_fullpdfview_fork插件的完整示例代码:

import 'dart:async';
import 'dart:io';

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:path_provider/path_provider.dart';
import 'package:flutter_fullpdfview_fork/flutter_fullpdfview_fork.dart';

void main() => runApp(MyApp());

class MyApp extends StatefulWidget {
  [@override](/user/override)
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String pathPDF = "";
  String corruptedPathPDF = "";

  [@override](/user/override)
  void initState() {
    super.initState();
    fromAsset('assets/corrupted.pdf', 'corrupted.pdf').then((f) {
      setState(() {
        corruptedPathPDF = f.path;
      });
    });
    fromAsset('assets/demo.pdf', 'sample.pdf').then((f) {
      setState(() {
        pathPDF = f.path;
      });
    });
  }

  Future<File> createFileOfPdfUrl() async {
    final url = "https://pdfkit.org/docs/guide.pdf";
    final filename = url.substring(url.lastIndexOf("/") + 1);
    var request = await HttpClient().getUrl(Uri.parse(url));
    var response = await request.close();
    var bytes = await consolidateHttpClientResponseBytes(response);
    String dir = (await getApplicationDocumentsDirectory()).path;
    File file = File('$dir/$filename');
    await file.writeAsBytes(bytes);
    return file;
  }

  Future<File> fromAsset(String asset, String filename) async {
    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;
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter PDF View',
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        appBar: AppBar(title: const Text('Plugin example app')),
        body: Center(child: Builder(
          builder: (BuildContext context) {
            return Column(
              children: <Widget>[
                RaisedButton(
                    child: Text("Open PDF"),
                    onPressed: () {
                      if (pathPDF != null) {
                        Navigator.push(
                          context,
                          MaterialPageRoute(
                              builder: (context) => PDFScreen(path: pathPDF)),
                        );
                      }
                    }),
                RaisedButton(
                    child: Text("Open Corrupted PDF"),
                    onPressed: () {
                      if (pathPDF != null) {
                        Navigator.push(
                          context,
                          MaterialPageRoute(
                              builder: (context) =>
                                  PDFScreen(path: corruptedPathPDF)),
                        );
                      }
                    })
              ],
            );
          },
        )),
      ),
    );
  }
}

class PDFScreen extends StatefulWidget {
  final String path;
  PDFScreen({Key? key, required this.path}) : super(key: key);

  _PDFScreenState createState() => _PDFScreenState();
}

class _PDFScreenState extends State<PDFScreen> {
  int pages = 0;
  bool isReady = false;
  String errorMessage = '';
  GlobalKey pdfKey = GlobalKey();
  bool isActive = true;
  double scale = 1.0;
  double top = 200.0;
  double initialLocalFocalPoint = 0;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return OrientationBuilder(
        builder: (BuildContext context, Orientation orientation) {
      if (orientation == Orientation.portrait) {
        final Completer<PDFViewController> _controller =
            Completer<PDFViewController>();
        return Scaffold(
          appBar: AppBar(
            title: Text("Document"),
            actions: <Widget>[
              IconButton(
                icon: Icon(Icons.share),
                onPressed: () {},
              ),
            ],
          ),
          body: Stack(
            children: <Widget>[
              Container(
                color: Colors.black,
                child: PDFView(
                    key: pdfKey,
                    filePath: widget.path,
                    fitEachPage: true,
                    fitPolicy: FitPolicy.BOTH,
                    dualPageMode: false,
                    enableSwipe: true,
                    swipeHorizontal: true,
                    autoSpacing: true,
                    pageFling: true,
                    defaultPage: 8,
                    pageSnap: true,
                    backgroundColor: Colors.BLACK,
                    onRender: (_pages) {
                      print("OK RENDERED!!!!!");
                      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) {
                      _controller.complete(pdfViewController);
                    },
                    onPageChanged: (int page, int total) {
                      print('page change: $page/$total');
                    },
                    onZoomChanged: (double zoom) {
                      print("Zoom is now $zoom");
                    }),
              ),
              errorMessage.isEmpty
                  ? !isReady
                      ? Center(
                          child: CircularProgressIndicator(),
                        )
                      : Container()
                  : Center(child: Text(errorMessage))
            ],
          ),
          floatingActionButton: FutureBuilder<PDFViewController>(
            future: _controller.future,
            builder: (context, AsyncSnapshot<PDFViewController> snapshot) {
              if (snapshot.hasData) {
                return FloatingActionButton.extended(
                  label: Text("Go to ${pages ~/ 2}"),
                  onPressed: () async {
                    print(await snapshot.data?.getZoom());
                    print(await snapshot.data?.getPageWidth(1));
                    print(await snapshot.data?.getPageHeight(1));
                    //await snapshot.data.setPage(pages ~/ 2);
                    await snapshot.data?.resetZoom(1);
                    await snapshot.data?.setZoom(3.0);
                    //print(await snapshot.data.getScreenWidth());
                  },
                );
              }

              return Container();
            },
          ),
        );
      } else {
        final Completer<PDFViewController> _controller =
            Completer<PDFViewController>();
        return PDFView(
          filePath: widget.path,
          fitEachPage: false,
          dualPageMode: true,
          displayAsBook: true,
          dualPageWithBreak: true,
          enableSwipe: true,
          swipeHorizontal: true,
          autoSpacing: false,
          pageFling: true,
          defaultPage: 0,
          pageSnap: true,
          backgroundColor: Colors.BLACK,
          onRender: (_pages) {
            print("OK RENDERED!!!!!");
            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) {
            _controller.complete(pdfViewController);
          },
          onPageChanged: (int page, int total) {
            print('page change: $page/$total');
          },
        );
      }
    });
  }
}

更多关于Flutter PDF全屏查看插件flutter_fullpdfview_fork的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter PDF全屏查看插件flutter_fullpdfview_fork的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


flutter_fullpdfview_fork 是一个用于在 Flutter 应用中全屏查看 PDF 文件的插件。它是 flutter_fullpdfview 的一个分支版本,提供了一些额外的功能和改进。以下是使用 flutter_fullpdfview_fork 的基本步骤:

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 flutter_fullpdfview_fork 依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_fullpdfview_fork: ^1.0.0+17

然后运行 flutter pub get 来安装依赖。

2. 导入包

在你的 Dart 文件中导入 flutter_fullpdfview_fork 包:

import 'package:flutter_fullpdfview_fork/flutter_fullpdfview_fork.dart';

3. 使用 PDFView 组件

使用 PDFView 组件来显示 PDF 文件。你可以从本地文件系统或网络加载 PDF 文件。

从本地文件加载 PDF

class PDFViewerPage extends StatelessWidget {
  final String path;

  PDFViewerPage({required this.path});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('PDF Viewer'),
      ),
      body: PDFView(
        filePath: path,
      ),
    );
  }
}

从网络加载 PDF

class PDFViewerPage extends StatelessWidget {
  final String url;

  PDFViewerPage({required this.url});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('PDF Viewer'),
      ),
      body: PDFView(
        filePath: url,
      ),
    );
  }
}

4. 导航到 PDFViewerPage

你可以在应用的其他部分导航到 PDFViewerPage 来显示 PDF 文件。

Navigator.push(
  context,
  MaterialPageRoute(
    builder: (context) => PDFViewerPage(path: 'assets/sample.pdf'),
  ),
);

5. 可选配置

PDFView 组件提供了一些可选配置项,你可以根据需要自定义 PDF 查看器。

例如,你可以设置是否启用滚动、缩放、页面切换等:

PDFView(
  filePath: path,
  enableSwipe: true,
  swipeHorizontal: false,
  autoSpacing: true,
  pageFling: true,
  onRender: (_pages) {
    print("PDF rendered with $_pages pages");
  },
  onError: (error) {
    print(error.toString());
  },
  onPageError: (page, error) {
    print('$page: ${error.toString()}');
  },
  onViewCreated: (PDFViewController pdfViewController) {
    // You can store the controller for further use
  },
  onPageChanged: (int page, int total) {
    print('page change: $page/$total');
  },
);

6. 处理权限

如果你从网络加载 PDF 文件,确保你的应用有访问网络的权限。在 AndroidManifest.xml 中添加以下权限:

<uses-permission android:name="android.permission.INTERNET" />
回到顶部