大部分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文件所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)