全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Android 如何本地加载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 , 3 , 4 , 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 , 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(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, 0, 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文件  # Android startActivityForResult实例详解  # Android在Fragment中实现监听触摸事件  # Android 使用FragmentTabhost代替Tabhost  # Android数据持久化之File机制分析  # Android数据持久化之Preferences机制详解  # Android利用FlexboxLayout轻松实现流动布局  # android手机端与PC端使用adb forword通信  # Android 中SwipeRefreshLayout与ViewPager滑动事件冲突解决方法  # Android 7.0行为变更 FileUriExposedException解决方法  # 翻页  # 加载  # 是从  # 都是  # 过滤掉  # 这一  # 文档  # 也很  # 可以看到  # 写了  # 再去  # 有两种  # 第三方  # 后会  # 送了  # 方法来  # 机上  # 在手  # 对话框  # 开源 


相关文章: 股票网站制作软件,网上股票怎么开户?  整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?  网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】  网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱?  如何选择香港主机高效搭建外贸独立站?  C++中引用和指针有什么区别?(代码说明)  建站主机空间推荐 高性价比配置与快速部署方案解析  教学网站制作软件,学习*后期制作的网站有哪些?  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  javascript中的try catch异常捕获机制用法分析  建站中国官网:模板定制+SEO优化+建站流程一站式指南  合肥做个网站多少钱,合肥本地有没有比较靠谱的交友平台?  C++如何将C风格字符串(char*)转换为std::string?(代码示例)  宝塔Windows建站如何避免显示默认IIS页面?  C#怎么使用委托和事件 C# delegate与event编程方法  上海网站制作开发公司,上海买房比较好的网站有哪些?  已有域名如何免费搭建网站?  小建面朝正北,A点实际方位是否存在偏差?  如何快速生成可下载的建站源码工具?  武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?  如何通过多用户协作模板快速搭建高效企业网站?  制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?  如何通过宝塔面板实现本地网站访问?  定制建站模板如何实现SEO优化与智能系统配置?18字教程  浅谈Javascript中的Label语句  广东企业建站网站优化与SEO营销核心策略指南  香港服务器如何优化才能显著提升网站加载速度?  建站VPS能否同时实现高效与安全翻墙?  建站之星如何快速生成多端适配网站?  如何制作网站标识牌,动态网站如何制作(教程)?  如何高效生成建站之星成品网站源码?  怎么用手机制作网站链接,dw怎么把手机适应页面变成网页?  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  江苏网站制作公司有哪些,江苏书法考级官方网站?  如何在阿里云完成域名注册与建站?  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  潍坊网站制作公司有哪些,潍坊哪家招聘网站好?  C#如何在一个XML文件中查找并替换文本内容  利用JavaScript实现拖拽改变元素大小  整人网站在线制作软件,整蛊网站退不出去必须要打我是白痴才能出去?  实现虚拟支付需哪些建站技术支撑?  早安海报制作网站推荐大全,企业早安海报怎么每天更换?  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  Python文件管理规范_工程实践说明【指导】  建站之星如何实现PC+手机+微信网站五合一建站?  宿州网站制作公司兴策,安徽省低保查询网站?  制作营销网站公司,淘特是干什么用的?  浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。