精华内容
下载资源
问答
  • 本篇随笔介绍如何在在Winform程序使用Spire.Pdf实现页面添加印章处理,解决这一痛处。 1、在PDF增加印章处理 首先我们来了解下,用Adobe Acrobat Reader 进行文档的印章处理下,看看如何实现的,后面再用软件实现...
  • Visual Studio程序员箴言中文扫描PDF

    热门讨论 2010-12-28 01:04:18
    技巧2.28 在“书签”窗口如何在书签文件夹之间导航 46 技巧2.29 为快速查找的所有结果创建书签 46 2.4 intellisense 47 语句完成、参数信息和完成单词 47 技巧2.30 使用ctrl+j键调用语句完成 48 技巧...
  • 在使用pdf.js页面展示PDF文件的过程中,多数...[图片说明](https://img-ask.csdn.net/upload/201904/12/1555051060_87186.png),我在pdf.worker.js中增加UniGB-UCS2-H仍无法展示该文字,请诸位大牛答疑解惑,非常感谢!
  • Visual C++编程技巧精选500例.pdf

    热门讨论 2012-09-01 15:01:50
    056 如何在标题栏右键菜单中增加菜单项? 057 如何动态增加菜单? 058 如何动态删除菜单? 059 如何启用和禁用菜单命令? 060 如何为菜单添加复选标记? 061 如何为菜单添加单选标记? 062 如何动态删除系统菜单项? 063 ...
  • PDF文件大家应该不陌生,说的简单点,其实我认为就是一个全图片的Word,里面的每个页面都可以看做是一张带文字的图片,接下来我们看看Android应用里如何读取和查看PDF文件内容。 1 项目的gradle中增加如下代码...

    PDF文件大家应该不陌生,说的简单点,其实我认为就是一个全图片的Word,里面的每个页面都可以看做是一张带文字的图片,接下来我们看看在Android应用里如何读取和查看PDF文件内容。

    1 在项目的gradle中增加如下代码:

    compile 'com.joanzapata.pdfview:android-pdfview:1.0.4@aar'

    先看看布局文件代码

    <?xml version="1.0" encoding="utf-8"?>
    <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/title_all" />
    
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">
    
            <com.joanzapata.pdfview.PDFView
                android:id="@+id/pdf"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />
    
            <TextView
                android:id="@+id/tv_page"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="center_horizontal"
                android:textColor="@color/colorAccent"
                android:layout_alignParentTop="true"
                android:textSize="18sp" />
        </RelativeLayout>
    </LinearLayout>

    其中PDFView控件就是pdfview库里面的查看PDF的控件,接下来声明并初始化后查看本地Asserts资源下的PDF文件,代码如下

    pdf.fromAsset("abcd.pdf")
            .defaultPage(1)
            .showMinimap(false)
            .enableSwipe(true)
            .onPageChange(this)
            .load();

    这样就可以查看pdf文件内容了,但是如果是网上在线查看PDF文件该如何实现呢?

    我的思路是这样:

    第一步,把PDF文件下载下来;

    第二步,把文件保存在手机存储中;

    第三步,读取手机SD卡的PDF文件。

    接下来就一步一步实现,当然下载、保存、读取SD卡的内容首先就得有权限,相关权限的申请就不多说了,基本功你懂得!

    下载的话方式很多,你可以用任何可以下载文件的网络框架,我用的是okhttp下载的,代码如下

    /**
     * 下载
     */
    private void downloadFile() {
        OkHttpUtils.build().download(path, savePath, new OkHttpUtils.OnDownloadListener() {
            @Override
            public void onDownloadSuccess(File file) {
                tvPage.setText("加载完成正在打开..");
                showPdf(file.getPath());
            }
            @Override
            public void onDownloading(int progress) {
                Log.i("JAVA", "onDownloading"+progress);
                tvPage.setText("正在加载("+progress+"/100)");
            }
            @Override
            public void onDownloadFailed() {
                Log.i("JAVA", "onDownloadFailed");
                tvPage.setText("加载失败..");
            }
        });
    }

    下载方法中path是网络上PDF文件的额下载全路径,savePath是下载下来的文件保存的目录,onDownloadSuccess是下载完成后的回调方法,回调的是下载的文件,file.getPath()可以获取这个文件保存的路径地址,okhttp我自己封装了一个工具类,代码奉上

    **
     * OkHttp3工具类
     * 2018/9/11
     */
    public class OkHttpUtils {
        private static OkHttpClient client;
        private static OkHttpUtils okHttpUtils;
        private OkHttpCallback callback;
    
        private Handler handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                switch (msg.what) {
                    case 1://异常
                        IOException e = (IOException) msg.obj;
                        LogUtils.i("ruin", "e--> " + e.toString());
                        callback.onError(e);
                        break;
                    case 2://成功
                        String result = (String) msg.obj;
                        callback.onResponse(result);
                        break;
                }
            }
        };
    
        /**
         * http请求
         */
        public static OkHttpUtils build() {
            OkHttpClient.Builder sBuilder = new OkHttpClient.Builder();
            client = sBuilder.build();
            okHttpUtils = new OkHttpUtils();
            return okHttpUtils;
        }
    
        //设置回调方法
        public OkHttpUtils setCallback(OkHttpCallback callback) {
            this.callback = callback;
            return okHttpUtils;
        }
    
        //post请求
        public OkHttpUtils postOkHttp(String url, Map<String, Object> params) {
            FormBody.Builder builder = new FormBody.Builder();
            String temp = "";
            for (String key : params.keySet()) {
                builder.add(key, String.valueOf(params.get(key)));
                temp += (key + "=" + String.valueOf(params.get(key)) + "&");
            }
            LogUtils.i("LogUtils", "url =" + url + "?" + temp);
            FormBody formBody = builder.build();
            Request request = new Request.Builder()
                    .url(url)
                    .post(formBody)
                    .build();
            client.newCall(request).enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                    Message msg = Message.obtain();
                    msg.what = 1;
                    msg.obj = e;
                    handler.sendMessage(msg);
                }
    
                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    String result = response.body().string();
                    Message msg = Message.obtain();
                    msg.what = 2;
                    msg.obj = result;
                    handler.sendMessage(msg);
                }
            });
            return okHttpUtils;
        }
    
    
        public OkHttpUtils postAsync(String url, Map<String, Object> params) {
            RequestBody requestBody;
            if (params == null) {
                params = new HashMap<>();
            }
            /**
             * OKhttp3.0之后版本
             */
            FormBody.Builder builder = new FormBody.Builder();
            /**
             * 在这对添加的参数进行遍历,map遍历有四种方式,如果想要了解的可以网上查找
             */
            String temp = "";
            for (Map.Entry<String, Object> map : params.entrySet()) {
                String key = map.getKey();
                Object value;
                value = map.getValue() == null ? "" : map.getValue();
                builder.add(key, String.valueOf(value));
                temp += (key + "=" + String.valueOf(value));
            }
            LogUtils.i("LogUtils", "url =" + url + "?" + temp);
            requestBody = builder.build();
            final Request request = new Request.Builder().url(url).post(requestBody).build();
            client.newCall(request).enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                    Message msg = Message.obtain();
                    msg.what = 1;
                    msg.obj = e;
                    handler.sendMessage(msg);
                }
    
                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    String result = response.body().string();
                    Message msg = Message.obtain();
                    msg.what = 2;
                    msg.obj = result;
                    handler.sendMessage(msg);
                }
            });
            return okHttpUtils;
        }
    
        //请求回调接口
        public interface OkHttpCallback {
            void onError(Exception e);
            void onResponse(String result);
        }
    
        /**
         * 判断是否有网络连接
         */
        private boolean isNetworkConnected(@NonNull Context context) {
            ConnectivityManager mConnectivityManager =
                    (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
            return mNetworkInfo != null && mNetworkInfo.isAvailable();
        }
    
        /**
         * @param url      下载连接
         * @param saveDir  储存下载文件的SDCard目录
         * @param listener 下载监听
         */
        public void download(final String url, final String saveDir, final OnDownloadListener listener) {
            Request request = new Request.Builder().url(url).build();
            client.newCall(request).enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                    // 下载失败
                    listener.onDownloadFailed();
                }
    
                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    InputStream is = null;
                    byte[] buf = new byte[2048];
                    int len = 0;
                    FileOutputStream fos = null;
                    // 储存下载文件的目录
                    String savePath = isExistDir(saveDir);
                    try {
                        is = response.body().byteStream();
                        long total = response.body().contentLength();
                        File file = new File(savePath, getNameFromUrl(url));
                        fos = new FileOutputStream(file);
                        long sum = 0;
                        while ((len = is.read(buf)) != -1) {
                            fos.write(buf, 0, len);
                            sum += len;
                            int progress = (int) (sum * 1.0f / total * 100); // 下载中
                            listener.onDownloading(progress);
                        }
                        fos.flush(); // 下载完成
                        listener.onDownloadSuccess(file);
                    } catch (Exception e) {
                        listener.onDownloadFailed();
                    } finally {
                        try {
                            if (is != null) {
                                is.close();
                            }
                        } catch (IOException e) {
                        }
                        try {
                            if (fos != null) {
                                fos.close();
                            }
                        } catch (IOException e) {
                        }
                    }
                }
            });
        }
    
        /**
         * 判断下载目录是否存在
         */
        private String isExistDir(String saveDir) throws IOException {
            // 下载位置
            File downloadFile = new File(Environment.getExternalStorageDirectory(), saveDir);
            if (!downloadFile.mkdirs()) {
                downloadFile.createNewFile();
            }
            String savePath = downloadFile.getAbsolutePath();
            return savePath;
        }
    
        /**
         * 从下载连接中解析出文件名
         */
        @NonNull
        private String getNameFromUrl(String url) {
            return url.substring(url.lastIndexOf("/") + 1);
        }
    
        public interface OnDownloadListener {
            /**
             * 下载成功
             */
            void onDownloadSuccess(File file);
            /**
             * 下载进度
             */
            void onDownloading(int progress);
            /**
             * 下载失败
             */
            void onDownloadFailed();
        }
    }

    当然要用okhttp下载需要添加okhttp库文件,我用的是okhttp3

    compile 'com.squareup.okhttp3:okhttp:3.9.0'
    

    在上面下载成功的回调方法里传入下载的PDF文件路径打开文件 showPdf(file.getPath());

    private void showPdf(String fileName) {
        if (TextUtils.isEmpty(fileName)) {
            Toast.makeText(this, "文件不存在", Toast.LENGTH_SHORT).show();
        } else {
            try {
                pdf.fromFile(new File(fileName))
                        .defaultPage(1)
                        .showMinimap(false)
                        .enableSwipe(true)
                        .onLoad(new OnLoadCompleteListener() {
                            @Override
                            public void loadComplete(int nbPages) {
                                float pageWidth = pdf.getOptimalPageWidth();
                                float viewWidth = pdf.getWidth();
                                pdf.zoomTo(viewWidth / pageWidth);
                                pdf.loadPages();
                            }
                        })
                        .onPageChange(this)
                        .load();
            } catch (FileNotFoundException e) {
                Toast.makeText(this, "文件不存在", Toast.LENGTH_SHORT).show();
                File file = new File(fileName);
                FileUtils.deleteFile(file);
            }
        }
    }

    打开之后就可以查看了,和查看Asserts资源下的PDF文件基本一样了,有一个点差点忘了就是实现OnPageChangeListener接口,然后在重写的onPageChanged方法中显示当前查看的页面是多少页和一共有多少页

    @Override
    public void onPageChanged(int page, int pageCount) {
        String pager = "页码(" + page + "/" + pageCount + ")";
        tvPage.setText(pager);
    }

    好了,pdf文件查看就这样完成了,谁有更好的方法可以互相推荐学习。

    展开全文
  • 如何在注册表中增加键 如何删除注册表中的键 如何对屏幕分辨率进行控制 如何获得系统运行的所有进程 如何在任务列表中隐藏应用程序 如何获取本机的硬件配置 如何用代码实现重启和关闭计算机 如何罗列出系统中已经...
  • Tcl_TK编程权威指南pdf

    热门讨论 2011-03-25 09:30:55
    Tcl_TK编程权威指南pdf 内容简介回到顶部↑Tcl/Tk是第一种能通过Windows、Macintosh和Solaris等主要平台处理企业级任务的脚本语言。本书共分为55章,依次详细讲述了Tcl基础、Tcl高级特性、TK基础、TK组件、TK详解、...
  • ILLUSTRATOR.CS2宝典.pdf

    2013-02-17 09:23:54
    15.3 Illustrator使用Photoshop兼容滤镜 15.3.1 使用栅格化的Illustrator作品 15.3.2 使用Illustrator的Photoshop增效工具 15.4 使用效果 15.4.1 使用3D效果 15.4.2 “转换为形状”效果 15.4.3 “扭曲和变换”...
  • java范例开发大全(pdf&源码)

    热门讨论 2013-07-04 13:04:40
    实例137 读取PDF文件的内容 203 实例138 用iText生成Word文件 205 实例139 利用POI读取Word文件的内容 208 7.3 字符流 209 实例140 按顺序创建文件 210 实例141 按顺序读取文件 211 实例142 追加文件内容 211 ...
  • 11.6.2 异步页面中查询数据 11.6.3 错误处理 11.6.4 异步任务使用缓存 11.6.5 多异步任务和超时 11.7 总结 第12章 文件和流 12.1 使用文件系统 12.1.1 Directory类和File类 12.1.2 ...
  • 11.6.2 异步页面中查询数据 11.6.3 错误处理 11.6.4 异步任务使用缓存 11.6.5 多异步任务和超时 11.7 总结 第12章 文件和流 12.1 使用文件系统 12.1.1 Directory类和File类 12.1.2 ...
  •  《google android sdk开发范例大全(第3版)》继承前两版由浅入深的方式,范例总数由原先的160多个增加到了200多个,用户交互界面、手机控件、交互式通信服务、手机自助服务、娱乐多媒体等方面均增加了相应的范例...
  • 实例基本涵盖了初、中级学习者实战几乎可能遇到的所有问题,展示了各种流行的互动设计理念,让读者能够轻松地学习基础知识,有效掌握各种核心技巧,快速上手前沿应用开发,并通过HTML5发现交互设计的乐趣。...
  • 13.2 如何增加你的知名度 13.2.1 创建自己的RSS网址 13.2.2 交换链接不可少 13.3 出名后要注意的事情 13.3.1 向抄袭说不 13.3.2 不要忽视读者的心声 13.4 小结 第14章 SEO的重要性 14.1 什么是SEO 14.1.1 搜索引擎的...
  • CSS网站布局实录 (第二版)PDF

    热门讨论 2012-12-10 18:46:01
    说良心话,内容真不赖,特别是有点网页标准基础,却不知道如何把“标准”贯彻到实际工作去的人(比如我这样的)。一章章的翻过去,命中的都是要害,不禁心中暗喜。看这样一本“糟粕与精华并存、弱智与天才的化身”的书,就...
  • 实例166 Servlet实现页面重定向 实例167 Servlet处理表单提交的数据 实例168 Servlet向客户端写Cookie信息 实例169 Servlet中将JavaBean对象传递到JSP页 实例170 Servlet获取Web路径和文件...
  • 我们转而使用Windows的新版本时,虽然API中增加了非常多的新功能,但这是一个演化和扩展API的过程,并非替换它。 Windows 8中,操作系统的主API被Windows运行库替代。但这个运行库仍部分基于Windows API。 ...
  • 第3版让基于标准的设计思想更加清晰,更加易于理解,帮助你这个领域保持聪明和领先。 一如既往,本书提供了更多明确的见解和新的例子,来阐述基于标准的设计的核心思想,为你的网站最终确定一个合理的设计与开发...
  • ZendFramework中文文档

    2011-03-22 10:11:12
    7.9.4. 响应对象测试异常 7.9.5. 子类化响应对象 7.10. 插件 7.10.1. 简介 7.10.2. 编写插件 7.10.3. 使用插件 7.10.4. 获取和控制插件 7.10.5. 包含标准发行包中的插件 7.10.5.1. 动作堆栈 7.10.5.2...
  • word使用技巧大全

    热门讨论 2011-03-18 20:37:53
    1、如何在word文档加进参考文献的标注 70 2、省时省力——写论文时如何利用word编辑参考文献 71 3、如何在Word编辑参考文献 72 4、关于[1][2][3]类的脚尾注格式问题,与各位分享(修改) 73 5、利用word的交叉...
  • 如何在ASP.Net图片存入数据库.txt 如何在DateTime字段里只存储日期部分?.txt 如何用.NET创建Windows服务.doc 委托与事件.doc 学生选课系统事例(老师).txt 学生选课系统示例(自己).txt 开发和使用自定义...
  • 实例166 Servlet实现页面重定向 实例167 Servlet处理表单提交的数据 实例168 Servlet向客户端写Cookie信息 实例169 Servlet中将JavaBean对象传递到JSP页 实例170 Servlet获取Web路径和文件...
  • 实例133 如何在图片上平滑移动文字 170 3.7 图像动画 172 实例134 动画背景窗体 172 实例135 随鼠标移动的图像 173 实例136 十字光标定位 175 实例137 抓取鼠标形状 176 3.8 图像识别 177 实例...
  • 7、文档间的跳转你一个文档项目会有很多文档,其中一个文档的文档标识叫readme.md,另外一个文档的文档标识叫quickstart.md,两个文档间如何跳转呢? 如果你知道站点的路由规则,倒是可以轻松链过去,但是,每次...
  • 开发的过程增加和移除了一些东西,目前已经不兼容MinDoc了(毕竟数据表结构、字段、索引都有了一些不同),同时只支持markdown编辑器。 开源 两年前还做PHP开发的时候,无意间遇到了Gitbook,以及看云,...
  • java源码包---java 源码 大量 实例

    千次下载 热门讨论 2013-04-18 23:15:26
     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节...保存、如何从文件得到公钥编码的字节数组、如何从字节数组解码公钥...
  • php网络开发完全手册

    热门讨论 2009-03-02 13:17:26
    14.3 如何创建一个数据库与表 223 14.3.1 登录与退出MySQL的命令行 14.3.1 管理模式 223 14.3.2 MySQL的数据库操作 224 14.3.3 表的创建 225 14.4 数据类型的介绍 228 14.5 索引与唯一值的介绍 229 14.6 数据的操作 ...
  • java源码包2

    千次下载 热门讨论 2013-04-20 11:28:17
     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节...保存、如何从文件得到公钥编码的字节数组、如何从字节数组解码公钥...
  • 实例202 MSHFlexGrid控件显示图片 362 实例203 利用MSHFlexGrid控件的排序功能对 数据排序 363 实例204 合并MSHFlexGrid控件的数据 364 实例205 利用MSHFlexGrid控件的合并功能制作 特色报表 366 实例...

空空如也

空空如也

1 2 3 4
收藏数 70
精华内容 28
关键字:

如何在pdf中增加图片页面