pdfview加载(使用第三方)

首先,添加依赖

compile 'com.joanzapata.pdfview:android-pdfview:1.0.4@aar'
implementation 'com.squareup.okhttp3:okhttp:3.4.2'

是OKHTTP和PDF的依赖,通过先下载到本地的方式,加载本地文件

需要注意申请读写权限

package com.demo.com.demoapplication;

import android.Manifest;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.graphics.Canvas;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;

import com.joanzapata.pdfview.PDFView;
import com.joanzapata.pdfview.listener.OnDrawListener;
import com.joanzapata.pdfview.listener.OnLoadCompleteListener;
import com.joanzapata.pdfview.listener.OnPageChangeListener;

import java.io.File;
import java.io.IOException;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okio.BufferedSink;
import okio.Okio;
import okio.Sink;

/**
 * Created by wy on 2018/7/20.
 */

public class PdfActivity extends AppCompatActivity {

    private String mPdfUrl = "http://pdf.dfcfw.com/pdf/H2_AN201807051163584888_1.pdf";
    private static final int REQUEST_EXTERNAL_STORAGE = 1;
    private static String[] PERMISSIONS_STORAGE = {
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE};
    private static Activity mCtx;
    private String cacheUrl = "";//应用缓存路径
    private String pdfName = "error";//文件名称   默认一个错误名称
    private boolean mLoadComplete = false;//加载完成
    private TextView mPageTv;//页数

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout);
        mCtx = this;
        mPageTv = findViewById(R.id.pdfpage);
        checkPerMission();
    }

    private Handler handler = null;
    private Runnable checkRunnable = new Runnable() {
        @Override
        public void run() {
            checkPerMission();
        }
    };

    /**
     * 检查读写权限
     */
    private void checkPerMission() {
        int permission = ActivityCompat.checkSelfPermission(mCtx,
                Manifest.permission.WRITE_EXTERNAL_STORAGE);
        if (permission != PackageManager.PERMISSION_GRANTED) {//无权限  申请
            // We don't have permission so prompt the user
            ActivityCompat.requestPermissions(mCtx, PERMISSIONS_STORAGE,
                    REQUEST_EXTERNAL_STORAGE);
            if (handler == null) {
                handler = new Handler();
            }
            handler.postDelayed(checkRunnable, 1000);//隔一秒再检查
        } else {
            DownloadPdf();
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        try {//删除文件  避免引起缓存过大
            File dest = new File(cacheUrl, pdfName);
            if (dest.exists()) {
                dest.delete();
            }
        } catch (Exception e) {

        }
    }

    /**
     * 开始下载PDF
     */
    private void DownloadPdf() {
        cacheUrl = getCacheDir().getAbsolutePath();//应用缓存路径
        pdfName = mPdfUrl.substring(mPdfUrl.lastIndexOf("/") + 1);//文件名称
        final File dest = new File(cacheUrl, pdfName);
        if (dest.exists()) {
            SeePdf(dest);
        } else {
            Request request = new Request.Builder().url(mPdfUrl).build();
            new OkHttpClient().newCall(request).enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                    // 下载失败
                }

                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    Sink sink = null;
                    BufferedSink bufferedSink = null;
                    try {
                        if (!dest.exists()) {
                            boolean newFile = dest.createNewFile();
                        }
                        sink = Okio.sink(dest);
                        bufferedSink = Okio.buffer(sink);
                        bufferedSink.writeAll(response.body().source());
                        bufferedSink.close();
                        if (handler == null){
                            handler = new Handler(Looper.getMainLooper());
                        }
                        handler.post(new Runnable() {
                            @Override
                            public void run() {
                                SeePdf(dest);
                            }
                        });
                    } catch (Exception e) {
                        e.printStackTrace();
                    } finally {
                        if (bufferedSink != null) {
                            bufferedSink.close();
                        }

                    }
                }
            });
        }
    }

    /**
     * 查看PDF
     */
    private void SeePdf(File dest) {
        try {
            PDFView webPdf = findViewById(R.id.pdfview);
            webPdf.setVisibility(View.VISIBLE);
            webPdf.fromFile(dest)
                    .defaultPage(1)  //设置默认显示第1页
                    .onPageChange(new OnPageChangeListener() {
                        @Override
                        public void onPageChanged(int page, int pageCount) {
                            if (mPageTv != null && page > 0 && pageCount >= page) {
                                mPageTv.setText(page + "/" + pageCount);
                            }
                        }
                    }) //设置翻页监听
                    .onDraw(new OnDrawListener() {
                        @Override
                        public void onLayerDrawn(Canvas canvas, float pageWidth, float pageHeight, int displayedPage) {
                            refreshPageView();
                        }
                    })
                    .onLoad(new OnLoadCompleteListener() {
                        @Override
                        public void loadComplete(int nbPages) {
                            mLoadComplete = true;
                        }
                    })
                    .showMinimap(false) //pdf放大的时候,是否在屏幕的右上角生成小地图
                    .swipeVertical(true) //pdf文档翻页是否是垂直翻页,默认是左右滑动翻页
                    .enableSwipe(true) //是否允许翻页,默认是允许翻页
                    .load();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 隐藏页数
     */
    Runnable hidePage = new Runnable() {
        @Override
        public void run() {
            if (mPageTv != null) {
                mPageTv.setVisibility(View.GONE);
            }
        }
    };

    private void refreshPageView() {
        if (mPageTv != null && !mPageTv.isShown()) {
            mPageTv.setVisibility(View.VISIBLE);
        }
        if (handler == null) {
            handler = new Handler();
        }
        handler.removeCallbacks(hidePage);
        handler.postDelayed(hidePage, 3000);
    }
}

demo地址:https://download.csdn.net/download/qq_24179679/10554342

猜你喜欢

转载自blog.csdn.net/qq_24179679/article/details/81135318