Android 如何本地載入pdf文件

来源:http://www.cnblogs.com/upwgh/archive/2017/04/27/6774930.html
-Advertisement-
Play Games

大部分app打開pdf文件是通過intent調起手機中能打開pdf文件的工具,來查看pdf文件,如果需求是,用戶在app內下載好pdf文件後,不通過第三方的工具,本地打開。 這樣的需求要怎麼實現呢?上網查了一些資料,發現了一個很好用PDF開源庫。 使用起來也很簡單,首先添加PDFView的引用 ...


大部分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文件。

以上就是我對本地載入pdf文件方法的總結,如果大家在使用的過程中有不理解或錯誤的地方,歡迎騷擾!

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  •   網上有很多關於實現用xib自定義View,那我為什麼還要寫呢?第一,我用他們的方法都沒有實現。第二,用xib遇到了很多問題,想分享給大家。 用xib自定義View:FHCustomView 1.新建UIView 2.建一個 同名 xib : FHCustomView.xib ...
  • 一、View基礎知識 IDE——Integrated Development Environment 集成開發環境,具有多項功能的綜合性編輯環境 XML——Extensible Markup Language 可拓展標記語言,用來描述Android外觀建立佈局。 View—— 屏幕上用來展示內容的矩 ...
  • 問題情形:1.電量跳變到50%或偏差過大2.電池ID腳接地3.溫度腳來判斷電池是否在位 推測原因:判斷電池在位的方法: 先在設備樹查找bpd是否有值 找不到的話,用代碼的定義(通過溫度腳判斷) 把參數配置到結構體中。計算電池容量: 如果電池不在位並且或為假電池,返回預設電量(50)電池在位檢測函數: ...
  • service粘性等的那4種方式試了,三星的可以,小米老款手機可以,新款不行,華為新款也不行,還有魅族什麼的,都不行,新款的手機上都有一個安全中心,只有在安全中心裡面添加上允許app自啟動才可以 怎麼破? 1.用jpush的這個問題就沒得破了 能做的措施他們都做了 定製的rom會有這個問題 沒得破 ...
  • 使用百度地圖有一段時間了,導航是一個一直困擾我的問題。今天剛發現百度地圖的導航SDK並不是對Android6.0版本不相容。而是對某一部分手機不相容,準確的說是對X64或X86的cpu不相容。下載百度的導航DEMO發現在libs文件加下只有一個armeabi文件夾。這裡面存放的是導航功能所需要的動態 ...
  • Unity編譯時找不到AndroidSDK的問題,Android SDK更新引入的問題。 ...
  • Swift、Objective C 單例模式 (Singleton) 本文的單例模式分為 嚴格單例模式 和 不嚴格單例模式 。單例模式要求一個類有一個實例,有公開介面可以訪問這個實例。嚴格單例模式,要求一個類只有一個實例;不嚴格單例模式,可以創建多個實例。 有的類只能有一個實例,例如 UIAppli ...
  • Gradle Gradle本地路徑設置 如果在AndroidStudio內設置了使用local的Gradle路徑,就直接放那邊,啥問題都不會有。如果使用推薦的設置,那麼更新的時候很有可能會有問題。 線上下載Gradle的速度超慢,遇到Gradle問題不要打開Android Studio,極易卡死,直 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...