如何在 Flutter 中从 Web 加载和呈现 PDF 文件
How to load and present a PDF file from the web in Flutter
我正在尝试从 URL 中获取 PDF 文件,并将其显示在我的 Flutter 应用程序中(对于 Android 和 iOS)。
我已经在网上搜索了有关如何在 Flutter 中显示获取的 PDF 文件的答案,但我所能找到的只是如何显示本地预添加的 PDF 文件。
我也搜索过具有相同功能的软件包,但找不到有效的软件包。
示例:
例如,我正在尝试获取 this PDF 文件,并将其显示在我的应用程序的 Flutter 小部件屏幕中。
有谁知道我怎样才能做到这一点?
谢谢!
使用 flutter_pdfview 包。
- 在 android 清单中添加权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- 在pubspec.yaml
添加依赖
dependencies:
flutter:
sdk: flutter
flutter_pdfview: ^1.0.1
http: ^0.12.0+4
path_provider: any
permission_handler: 4.4.0 //For asking permission to load the pdf
- 然后使用PDFView
完整代码:
import 'package:flutter/material.dart';
import 'package:flutter_pdfview/flutter_pdfview.dart';
import 'dart:io';
import 'package:http/http.dart' as http;
import 'package:path_provider/path_provider.dart';
import 'package:permission_handler/permission_handler.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
String urlPDFPath = "";
bool exists = true;
int _totalPages = 0;
int _currentPage = 0;
bool pdfReady = false;
PDFViewController _pdfViewController;
bool loaded = false;
Future<File> getFileFromUrl(String url, {name}) async {
var fileName = 'testonline';
if (name != null) {
fileName = name;
}
try {
var data = await http.get(url);
var bytes = data.bodyBytes;
var dir = await getApplicationDocumentsDirectory();
File file = File("${dir.path}/" + fileName + ".pdf");
print(dir.path);
File urlFile = await file.writeAsBytes(bytes);
return urlFile;
} catch (e) {
throw Exception("Error opening url file");
}
}
void requestPersmission() async {
await PermissionHandler().requestPermissions([PermissionGroup.storage]);
}
@override
void initState() {
requestPersmission();
getFileFromUrl("http://www.africau.edu/images/default/sample.pdf").then(
(value) => {
setState(() {
if (value != null) {
urlPDFPath = value.path;
loaded = true;
exists = true;
} else {
exists = false;
}
})
},
);
super.initState();
}
@override
Widget build(BuildContext context) {
print(urlPDFPath);
if (loaded) {
return Scaffold(
body: PDFView(
filePath: urlPDFPath,
autoSpacing: true,
enableSwipe: true,
pageSnap: true,
swipeHorizontal: true,
nightMode: false,
onError: (e) {
//Show some error message or UI
},
onRender: (_pages) {
setState(() {
_totalPages = _pages;
pdfReady = true;
});
},
onViewCreated: (PDFViewController vc) {
setState(() {
_pdfViewController = vc;
});
},
onPageChanged: (int page, int total) {
setState(() {
_currentPage = page;
});
},
onPageError: (page, e) {},
),
floatingActionButton: Row(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
IconButton(
icon: Icon(Icons.chevron_left),
iconSize: 50,
color: Colors.black,
onPressed: () {
setState(() {
if (_currentPage > 0) {
_currentPage--;
_pdfViewController.setPage(_currentPage);
}
});
},
),
Text(
"${_currentPage + 1}/$_totalPages",
style: TextStyle(color: Colors.black, fontSize: 20),
),
IconButton(
icon: Icon(Icons.chevron_right),
iconSize: 50,
color: Colors.black,
onPressed: () {
setState(() {
if (_currentPage < _totalPages - 1) {
_currentPage++;
_pdfViewController.setPage(_currentPage);
}
});
},
),
],
),
);
} else {
if (exists) {
//Replace with your loading UI
return Scaffold(
appBar: AppBar(
title: Text("Demo"),
),
body: Text(
"Loading..",
style: TextStyle(fontSize: 20),
),
);
} else {
//Replace Error UI
return Scaffold(
appBar: AppBar(
title: Text("Demo"),
),
body: Text(
"PDF Not Available",
style: TextStyle(fontSize: 20),
),
);
}
}
}
}
你可以使用 flutter_cached_pdfview
它是 flutter_pdfview
的超级
获得许多方法来帮助您更快地使用 pdf
这是一个从 URL 查看 pdf 并将其缓存的示例
PDF().cachedFromUrl('http://africau.edu/images/default/sample.pdf'),
并且它具有 flutter_pdfview
的所有功能
我一直在寻找解决这个问题的方法,我尝试了前面答案中提到的方法,但没有得到很好的结果,在搜索和尝试了几个库之后,我找到了一个适用于首先是我,希望对你有帮助 对你也是
syncfusion_flutter_pdfviewer
import 'package:flutter/material.dart';
import 'package:syncfusion_flutter_pdfviewer/pdfviewer.dart';
void main() {
runApp(MaterialApp(
title: 'Syncfusion PDF Viewer Demo',
home: HomePage(),
));
}
/// Represents Homepage for Navigation
class HomePage extends StatefulWidget {
@override
_HomePage createState() => _HomePage();
}
class _HomePage extends State<HomePage> {
final GlobalKey<SfPdfViewerState> _pdfViewerKey = GlobalKey();
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Syncfusion Flutter PDF Viewer'),
actions: <Widget>[
IconButton(
icon: const Icon(
Icons.bookmark,
color: Colors.white,
semanticLabel: 'Bookmark',
),
onPressed: () {
_pdfViewerKey.currentState?.openBookmarkView();
},
),
],
),
body: SfPdfViewer.network(
'https://cdn.syncfusion.com/content/PDFViewer/flutter-
succinctly.pdf',
key: _pdfViewerKey,
),
);
}
}
我正在尝试从 URL 中获取 PDF 文件,并将其显示在我的 Flutter 应用程序中(对于 Android 和 iOS)。
我已经在网上搜索了有关如何在 Flutter 中显示获取的 PDF 文件的答案,但我所能找到的只是如何显示本地预添加的 PDF 文件。
我也搜索过具有相同功能的软件包,但找不到有效的软件包。
示例:
例如,我正在尝试获取 this PDF 文件,并将其显示在我的应用程序的 Flutter 小部件屏幕中。
有谁知道我怎样才能做到这一点?
谢谢!
使用 flutter_pdfview 包。
- 在 android 清单中添加权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- 在pubspec.yaml 添加依赖
dependencies:
flutter:
sdk: flutter
flutter_pdfview: ^1.0.1
http: ^0.12.0+4
path_provider: any
permission_handler: 4.4.0 //For asking permission to load the pdf
- 然后使用PDFView
完整代码:
import 'package:flutter/material.dart';
import 'package:flutter_pdfview/flutter_pdfview.dart';
import 'dart:io';
import 'package:http/http.dart' as http;
import 'package:path_provider/path_provider.dart';
import 'package:permission_handler/permission_handler.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
String urlPDFPath = "";
bool exists = true;
int _totalPages = 0;
int _currentPage = 0;
bool pdfReady = false;
PDFViewController _pdfViewController;
bool loaded = false;
Future<File> getFileFromUrl(String url, {name}) async {
var fileName = 'testonline';
if (name != null) {
fileName = name;
}
try {
var data = await http.get(url);
var bytes = data.bodyBytes;
var dir = await getApplicationDocumentsDirectory();
File file = File("${dir.path}/" + fileName + ".pdf");
print(dir.path);
File urlFile = await file.writeAsBytes(bytes);
return urlFile;
} catch (e) {
throw Exception("Error opening url file");
}
}
void requestPersmission() async {
await PermissionHandler().requestPermissions([PermissionGroup.storage]);
}
@override
void initState() {
requestPersmission();
getFileFromUrl("http://www.africau.edu/images/default/sample.pdf").then(
(value) => {
setState(() {
if (value != null) {
urlPDFPath = value.path;
loaded = true;
exists = true;
} else {
exists = false;
}
})
},
);
super.initState();
}
@override
Widget build(BuildContext context) {
print(urlPDFPath);
if (loaded) {
return Scaffold(
body: PDFView(
filePath: urlPDFPath,
autoSpacing: true,
enableSwipe: true,
pageSnap: true,
swipeHorizontal: true,
nightMode: false,
onError: (e) {
//Show some error message or UI
},
onRender: (_pages) {
setState(() {
_totalPages = _pages;
pdfReady = true;
});
},
onViewCreated: (PDFViewController vc) {
setState(() {
_pdfViewController = vc;
});
},
onPageChanged: (int page, int total) {
setState(() {
_currentPage = page;
});
},
onPageError: (page, e) {},
),
floatingActionButton: Row(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
IconButton(
icon: Icon(Icons.chevron_left),
iconSize: 50,
color: Colors.black,
onPressed: () {
setState(() {
if (_currentPage > 0) {
_currentPage--;
_pdfViewController.setPage(_currentPage);
}
});
},
),
Text(
"${_currentPage + 1}/$_totalPages",
style: TextStyle(color: Colors.black, fontSize: 20),
),
IconButton(
icon: Icon(Icons.chevron_right),
iconSize: 50,
color: Colors.black,
onPressed: () {
setState(() {
if (_currentPage < _totalPages - 1) {
_currentPage++;
_pdfViewController.setPage(_currentPage);
}
});
},
),
],
),
);
} else {
if (exists) {
//Replace with your loading UI
return Scaffold(
appBar: AppBar(
title: Text("Demo"),
),
body: Text(
"Loading..",
style: TextStyle(fontSize: 20),
),
);
} else {
//Replace Error UI
return Scaffold(
appBar: AppBar(
title: Text("Demo"),
),
body: Text(
"PDF Not Available",
style: TextStyle(fontSize: 20),
),
);
}
}
}
}
你可以使用 flutter_cached_pdfview
它是 flutter_pdfview
的超级
获得许多方法来帮助您更快地使用 pdf
这是一个从 URL 查看 pdf 并将其缓存的示例
PDF().cachedFromUrl('http://africau.edu/images/default/sample.pdf'),
并且它具有 flutter_pdfview
的所有功能我一直在寻找解决这个问题的方法,我尝试了前面答案中提到的方法,但没有得到很好的结果,在搜索和尝试了几个库之后,我找到了一个适用于首先是我,希望对你有帮助 对你也是 syncfusion_flutter_pdfviewer
import 'package:flutter/material.dart';
import 'package:syncfusion_flutter_pdfviewer/pdfviewer.dart';
void main() {
runApp(MaterialApp(
title: 'Syncfusion PDF Viewer Demo',
home: HomePage(),
));
}
/// Represents Homepage for Navigation
class HomePage extends StatefulWidget {
@override
_HomePage createState() => _HomePage();
}
class _HomePage extends State<HomePage> {
final GlobalKey<SfPdfViewerState> _pdfViewerKey = GlobalKey();
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Syncfusion Flutter PDF Viewer'),
actions: <Widget>[
IconButton(
icon: const Icon(
Icons.bookmark,
color: Colors.white,
semanticLabel: 'Bookmark',
),
onPressed: () {
_pdfViewerKey.currentState?.openBookmarkView();
},
),
],
),
body: SfPdfViewer.network(
'https://cdn.syncfusion.com/content/PDFViewer/flutter-
succinctly.pdf',
key: _pdfViewerKey,
),
);
}
}