大部分app打开pdf文件是通过intent调起手机中能打开pdf文件的工具,来查看pdf文件,如果需求是,用户在app内下载好pdf文件后,不通过第三方的工具,本地打开。

这样的需求要怎么实现呢?上网查了一些资料,发现了一个很好用PDF开源库。

使用起来也很简单,首先添加PDFView的引用

compile 'com.github.barteksc:android-pdf-viewer:2.4.0'

布局中引用PdfView

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"> <include layout="@layout/common_title" /> <com.github.barteksc.pdfviewer.PDFView
android:id="@+id/pdf_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>

接下来就是下载pdf文件,为了节省用户资源,在每次下载之前检查一下本地是否有该pdf文件,如果有直接打开,没有的话再去下载。

这里我写了一个加载中的对话框,打开过程中和下载过程中用的都是这一个

if (CheckFileExist(title)){
builderShow = new CustomDialog(ShowPDFActivity.this);
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.dialog_pdf_progress_new, null);
builderShow.setContentView(view);
builderShow.show();
isDownload=false;
refushUI();
}else {
isDownload=true;
DownLoadPDF.getInstance().downLoadPDF(ShowPDFActivity.this, //下载路径); }

如果本地有pdf文件,则开始加载pdf文件,refushUI();

    public void refushUI(){
try {
pdfView.fromFile(new File(//pdf文件的绝对路径,//标题))
.defaultPage()
.enableAnnotationRendering(false)
.onLoad(new OnLoadCompleteListener() {
@Override
public void loadComplete(int nbPages) {
if (isDownload){
DownLoadPDF.getInstance().closeDilaoig();
}
if (builderShow != null&&builderShow.isShowing()) {
builderShow.dismiss();
}
}
})
.scrollHandle(null)
.load();
}catch (Exception e){
e.printStackTrace();
}
}

PDFView加载pdf文件有两种形式,一种是从文件中读取,还有一种就是从assets目录中读取

    private void displayFromAssets(String assetFileName ) {
pdfView.fromAsset(assetFileName) //设置pdf文件地址
.defaultPage() //设置默认显示第1页
.onPageChange(this) //设置翻页监听
.onLoad(this) //设置加载监听
.onDraw(this) //绘图监听
.showMinimap(false) //pdf放大的时候,是否在屏幕的右上角生成小地图
.swipeVertical( false ) //pdf文档翻页是否是垂直翻页,默认是左右滑动翻页
.enableSwipe(true) //是否允许翻页,默认是允许翻页
// .pages( 2 , 3 , 4 , 5 ) //把2 , 3 , 4 , 5 过滤掉
.load();
} private void displayFromFile( File file ) {
pdfView.fromFile(file) //设置pdf文件地址
.defaultPage() //设置默认显示第1页
.onPageChange(this) //设置翻页监听
.onLoad(this) //设置加载监听
.onDraw(this) //绘图监听
.showMinimap(false) //pdf放大的时候,是否在屏幕的右上角生成小地图
.swipeVertical( false ) //pdf文档翻页是否是垂直翻页,默认是左右滑动翻页
.enableSwipe(true) //是否允许翻页,默认是允许翻
// .pages( 2 , 3 , 4 , 5 ) //把2 , 3 , 4 , 5 过滤掉
.load();
}

本地没有pdf文件,需要从服务端获取, DownLoadPDF.getInstance().downLoadPDF(ShowPDFActivity.this, //下载路径);

public class DownLoadPDF {
private static Context context;
private static File file ;
private static CustomDialog builder = null ;
private static Handler ddhandle;
private static DownLoadPDF instance = null;
public static DownLoadPDF getInstance(){
if(instance==null){
synchronized (DownLoadPDF.class){
if(instance==null){
instance = new DownLoadPDF();
}
}
}
return instance;
}
public void downLoadPDF(final Context con, final String url, final String title, final Handler ddhandler) {
ddhandle = ddhandler;
context = con;
builder = new CustomDialog(con);
LayoutInflater inflater = (LayoutInflater) con.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.dialog_pdf_progress_new, null);
builder.setContentView(view);
builder.show(); new Thread() {
@Override
public void run() {
try {
file = getFileFromServer(url,title);
sleep();
if (file != null) {
handler.sendEmptyMessage();
}
} catch (Exception e) {
e.printStackTrace();
builder.dismiss();
handler.sendEmptyMessage(-);
}
}
}.start();
}
public void closeDilaoig(){
if (builder != null&&builder.isShowing()) {
builder.dismiss();
}
}public static int length ;
public static File getFileFromServer(String path,String title)
throws Exception {
// 如果相等的话表示当前的sdcard挂载在手机上并且是可用的
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout();
conn.setDoInput(true);
conn.connect();
length = conn.getContentLength();
InputStream is = conn.getInputStream();
//将pdf文件存储在指定文件夹下
File filePath = new File(//指定文件夹路径);
if (!filePath.exists()){
filePath.mkdir();
}
File file = new File(filePath , title+".pdf");
FileOutputStream fos = new FileOutputStream(file);
BufferedInputStream bis = new BufferedInputStream(is);
byte[] buffer = new byte[];
int len;
while ((len = bis.read(buffer)) != -) {
fos.write(buffer, , len);
handler.sendEmptyMessage();
}
fos.close();
bis.close();
is.close();
return file;
} else {
handler.sendEmptyMessage(-);
return null;
}
}
private static Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case :
break;
case -:
//下载失败
Toast.makeText(context, "下载失败,请稍后再试!", Toast.LENGTH_SHORT).show();
break;
case :
ddhandle.sendEmptyMessage();
break;
default:
break;
}
} };
}

大家可以看到,在pdf问价下载成功的时候handler.sendEmptyMessage(2);,当case为2的时候,通过调用该工具类的页面传过来的ddhandle重新发送了一个消息,

调用界面收到消息后会重新调用refushUI();这个方法来打开pdf文件。

以上就是我对本地加载pdf文件方法的总结,如果大家在使用的过程中有不理解或错误的地方,欢迎骚扰!

Android 如何本地加载pdf文件的更多相关文章

  1. cordova程序加载pdf文件的2种方法(ios/android)

    前言 公司目前的前端架构是微信端由vue全家桶负责h5网站的单页应用,android端和ios端则选择cordova打包成apk和app.其中,有一个业务逻辑是点击某个链接进入pdf的展示,h5的方案 ...

  2. Android studio 使用心得(六)—android studio 如何加载.so文件

    之前一直没怎么注意,以为.so文件android为像eclipse一样直接加载,但是直到昨天我在android studio上调试公司项目推送消息的时候,才发现,.so文件原来没有加载成功. 可能之前 ...

  3. 使用 pdf.js 在网页中加载 pdf 文件

    在网页中加载并显示PDF文件是最常见的业务需求.例如以下应用场景:(1)在电商网站上购物之后,下载电子发票之前先预览发票.(2)电子商务管理系统中查看发布的公文,公文文件一般是PDF格式的文件. 目前 ...

  4. android使用webview加载flash文件

    android 字段webview几乎实现了浏览器的全部功能,最近在使用webview加载不固定格式的文章,文章中有一部分嵌入了flash,下面就是webview可以进行视频需要进行的设置,代码如下: ...

  5. IOS加载PDF文件

    今天的任务是:在iOS上加载显示pdf文件. 方法一:利用webview -(void)loadDocument:(NSString *)documentName inView:(UIWebView  ...

  6. iOS 本地加载js文件

    #import "RootViewController.h" @interface RootViewController ()<UIWebViewDelegate> @ ...

  7. 【Android Studio】 加载so文件异常

    AS无法加载so包异常 android studio导入so包异常:Couldn't load DeviceAPI from loader dalvik.system.PathClassLoader[ ...

  8. .net使用pdfobject.js加载pdf文件

    1.下载pdfobject.js文件 2. <script type="text/javascript" src="<%= Application[" ...

  9. JavaEE SSH集成框架(两) struts2 本地加载dtd文件,action组态

    1. 载入中struts2的dtd文件.使struts.xml网络无法验证,和eclipse有技巧 在src在创建struts.xml: <? xmlversion="1.0" ...

随机推荐

  1. Solr commit 策略测试

    已知Solr 的Commit策略: 服务器端: 1)AutoCommit 2)AutoSoftCommit 客户端 Commit 本次我测试了客户端关闭Commit的情况下,服务器端Commit策略的 ...

  2. RabbitMQ-从基础到实战(1)— Hello RabbitMQ

    转载请注明出处 1.简介 本篇博文介绍了在windows平台下安装RabbitMQ Server端,并用JAVA代码实现收发消息 2.安装RabbitMQ RabbitMQ是用Erlang开发的,所以 ...

  3. 因为本地没有配置 localhost 导致的 eclipse 的奇葩问题

    因为电脑没有配置 127.0.0.1 localhost,已经碰到两次奇葩问题了. 问题一: 我的博文http://www.cnblogs.com/sonofelice/p/5143746.html中 ...

  4. C++标准库之vector(各函数及其使用全)

    原创作品,转载请注明出处:http://www.cnblogs.com/shrimp-can/p/5280566.html iterator类型: iterator:到value_type的访问,va ...

  5. spring-AOP-基于@AspectJ切面的小例子

    条件: 1.jdk的版本在5.0或者以上,否则无法使用注解技术 2.jar包: aspectjweaver-1.7.4.jar aspectjrt-1.7.4.jar spring-framework ...

  6. 实用 .htaccess 用法大全

    这里收集的是各种实用的 .htaccess 代码片段,你能想到的用法几乎全在这里. 免责声明: 虽然将这些代码片段直接拷贝到你的 .htaccess 文件里,绝大多数情况下都是好用的,但也有极个别情况 ...

  7. Python可视化学习(1):Matplotlib的配置

    Matplotlib是一个优秀的可视化库,它提供了丰富的接口,让Python的可视化落地显得非常容易上手.本系列是本人学习python可视化的学习笔记,主要用于监督自己的学习进度,同时也希望和相关的博 ...

  8. 实验楼-3-Linux用户及用户组

    获得自己用户名 $ who am i $ whoami pts/0 : 伪终端/序号 root操作:sudo Firstly,知道当前登录用户的密码:Secondly,当前用户在sudo用户组 添加新 ...

  9. Sublime Text前端开发环境配置

    Sublime Text是前端开发不可不说的编辑器,本文以Sublime Text 3为例讲解一下如何搭建前端的开发环境. 下载Sublime Text 3 下载地址 #==> Sublime ...

  10. Solr6.5在Centos6上的安装与配置 (一)

    这篇文章主要是介绍在Centos6上Solr6.5的安装与配置. 一.安装准备及各软件使用版本说明: 1.JDK8,版本jdk1.8.0_121下载地址:jdk-8u121-linux-x64.tar ...