Flutter PDF阅读插件advance_pdf_viewer_fork的使用

发布于 1周前 作者 ionicwang 来自 Flutter

Flutter PDF阅读插件advance_pdf_viewer_fork的使用

简介

advance_pdf_viewer_fork 是一个用于处理PDF文件的Flutter插件,支持Android和iOS平台。它最初是基于https://github.com/lohanidamodar/pdf_viewer fork而来,而后者又是从https://github.com/CrossPT/flutter_plugin_pdf_viewer fork出来的。

Pub Package

安装

在您的 pubspec.yaml 文件中添加 advance_pdf_viewer_fork 作为依赖项:

dependencies:
  advance_pdf_viewer_fork: any

使用方法

加载PDF

可以通过三种方式加载PDF文档:从assets、从URL或从本地文件系统。

  • 从assets加载

    PDFDocument doc = await PDFDocument.fromAsset('assets/test.pdf');
    
  • 从URL加载

    PDFDocument doc = await PDFDocument.fromURL('http://www.africau.edu/images/default/sample.pdf');
    
  • 从文件加载

    File file = File('...');
    PDFDocument doc = await PDFDocument.fromFile(file);
    

加载特定页面

可以加载指定页数的PDF页面:

PDFPage pageOne = await doc.get(page: _number);

使用预构建的查看器

使用预构建的PDF查看器组件来展示PDF文档:

@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      title: Text('Example'),
    ),
    body: Center(
      child: _isLoading
          ? Center(child: CircularProgressIndicator())
          : PDFViewer(document: document),
    ),
  );
}

这个代码片段会生成如下的视图:

Demo Screenshot 1

示例代码

下面是一个完整的示例应用程序,展示了如何使用 advance_pdf_viewer_fork 插件加载和显示PDF文件,并提供了一些额外的功能,例如从不同来源加载PDF文件以及切换PDF显示模式等。

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:advance_pdf_viewer_fork/advance_pdf_viewer_fork.dart';

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

class App extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyApp(),
    );
  }
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  bool _isLoading = true;
  PDFDocument document;
  bool _usePDFListView = false;

  @override
  void initState() {
    super.initState();
    loadDocument();
  }

  @override
  void dispose() {
    document.clearImageCache();
    document = null;
    super.dispose();
  }

  loadDocument() async {
    document = await PDFDocument.fromAsset('assets/sample.pdf');
    setState(() => _isLoading = false);
  }

  changePDF(value) async {
    setState(() => _isLoading = true);
    if (value == 1) {
      document = await PDFDocument.fromAsset('assets/sample2.pdf');
    } else if (value == 2) {
      document = await PDFDocument.fromURL("http://conorlastowka.com/book/CitationNeededBook-Sample.pdf");
    } else {
      document = await PDFDocument.fromAsset('assets/sample.pdf');
    }
    setState(() => _isLoading = false);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      drawer: Drawer(
        child: Column(
          children: <Widget>[
            SizedBox(height: 36),
            ListTile(
              title: Text('Load from Assets'),
              onTap: () {
                changePDF(1);
              },
            ),
            ListTile(
              title: Text('Load from URL'),
              onTap: () {
                changePDF(2);
              },
            ),
            ListTile(
              title: Text('Restore default'),
              onTap: () {
                changePDF(3);
              },
            ),
          ],
        ),     
      ),
      appBar: AppBar(
        title: const Text('FlutterPluginPDFViewer'),
        actions: <Widget>[
          GestureDetector(
            onTap: (){
              _usePDFListView = !_usePDFListView;
              setState(() {});
            },
            child: Icon(Icons.cached),
          ),
          SizedBox(width: 15,)
        ],
      ),
      body: Column(
        children: <Widget>[
          !_usePDFListView
          ? Expanded(
              child: Center(
                child: _isLoading
                    ? Center(child: CircularProgressIndicator())
                    : PDFViewer(
                        document: document,
                        zoomSteps: 1,
                        //uncomment below line to preload all pages
                        // lazyLoad: false,
                        // uncomment below line to scroll vertically
                        // scrollDirection: Axis.vertical,

                        // enableSwipeNavigation: false,
                        showPicker: false,
                        showNavigation: true,
                        //uncomment below code to replace bottom navigation with your own
                        /* navigationBuilder:
                            (context, page, totalPages, jumpToPage, animateToPage) {
                          return ButtonBar(
                            alignment: MainAxisAlignment.spaceEvenly,
                            children: <Widget>[
                              IconButton(
                                icon: Icon(Icons.first_page),
                                onPressed: () {
                                  jumpToPage(page: 0);
                                },
                              ),
                              IconButton(
                                icon: Icon(Icons.arrow_back),
                                onPressed: () {
                                  animateToPage(page: page - 2);
                                },
                              ),
                              IconButton(
                                icon: Icon(Icons.arrow_forward),
                                onPressed: () {
                                  animateToPage(page: page);
                                },
                              ),
                              IconButton(
                                icon: Icon(Icons.last_page),
                                onPressed: () {
                                  jumpToPage(page: totalPages - 1);
                                },
                              ),
                            ],
                          );
                        }, */
                      ),
              ),
            )
          : Expanded(
              child: _isLoading 
                ? Center(child: CircularProgressIndicator(),)
                : PDFListViewer(
                    document: document,
                    preload: true,
                  ),
            ),
        ],
      ),
    );
  }
}

待办事项

  • 支持密码保护的PDF文件

使用的第三方库

名称 描述
path_provider 一个Flutter插件,用于查找文件系统中的常用位置。支持iOS和Android。
flutter_cache_manager 一个用于下载并缓存文件到应用程序缓存目录的缓存管理器。各种设置可以改变文件保存的时间长度。
numberpicker 一个自定义小部件,设计用于通过滚动选择器选择整数或十进制数字。

希望这篇文档能够帮助您更好地理解和使用 advance_pdf_viewer_fork 插件。如果有任何问题或需要进一步的帮助,请随时提问!


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

1 回复

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


当然,下面是一个关于如何使用 advance_pdf_viewer_fork 插件在 Flutter 应用中显示 PDF 文件的示例代码。这个插件是一个流行的 Flutter 插件,用于在应用中嵌入和显示 PDF 文件。

首先,确保你已经在 pubspec.yaml 文件中添加了 advance_pdf_viewer_fork 依赖:

dependencies:
  flutter:
    sdk: flutter
  advance_pdf_viewer_fork: ^x.y.z  # 请替换为最新版本号

然后,运行 flutter pub get 以获取依赖项。

接下来,你可以在你的 Flutter 应用中使用这个插件来显示 PDF 文件。以下是一个简单的示例:

import 'package:flutter/material.dart';
import 'package:advance_pdf_viewer_fork/advance_pdf_viewer_fork.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter PDF Viewer',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: PDFViewerScreen(),
    );
  }
}

class PDFViewerScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('PDF Viewer'),
      ),
      body: Center(
        child: PDFViewer(
          documentPath: 'assets/sample.pdf',  // PDF 文件路径,可以是本地资源或网络 URL
          autoSpacing: false,
          pageFling: true,
          swipeHorizontal: true,
          pageSnap: true,
          nightMode: false,
          autoPlay: false,
          pageController: PageController(initialPage: 0),
          onError: (String error) {
            print("Error loading PDF: $error");
          },
          onRender: (_) {},
          onLoad: (_) {},
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的 Flutter 应用,其中包含一个 PDFViewerScreen 页面。这个页面使用 PDFViewer 小部件来显示一个名为 sample.pdf 的 PDF 文件。

注意几点:

  1. documentPath 参数指定了 PDF 文件的路径。在这个例子中,我们假设 sample.pdf 文件已经作为资产包含在应用中(你需要在 pubspec.yaml 文件的 flutter 部分下的 assets 列表中添加这个文件)。
  2. PDFViewer 小部件接受多个参数,如 autoSpacingpageFlingswipeHorizontal 等,用于配置 PDF 查看器的行为。
  3. onErroronRenderonLoad 是回调函数,分别用于处理加载错误、渲染完成和加载完成事件。

如果你打算从网络 URL 加载 PDF 文件,只需将 documentPath 替换为相应的 URL,例如:

documentPath: 'https://example.com/sample.pdf',

确保你的应用具有访问网络的权限(在 Android 上,你可能需要在 AndroidManifest.xml 文件中添加 <uses-permission android:name="android.permission.INTERNET"/>)。

这个示例代码应该能够帮助你快速上手使用 advance_pdf_viewer_fork 插件来在 Flutter 应用中显示 PDF 文件。如果有更多需求或问题,可以查阅该插件的官方文档以获取更多信息和高级用法。

回到顶部