Flutter PDF查看插件chakre_pdf_viewer的使用

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

Flutter PDF查看插件chakre_pdf_viewer的使用

chakre_pdf_viewer 是一个用于处理PDF文件的Flutter插件。它支持Android和iOS平台,最初是从 pdf_viewer 叉出来的,而后者又是从 pdf_viewerflutter_plugin_pdf_viewer 叉出来的。

安装

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

dependencies:
  chakre_pdf_viewer: any

Android

无需权限。使用应用缓存目录。

iOS

无需权限。

使用方法

加载PDF

你可以从资产、URL或文件加载PDF文档:

// 从资产加载
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);

加载页面

你可以加载特定的页面:

// 加载特定页面
PDFPage pageOne = await doc.get(page: _number);

预构建的查看器

使用预构建的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

显示页面选择器

你可以在对话框中显示页面选择器:

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

Demo Screenshot 2

待办事项

  • 允许密码保护的文件

第三方包

名称 描述
path_provider 一个Flutter插件,用于查找文件系统上常用的位置。支持iOS和Android。
flutter_cache_manager 一个CacheManager,用于下载并缓存应用程序缓存目录中的文件。可以更改文件保留时间的各种设置。
numberpicker NumberPicker是一个自定义小部件,用于通过滚动选择器选择整数或小数。

示例代码

以下是一个完整的示例代码,展示了如何使用 chakre_pdf_viewer 插件:

import 'package:chakre_pdf_viewer/chakre_pdf_viewer.dart';
import 'package:flutter/material.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(int value) async {
    setState(() => _isLoading = true);
    if (value == 1) {
      document = await PDFDocument.fromAsset('assets/sample2.pdf');
    } else if (value == 2) {
      document = await PDFDocument.fromURL("https://www.africau.edu/images/default/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,
                            // 取消注释下面的行以预加载所有页面
                            // lazyLoad: false,
                            // 取消注释下面的行以垂直滚动
                            // scrollDirection: Axis.vertical,

                            // enableSwipeNavigation: false,
                            showPicker: true,
                            showNavigation: true,
                            // 取消注释下面的代码以替换底部导航
                            /* 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,
                        ),
                ),
        ],
      ),
    );
  }
}

希望这个示例对你有帮助!如果有任何问题或需要进一步的帮助,请随时提问。


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

1 回复

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


当然,下面是一个关于如何使用 chakre_pdf_viewer 插件在 Flutter 应用中查看 PDF 文件的示例代码。这个插件允许你在 Flutter 应用中嵌入和显示 PDF 文件。

首先,你需要在你的 pubspec.yaml 文件中添加 chakre_pdf_viewer 依赖项:

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

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

接下来,在你的 Flutter 应用中,你可以使用以下代码来显示 PDF 文件:

import 'package:flutter/material.dart';
import 'package:chakre_pdf_viewer/chakre_pdf_viewer.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 {
  final String pdfAssetPath = 'assets/sample.pdf'; // 确保在pubspec.yaml中声明了此资源

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('PDF Viewer'),
      ),
      body: Center(
        child: PDFViewer(
          pdfAssetPath: pdfAssetPath,
          enableSwipe: true,
          autoSpacing: true,
          pageFling: true,
          pageSnap: true,
          nightMode: false,
          defaultPage: 0,
          onError: (error) {
            print("Error loading PDF: $error");
          },
          onLoad: (pageCount) {
            print("PDF loaded with $pageCount pages.");
          },
          onPageChanged: (page, pageCount) {
            print("Page changed: $page/$pageCount");
          },
          onScaleChanged: (scale) {
            print("Scale changed: $scale");
          },
        ),
      ),
    );
  }
}

确保你已经将 PDF 文件添加到项目的 assets 文件夹中,并在 pubspec.yaml 文件中声明该资源:

flutter:
  assets:
    - assets/sample.pdf

在这个示例中,PDFViewer 组件用于显示 PDF 文件。以下是一些关键参数的解释:

  • pdfAssetPath: PDF 文件的路径(相对于 assets 文件夹)。
  • enableSwipe: 是否允许通过滑动来翻页。
  • autoSpacing: 是否自动调整页面间距。
  • pageFling: 是否启用页面的快速翻页效果。
  • pageSnap: 是否在滚动停止时使页面对齐。
  • nightMode: 是否启用夜间模式(黑白反转)。
  • defaultPage: 默认显示的页面索引(从 0 开始)。
  • onError: 当加载 PDF 文件出错时的回调。
  • onLoad: 当 PDF 文件加载完成时的回调,返回页面总数。
  • onPageChanged: 当页面改变时的回调,返回当前页面和总页数。
  • onScaleChanged: 当缩放级别改变时的回调。

以上代码提供了一个基本的 PDF 查看器示例,你可以根据需要进行自定义和扩展。

回到顶部