Flutter PDF查看插件flutter_lp_pdfview的使用

Flutter PDF查看插件flutter_lp_pdfview的使用

Native PDF View for iOS and Android

xscode

使用此包作为库

1. 依赖它

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

dependencies:
  flutter_lp_pdfview: ^3.0.1

2. 安装它

可以通过命令行安装包:

通过 Flutter:

$ flutter packages get

或者,您的编辑器可能支持 pub get 或 flutter packages get。请查阅您的编辑器文档以了解更多信息。

3. 配置

iOS

通过在应用的 Info.plist 文件中添加一个布尔属性来启用嵌入式视图预览,键为 io.flutter.embedded_views_preview,值为 YES。

<!-- Info.plist -->
...
<key>io.flutter.embedded_views_preview</key>
<true/>
...

4. 导入它

在 Dart 代码中使用:

import 'package:flutter_lp_pdfview/flutter_lp_pdfview.dart';

选项

名称 Android iOS 默认值
defaultPage ✅ ✅ 0
onViewCreated ✅ ✅ null
onRender ✅ ✅ null
onPageChanged ✅ ✅ null
onError ✅ ✅ null
onPageError ✅ ❌ null
onLinkHandle ✅ ✅ null
gestureRecognizers ✅ ✅ null
filePath ✅ ✅
pdfData ✅ ✅
fitPolicy ✅ ❌ FitPolicy.WIDTH
enableSwipe ✅ ✅ true
swipeHorizontal ✅ ✅ false
password ✅ ✅ null
nightMode ✅ ❌ false
autoSpacing ✅ ✅ true
pageFling ✅ ✅ true
pageSnap ✅ ❌ true
preventLinkNavigation ✅ ✅ false

控制器选项

名称 描述 参数 返回值
getPageCount 获取总页数 - Future<int>
getCurrentPage 获取当前页 - Future<int>
setPage 跳转到指定页 int page Future<bool>

示例

PDFView(
  filePath: path,
  enableSwipe: true,
  swipeHorizontal: true,
  autoSpacing: false,
  pageFling: false,
  onRender: (_pages) {
    setState(() {
      pages = _pages;
      isReady = true;
    });
  },
  onError: (error) {
    print(error.toString());
  },
  onPageError: (page, error) {
    print('$page: ${error.toString()}');
  },
  onViewCreated: (PDFViewController pdfViewController) {
    _controller.complete(pdfViewController);
  },
  onPageChanged: (int page, int total) {
    print('page change: $page/$total');
  },
),

生产环境使用

如果您使用 ProGuard,请包含以下行:

-keep class com.shockwave.**

依赖项

Android

AndroidPdfViewer

iOS (仅支持 > 11.0)

PDFKit


示例代码

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_lp_pdfview/flutter_lp_pdfview.dart';

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

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

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

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

    createFileOfPdfUrl().then((f) {
      setState(() {
        remotePDFpath = f.path;
      });
    });
  }

  Future<File> createFileOfPdfUrl() async {
    Completer<File> completer = Completer();
    print("Start download file from internet!");
    try {
      // "https://berlin2017.droidcon.cod.newthinking.net/sites/global.droidcon.cod.newthinking.net/files/media/documents/Flutter%20-%2060FPS%20UI%20of%20the%20future%20%20-%20DroidconDE%2017.pdf";
      // final url = "https://pdfkit.org/docs/guide.pdf";
      final url = "http://www.pdf995.com/samples/pdf.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);
      var dir = await getApplicationDocumentsDirectory();
      print("Download files");
      print("${dir.path}/$filename");
      File file = File("${dir.path}/$filename");

      await file.writeAsBytes(bytes, flush: true);
      completer.complete(file);
    } catch (e) {
      throw Exception('Error parsing asset file!');
    }

    return completer.future;
  }

  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 || pathPDF.isNotEmpty) {
                      Navigator.push(
                        context,
                        MaterialPageRoute(
                          builder: (context) => PDFScreen(path: pathPDF),
                        ),
                      );
                    }
                  },
                ),
                RaisedButton(
                  child: Text("Open Landscape PDF"),
                  onPressed: () {
                    if (landscapePathPdf != null || landscapePathPdf.isNotEmpty) {
                      Navigator.push(
                        context,
                        MaterialPageRoute(
                          builder: (context) => PDFScreen(path: landscapePathPdf),
                        ),
                      );
                    }
                  },
                ),
                RaisedButton(
                  child: Text("Remote PDF"),
                  onPressed: () {
                    if (remotePDFpath != null || remotePDFpath.isNotEmpty) {
                      Navigator.push(
                        context,
                        MaterialPageRoute(
                          builder: (context) => PDFScreen(path: remotePDFpath),
                        ),
                      );
                    }
                  },
                ),
                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, this.path = ""}) : super(key: key);

  _PDFScreenState createState() => _PDFScreenState();
}

class _PDFScreenState extends State<PDFScreen> with WidgetsBindingObserver {
  final Completer<PDFViewController> _controller =
      Completer<PDFViewController>();
  int pages = 0;
  int currentPage = 0;
  bool isReady = false;
  String errorMessage = '';

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Document"),
        actions: <Widget>[
          IconButton(
            icon: Icon(Icons.share),
            onPressed: () {},
          ),
        ],
      ),
      body: Stack(
        children: <Widget>[
          PDFView(
            filePath: widget.path,
            enableSwipe: true,
            swipeHorizontal: true,
            autoSpacing: false,
            pageFling: true,
            pageSnap: true,
            defaultPage: currentPage,
            fitPolicy: FitPolicy.BOTH,
            preventLinkNavigation:
                false, // 如果设置为 true,则链接将在 flutter 中处理
            backgroundColor: 0xFF1C1C1E,
            onRender: (_pages) {
              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);
            },
            onLinkHandler: (String uri) {
              print('goto uri: $uri');
            },
            onPageChanged: (int page, int total) {
              print('page change: $page/$total');
              setState(() {
                currentPage = page;
              });
            },
          ),
          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 {
                await snapshot.data?.setPage(pages ~/ 2);
              },
            );
          }

          return Container();
        },
      ),
    );
  }
}

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

1 回复

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


flutter_lp_pdfview 是一个用于在 Flutter 应用中查看 PDF 文件的插件。它基于 PDFView,并提供了简单易用的 API 来加载和显示 PDF 文件。以下是如何在 Flutter 项目中使用 flutter_lp_pdfview 的基本步骤。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  flutter_lp_pdfview: ^1.0.0  # 请检查最新版本

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

2. 导入包

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

import 'package:flutter_lp_pdfview/flutter_lp_pdfview.dart';

3. 使用 LPPDFView 组件

你可以使用 LPPDFView 组件来显示 PDF 文件。以下是一个简单的示例:

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

class PDFViewerScreen extends StatelessWidget {
  final String pdfUrl;

  PDFViewerScreen({required this.pdfUrl});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('PDF Viewer'),
      ),
      body: LPPDFView(
        filePath: pdfUrl,
        onError: (error) {
          print("Error loading PDF: $error");
        },
        onPageChanged: (int page, int total) {
          print("Page changed: $page/$total");
        },
      ),
    );
  }
}

4. 导航到 PDF 查看页面

你可以在应用的其他部分导航到这个 PDFViewerScreen,并传递 PDF 文件的 URL 或路径:

Navigator.push(
  context,
  MaterialPageRoute(
    builder: (context) => PDFViewerScreen(pdfUrl: 'https://example.com/sample.pdf'),
  ),
);

5. 处理本地文件

如果你想加载本地 PDF 文件,可以使用 filePath 参数传递本地文件的路径:

LPPDFView(
  filePath: 'assets/sample.pdf',
  onError: (error) {
    print("Error loading PDF: $error");
  },
  onPageChanged: (int page, int total) {
    print("Page changed: $page/$total");
  },
);

确保在 pubspec.yaml 中正确配置了 assets:

flutter:
  assets:
    - assets/sample.pdf
回到顶部