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文件。

以上就是我对本地加载pdf文件方法的总结,如果大家在使用的过程中有不理解或错误的地方,欢迎骚扰!

时间: 2024-10-26 05:52:52

Android 如何本地加载pdf文件的相关文章

Android studio 使用心得(六)—android studio 如何加载.so文件

之前一直没怎么注意,以为.so文件android为像eclipse一样直接加载,但是直到昨天我在android studio上调试公司项目推送消息的时候,才发现,.so文件原来没有加载成功. 可能之前  Android studio 使用心得(三)—从Eclipse迁移到Android这篇文章我是用Demo4来做例子,里面并没有引用.so文件,所以大家按照这篇文章去迁移项目的时候,会遇到问题.昨天我网上找了一下关于android studio gradle 加载.so文件的文章,发现大多还停留在

Android开发 ImageButton加载drawable文件问题

有时候我们在给ImageButton加载背景图片的时候,会出现下面的异常: 1 org.xmlpull.v1.XmlPullParserException: Binary XML file line #3: <item> tag requires a 'drawable' attribute or child tag defining a drawable 2 at android.graphics.drawable.StateListDrawable.inflate(StateListDra

IOS加载PDF文件

今天的任务是:在iOS上加载显示pdf文件. 方法一:利用webview [cpp] view plaincopy -(void)loadDocument:(NSString *)documentName inView:(UIWebView *)webView { NSString *path = [[NSBundle mainBundle] pathForResource:documentName ofType:nil]; NSURL *url = [NSURL fileURLWithPath

【Android Studio】 加载so文件异常

AS无法加载so包异常 android studio导入so包异常:Couldn't load DeviceAPI from loader dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.cloudnet.miniwms-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.cloudnet.miniwms-1, /vendor/lib, /syste

JavaEE SSH集成框架(两) struts2 本地加载dtd文件,action组态

1. 载入中struts2的dtd文件.使struts.xml网络无法验证,和eclipse有技巧 在src在创建struts.xml: <? xmlversion="1.0"encoding="UTF-8"? > <!DOCTYPE strutsPUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts

.net使用pdfobject.js加载pdf文件

1.下载pdfobject.js文件 2. 1 <script type="text/javascript" src="<%= Application["rootURL"] %>JS/pdfobject.js"></script> 2 3 <div id="divPDFContent" style="height:860px; margin-top:5px; z-index:

Android运行时ART加载OAT文件的过程分析

在前面一文中,我们介绍了Android运行时ART,它的核心是OAT文件.OAT文件是一种Android私有ELF文件格式,它不仅包含有从DEX文件翻译而来的本地机器指令,还包含有原来的DEX文件内容.这使得我们无需重新编译原有的APK就可以让它正常地在ART里面运行,也就是我们不需要改变原来的APK编程接口.本文我们通过OAT文件的加载过程分析OAT文件的结构,为后面分析ART的工作原理打基础. 老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注! OAT文件

Android动态加载XML文件及控件来简单实现QQ好友印象的功能

在android开发中,我们常常会遇到界面布局控件不确定的情况.由于某些功能的原因或者为了体现某些app的特色等这些原因会导致我们在实现界面布局时需要动态去加载一些控件,那么下面就来介绍一下如何用动态加载控件来简单实现QQ中好友印象的功能,其中也会提到如何来动态加载一个XML的配置文件. 那么要实现好友印象的功能,我们需要通过以下这几个步骤: 1.界面一开始需要加载一个EditText和Button控件,用于填写好友印象和添加好友印象: 2.需要新建一个arrays.xml,在xml文件中添加上

【.NET】VS 本地调试 无法加载Json文件

1.如果要是发布到iis,还加载不出来,那就要配置一下MIME类型: 2.本地调试时,无法加载json文件: 解决方案: 在web.config中添加如下配置:mimeMap <system.webServer> <defaultDocument> <files> <clear /> <add value="default.aspx" /> </files> </defaultDocument> <