Android 如何本地加载pdf文件

Android 如何本地加载pdf文件,第1张

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

大部分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(1)     .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(6)   //设置默认显示第1页    .onPageChange(this)  //设置翻页监听    .onLoad(this)   //设置加载监听    .onDraw(this)   //绘图监听    .showMinimap(false)  //pdf放大的时候,是否在屏幕的右上角生成小地图    .swipeVertical( false ) //pdf文档翻页是否是垂直翻页,默认是左右滑动翻页    .enableSwipe(true) //是否允许翻页,默认是允许翻页    // .pages( 2,3,4,5 ) //把2,5 过滤掉    .load(); } private voID displayFromfile( file file ) {  pdfVIEw.fromfile(file) //设置pdf文件地址    .defaultPage(6)   //设置默认显示第1页    .onPageChange(this)  //设置翻页监听    .onLoad(this)   //设置加载监听    .onDraw(this)   //绘图监听    .showMinimap(false)  //pdf放大的时候,是否在屏幕的右上角生成小地图    .swipeVertical( false ) //pdf文档翻页是否是垂直翻页,默认是左右滑动翻页    .enableSwipe(true) //是否允许翻页,默认是允许翻    // .pages( 2,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(200);     if (file != null) {      handler.sendEmptyMessage(2);     }    } catch (Exception e) {     e.printstacktrace();     builder.dismiss();     handler.sendEmptyMessage(-1);    }   }  }.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(5000);   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[1024];   int len;   while ((len = bis.read(buffer)) != -1) {    fos.write(buffer,len);    handler.sendEmptyMessage(0);   }   fos.close();   bis.close();   is.close();   return file;  } else {   handler.sendEmptyMessage(-1);   return null;  } } private static Handler handler = new Handler(){  @OverrIDe  public voID handleMessage(Message msg) {   super.handleMessage(msg);   switch (msg.what) {   case 0:    break;   case -1:    //下载失败    Toast.makeText(context,"下载失败,请稍后再试!",Toast.LENGTH_SHORT).show();    break;   case 2:    ddhandle.sendEmptyMessage(100);    break;   default:    break;   }  } };}

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

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

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持编程小技巧!

总结

以上是内存溢出为你收集整理的Android 如何本地加载pdf文件全部内容,希望文章能够帮你解决Android 如何本地加载pdf文件所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1146343.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存