Flutter PDF查看插件flutter_lp_pdfview的使用
Flutter PDF查看插件flutter_lp_pdfview的使用
Native PDF View for iOS and Android
使用此包作为库
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
iOS (仅支持 > 11.0)
示例代码
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
更多关于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