flutter pdf 文件浏览
说明
flutter_full_pdf_viewer 可以实现从网络上下载 pdf 文件并且显示出来。
包地址:flutter_full_pdf_viewer: ^1.0.6
使用方法
1.在 pubspec.yaml 文件中添加如下的包:
dependencies:
# pdf 阅读器
flutter_full_pdf_viewer: ^1.0.6
# 获取系统目录,因为从网络获取的pdf文件,需要保存到手机,所以需要用到这个包
path_provider: ^1.5.0
2.官方demo:
import 'dart:async';
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_full_pdf_viewer/full_pdf_viewer_scaffold.dart';
import 'package:path_provider/path_provider.dart';
void main() {
runApp(MaterialApp(
title: 'Plugin example app',
home: MyApp(),
));
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => new _MyAppState();
}
class _MyAppState extends State<MyApp> {
String pathPDF = "";
@override
void initState() {
super.initState();
createFileOfPdfUrl().then((f) {
setState(() {
pathPDF = f.path;
print(pathPDF);
});
});
}
Future<File> createFileOfPdfUrl() async {
final url = "http://africau.edu/images/default/sample.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);
String dir = (await getApplicationDocumentsDirectory()).path;
File file = new File('$dir/$filename');
await file.writeAsBytes(bytes);
return file;
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Plugin example app')),
body: Center(
child: RaisedButton(
child: Text("Open PDF"),
onPressed: () => Navigator.push(
context,
MaterialPageRoute(builder: (context) => PDFScreen(pathPDF)),
),
),
),
);
}
}
/// /////////////////////////// 显示 pdf 图文件 //////////////////////////// ///
class PDFScreen extends StatelessWidget {
String pathPDF = "";
PDFScreen(this.pathPDF);
@override
Widget build(BuildContext context) {
return PDFViewerScaffold(
appBar: AppBar(
title: Text("Document"),
actions: <Widget>[
IconButton(
icon: Icon(Icons.share),
onPressed: () {},
),
],
),
path: pathPDF,
);
}
}
3.官方demo 显示效果:

源码解析
主要有两个源码文件,分别是 full_pdf_viewer_plugin.dart 和 full_pdf_viewer_scaffold.dart 文件
1.full_pdf_viewer_plugin.dart
import 'dart:async';
import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
enum PDFViewState { shouldStart, startLoad, finishLoad }
class PDFViewerPlugin {
final _channel = const MethodChannel("flutter_full_pdf_viewer");
static PDFViewerPlugin _instance;
factory PDFViewerPlugin() => _instance ??= new PDFViewerPlugin._();
PDFViewerPlugin._() {
_channel.setMethodCallHandler(_handleMessages);
}
final _onDestroy = new StreamController<Null>.broadcast();
Stream<Null> get onDestroy => _onDestroy.stream;
Future<Null> _handleMessages(MethodCall call) async {
switch (call.method) {
case 'onDestroy':
_onDestroy.add(null);
break;
}
}
Future<Null> launch(String path, {Rect rect}) async {
final args = <String, dynamic>{'path': path};
if (rect != null) {
args['rect'] = {
'left': rect.left,
'top': rect.top,
'width': rect.width,
'height': rect.height
};
}
await _channel.invokeMethod('launch', args);
}
/// Close the PDFViewer
/// Will trigger the [onDestroy] event
Future close() => _channel.invokeMethod('close');
/// adds the plugin as ActivityResultListener
/// Only needed and used on Android
Future registerAcitivityResultListener() =>
_channel.invokeMethod('registerAcitivityResultListener');
/// removes the plugin as ActivityResultListener
/// Only needed and used on Android
Future removeAcitivityResultListener() =>
_channel.invokeMethod('removeAcitivityResultListener');
/// Close all Streams
void dispose() {
_onDestroy.close();
_instance = null;
}
/// resize PDFViewer
Future<Null> resize(Rect rect) async {
final args = {};
args['rect'] = {
'left': rect.left,
'top': rect.top,
'width': rect.width,
'height': rect.height
};
await _channel.invokeMethod('resize', args);
}
}
2.full_pdf_viewer_scaffold.dart
其实笔者在实际的使用过程中,是把它提取出来使用的,这样做是为了可以修改源码,让他符合自己的使用场景。当pdf不是全屏显示时,就会遇到状态栏、导航栏高度的问题,可以看笔者写的这篇文章。
import 'dart:async';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_full_pdf_viewer/full_pdf_viewer_plugin.dart';
class PDFViewerScaffold extends StatefulWidget {
final PreferredSizeWidget appBar;
final String path;
final bool primary;
const PDFViewerScaffold({
Key key,
this.appBar,
@required this.path,
this.primary = true,
}) : super(key: key);
@override
_PDFViewScaffoldState createState() => new _PDFViewScaffoldState();
}
class _PDFViewScaffoldState extends State<PDFViewerScaffold> {
final pdfViwerRef = new PDFViewerPlugin();
Rect _rect;
Timer _resizeTimer;
@override
void initState() {
super.initState();
pdfViwerRef.close();
}
@override
void dispose() {
super.dispose();
pdfViwerRef.close();
pdfViwerRef.dispose();
}
@override
Widget build(BuildContext context) {
if (_rect == null) {
_rect = _buildRect(context);
pdfViwerRef.launch(
widget.path,
rect: _rect,
);
} else {
final rect = _buildRect(context);
if (_rect != rect) {
_rect = rect;
_resizeTimer?.cancel();
_resizeTimer = new Timer(new Duration(milliseconds: 300), () {
pdfViwerRef.resize(_rect);
});
}
}
return new Scaffold(
appBar: widget.appBar,
body: const Center(child: const CircularProgressIndicator()));
}
Rect _buildRect(BuildContext context) {
final fullscreen = widget.appBar == null;
final mediaQuery = MediaQuery.of(context);
final topPadding = widget.primary ? mediaQuery.padding.top : 0.0;
final top =
fullscreen ? 0.0 : widget.appBar.preferredSize.height + topPadding;
var height = mediaQuery.size.height - top;
if (height < 0.0) {
height = 0.0;
}
return new Rect.fromLTWH(0.0, top, mediaQuery.size.width, height);
}
}
原文:http://www.luyixian.cn/news_show_398459.aspx
flutter pdf 文件浏览的更多相关文章
- asp.net网页中上传并且浏览pdf文件的实现
本文主要讲解在asp.net中的gridview中浏览pdf文件.下面来看一下具体的实现: 第一步,使用sqlserver 创建一个数据库表. 第二步,新建一个webform,命名为uploadpdf ...
- https://github.com/Lushenggang/show-pdf在线浏览pdf文件在线浏览pdf文件
在线浏览pdf文件 https://github.com/Lushenggang/show-pdf https://github.com/Lushenggang/show-pdf
- web中浏览PDF文件
1.在web中浏览pdf文件. 2.支持大多数主流浏览器,包括IE8 3.参考网址: https://pdfobject.com/ http://mozilla.github.io/pdf.js/ & ...
- WPF 浏览PDF 文件
添加成功后会在工具箱里看到下图所示的控件.打开VS2010,新建项目(WpfPDFReader),右键项目添加User Control(用户控件).因为Adobe PDF Reader COM 组件是 ...
- 在线打开,浏览PDF文件的各种方式及各种pdf插件------(MS OneDrive/google drive & google doc/ github ?raw=true)
在线打开,浏览PDF文件的各种方式: 1 Google drive&doc (国内不好使,you know GFW=Great Firewall) 1. google drive: 直接分 ...
- 在线浏览pdf文件,pdfobject的简单使用
该js插件,官网有详细的使用教程(网址:http://www.pdfobject.com/examples/).打开里面的例子后,查看新打开页面,打开并查看该页面的源代码. 需要的材料: 1.PDFo ...
- 怎么用ABBYY在线浏览PDF文件
ABBYY FineReader 让您可以从在线存储服务中打开图像或 PDF 文件,并将已识别文本保存至在线存储服务中,如 Dropbox.SkyDrive 或 Google Drive 等.通过在 ...
- C#如何在PDF文件添加图片印章
文档中添加印章可以起一定的作用,比如,防止文件随意被使用,或者确保文档内容的安全性和权威性.C#添加图片印章其实也有很多实现方法,这里我使用的是免费的第三方软件Free Spire.PDF,向大家阐述 ...
- C# 给PDF文件添加水印
水印种类及功能介绍 PDF水印分为两种:文本水印和图片水印.文本水印一般被用在商业领域,提醒读者该文档是受版权保护的,其他人不能抄袭或者免费使用.除了这个特征,水印还可以用来标记这个文档 的一些基 ...
随机推荐
- kali下一些代理工具的简单描述
前言 最近几天了解了kali中一些代理工具的基本使用,做一个小小的总结,kali操作系统的官网为 www.kali.org,感兴趣的可以去官网下载镜像,如何安装这里就不在讲解了,百度有很多教程.新手这 ...
- 让SpringBoot自动化配置不再神秘
本文若有任何纰漏.错误,还请不吝指出! 注:本文提到的Spring容器或者Bean容器,或者Spring Bean容器,都是指同一个事情,那就是代指BeanFactory.关于BeanFactory, ...
- 二、HTML基础标签4个
标题标签<h1> —— <h6> <!DOCTYPE html> <html> <head> <meta charset=" ...
- Django + Celery 实现动态配置定时任务
哈喽,今天给大家分享一篇Django+Celery实现动态配置定时任务,因为最近也是无意间看到一位大佬关于这块的文章,然后自己觉得不错,也想学习写一下,然后最终实现功能是在前端页面统一管理计划任务,大 ...
- Java学习大纲-0412更新
非科班报培训班学习Java,从博客园,知乎,CNDS上搜了一圈,暂时按以下计划执行,有问题随时更新--0412 1.培训班的课程按时按点学习完成(毕竟掏钱在学的是不,不好好听亏不亏...) keys: ...
- 获取MP4媒体文件时长
由于之前上传MP4文件没有保存视频时长,现在有需要,所以只好写代码读取时长.找了几个发现是 c/c++ 实现,或者是借助 FFmpeg 实现. 一个偶然在 GitHub 上面发现一个 c 文件,由于获 ...
- sql语句中的删除操作
drop: drop table tb; 删除内容和定义,释放空间.简单来说就是把整个表去掉.以后不能再新增数据,除非新增一个表. truncate: truncate table tb; 删除内容. ...
- 用python编写测试脚本
def f(n): """ >>>f(1) 1用例 >>>f(2) 2用例 ...... >>>f(n) n用例 & ...
- DQN(Deep Q-learning)入门教程(五)之DQN介绍
简介 DQN--Deep Q-learning.在上一篇博客DQN(Deep Q-learning)入门教程(四)之Q-learning Play Flappy Bird 中,我们使用Q-Table来 ...
- 如何基于 echarts 在柱状图或条形图上实现转换率?(有想法吗?)
目录 需求 探索一 探索二 探索三 转换实践思路1 转换实践思路2 其他思路 探索四(揭晓答案) 答案篇说明 backgroundColor 用法 双柱合一 始终在轴的中间 百分在变,但是距离轴的距离 ...