溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Android應(yīng)用中怎么對本地pdf文件進(jìn)行加載

發(fā)布時(shí)間:2020-12-04 16:01:34 來源:億速云 閱讀:215 作者:Leah 欄目:移動開發(fā)

這篇文章給大家介紹Android應(yīng)用中怎么對本地pdf文件進(jìn)行加載,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

大部分app打開pdf文件是通過intent調(diào)起手機(jī)中能打開pdf文件的工具,來查看pdf文件,如果需求是,用戶在app內(nèi)下載好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文件,為了節(jié)省用戶資源,在每次下載之前檢查一下本地是否有該pdf文件,如果有直接打開,沒有的話再去下載。

這里我寫了一個(gè)加載中的對話框,打開過程中和下載過程中用的都是這一個(gè)

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文件的絕對路徑,//標(biāo)題))
     .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) //設(shè)置pdf文件地址
    .defaultPage(6)   //設(shè)置默認(rèn)顯示第1頁
    .onPageChange(this)  //設(shè)置翻頁監(jiān)聽
    .onLoad(this)   //設(shè)置加載監(jiān)聽
    .onDraw(this)   //繪圖監(jiān)聽
    .showMinimap(false)  //pdf放大的時(shí)候,是否在屏幕的右上角生成小地圖
    .swipeVertical( false ) //pdf文檔翻頁是否是垂直翻頁,默認(rèn)是左右滑動翻頁
    .enableSwipe(true) //是否允許翻頁,默認(rèn)是允許翻頁
    // .pages( 2 , 3 , 4 , 5 ) //把2 , 3 , 4 , 5 過濾掉
    .load();
 }

 private void displayFromFile( File file ) {
  pdfView.fromFile(file) //設(shè)置pdf文件地址
    .defaultPage(6)   //設(shè)置默認(rèn)顯示第1頁
    .onPageChange(this)  //設(shè)置翻頁監(jiān)聽
    .onLoad(this)   //設(shè)置加載監(jiān)聽
    .onDraw(this)   //繪圖監(jiān)聽
    .showMinimap(false)  //pdf放大的時(shí)候,是否在屏幕的右上角生成小地圖
    .swipeVertical( false ) //pdf文檔翻頁是否是垂直翻頁,默認(rèn)是左右滑動翻頁
    .enableSwipe(true) //是否允許翻頁,默認(rèn)是允許翻
    // .pages( 2 , 3 , 4 , 5 ) //把2 , 3 , 4 , 5 過濾掉
    .load();
 }

本地沒有pdf文件,需要從服務(wù)端獲取,

 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 {
  // 如果相等的話表示當(dāng)前的sdcard掛載在手機(jī)上并且是可用的
  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問價(jià)下載成功的時(shí)候handler.sendEmptyMessage(2);,當(dāng)case為2的時(shí)候,通過調(diào)用該工具類的頁面?zhèn)鬟^來的ddhandle重新發(fā)送了一個(gè)消息,

調(diào)用界面收到消息后會重新調(diào)用refushUI();這個(gè)方法來打開pdf文件。

關(guān)于Android應(yīng)用中怎么對本地pdf文件進(jìn)行加載就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI