需要源码和图片集请点赞关注收藏后评论区留言~~~

一、PDF文件渲染器

Android集成了PDF的渲染操作,从很大程度上方便了开发者,这个PDF文件渲染器便是PdfRenderer。渲染器允许从存储卡读取PDF文件

打开PDF文件只是第一步,接下来使用PdfRenderer工具加载PDF文件,并进行相关的处理操作 下面是PdfRenderer类的常用方法

构造方法:从ParcelFileDescriptor对象构造一个PdeRenderer实例

getPageCount 获取PDF文件的页数

openPage 打开PDF文件的指定页面 返回一个PdeRenderer.Page对象

close 关闭PDF文件

从上面列出的方法可以看到,PDF渲染器只提供了对整个PDF文件的管理操作,具体的页面处理得由PdfRenderer.Page对象完成 下面是Page类得常用方法

getIndex 获取该页得页码

getWidth 获取宽度

getHeight 获取高度

render 渲染该页面内容 并将渲染结果写入一个位图对象

close 关闭该页面

PDF渲染器支持把一个PDF文件转成若干图片。开发者可以将这些图片展示在屏幕上 解析效果如下

此处最好连接真机测试 这样可以从存储卡上读取PDF文件

代码如下

Java类

package com.example.ebook;import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.viewpager.widget.PagerTabStrip;
import androidx.viewpager.widget.ViewPager;import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.util.TypedValue;
import android.view.Menu;
import android.view.MenuItem;import com.example.ebook.adapter.PdfPageAdapter;
import com.example.ebook.dao.BookDao;
import com.example.ebook.entity.BookInfo;
import com.example.ebook.util.AssetsUtil;import java.util.ArrayList;
import java.util.List;public class PdfRenderActivity extends AppCompatActivity {private final static String TAG = "PdfRenderActivity";private List<String> mPathList = new ArrayList<>(); // 图片路径列表private String mFileName = "tangshi.pdf"; // 演示文件的名称private ViewPager vp_content; // 声明一个翻页视图对象private BookDao bookDao; // 声明一个书籍的持久化对象private ProgressDialog mDialog; // 声明一个进度对话框对象@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_pdf_render);initView(); // 初始化视图// 从App实例中获取唯一的书籍持久化对象bookDao = MainApplication.getInstance().getBookDB().bookDao();// 弹出进度对话框mDialog = ProgressDialog.show(this, "请稍候", "正在努力加载");new Thread(() -> importPDF()).start(); // 启动pdf文件的导入线程}// 初始化视图private void initView() {String title = "";// 从前个页面传来的数据中获取书籍的标题和文件名称if (getIntent().getExtras()!=null && !getIntent().getExtras().isEmpty()) {title = getIntent().getStringExtra("title");mFileName = getIntent().getStringExtra("file_name");}Toolbar tl_head = findViewById(R.id.tl_head);tl_head.setTitle(!TextUtils.isEmpty(title) ? title : mFileName);setSupportActionBar(tl_head); // 替换系统自带的ActionBar// 设置工具栏左侧导航图标的点击监听器tl_head.setNavigationOnClickListener(view -> finish());vp_content = findViewById(R.id.vp_content);PagerTabStrip pts_tab = findViewById(R.id.pts_tab);// 设置翻页标题栏的文本大小pts_tab.setTextSize(TypedValue.COMPLEX_UNIT_SP, 17);}// 从指定的资产文件导入pdf文件private void importPDF() {mPathList = AssetsUtil.getPathListFromPdf(this, mFileName);Log.d(TAG, "mPathList.size="+mPathList.size());BookInfo book = bookDao.queryBookByName(mFileName);if (book != null) {book.setPageCount(mPathList.size());bookDao.updateBook(book); // 更新数据库中该书籍记录的总页数}// 回到主线程显示导入后的pdf各页面runOnUiThread(() -> {PdfPageAdapter adapter = new PdfPageAdapter(getSupportFragmentManager(), mPathList);vp_content.setAdapter(adapter);if (mDialog != null && mDialog.isShowing()) {mDialog.dismiss(); // 关闭进度对话框}});}// 在创建选项菜单时调用@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.menu_book, menu);return true;}// 在选中菜单项时调用@Overridepublic boolean onOptionsItemSelected(MenuItem item) {if (item.getItemId() == R.id.menu_slide) { // 点击了“平滑翻页”Intent intent = new Intent(this, PdfSlideActivity.class);intent.putExtra("file_name", mFileName);startActivity(intent);} else if (item.getItemId() == R.id.menu_curve) { // 点击了“卷曲翻页”Intent intent = new Intent(this, PdfCurveActivity.class);intent.putExtra("file_name", mFileName);startActivity(intent);} else if (item.getItemId() == R.id.menu_opengl) { // 点击了“OpenGL翻页”Intent intent = new Intent(this, PdfOpenglActivity.class);intent.putExtra("file_name", mFileName);startActivity(intent);}return super.onOptionsItemSelected(item);}}

XML文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><androidx.appcompat.widget.Toolbarandroid:id="@+id/tl_head"android:layout_width="match_parent"android:layout_height="50dp"android:background="@color/blue_light"app:navigationIcon="@drawable/icon_back" /><androidx.viewpager.widget.ViewPagerandroid:id="@+id/vp_content"android:layout_width="match_parent"android:layout_height="wrap_content"><androidx.viewpager.widget.PagerTabStripandroid:id="@+id/pts_tab"android:layout_width="wrap_content"android:layout_height="wrap_content" /></androidx.viewpager.widget.ViewPager>
</LinearLayout>

创作不易 觉得有帮助请 点赞关注收藏~~~

Android App开发手机阅读中PDF文件渲染器的讲解及使用(附源码 简单易懂)相关推荐

  1. Android App开发手机阅读中实现平滑翻书效果和卷曲翻书动画实战(附源码 简单易懂 可直接使用)

    需要图片集和源码请点赞关注收藏后评论区留言~~~ 一.平滑翻书效果 与纸质书籍类似,手机上的电子书也有很多页,逐页浏览可采用翻页视图,然而翻页视图犹如一幅从左到右的绵长画卷,与现实生活中上下层叠的书籍 ...

  2. Android App开发实战项目之模仿美图秀秀的抠图工具(附源码和演示视频 简单易懂 可直接使用)

    需要图片集和源码请点赞关注收藏后评论区留言~~~ 所谓抠图神器,就是从一副图片中扣出用户想要的某块区域 一.需求描述 美图的修图功能如此强大,离不开专业的图片加工技术,抠图便是其中重要的一项功能.在A ...

  3. C#使用Xamarin开发可移植移动应用进阶篇(6.使用渲染器针对单个平台自定义控件),附源码

    本篇..基本可以算是Xamarin在应用开发过程中的核心了..真的很很很重要.. 想学习的..想用的..建议仔细阅读..嗯..打酱油的 ..快速滑倒下面点个推荐 - - 哈哈哈... 今天的学习内容? ...

  4. 【Android App】实战项目之虚拟现实(VR)的全景相册(附源码和演示视频 可用于学习和大作业)

    需要源码请点赞关注收藏后评论区留言私信~~~ 不管是绘画还是摄影,都是把三维的物体投影到平面上,其实仍旧呈现二维的模拟画面. 随着科技的发展,传统的成像手段越来越凸显出局限性,缘由在于人们需要一种更逼 ...

  5. Android App开发之自定义图形中位图与图形互转、剪裁图形内部区域、给图形添加部件的讲解及实战(附源码 简单易懂)

    需要图片和源码点赞关注收藏后评论区留言~~~ 一.位图与图形互转 Drawable用于在界面上展示图片,Bitmap用于加工图像数据,所以两者之间的转换非常有必要,位图图形BitmapDrawable ...

  6. (基于安卓app开发项目)英语学习记单词软件的毕业设计(java+j2ee+mysql)(附源码)

    大家好!我是岛上程序猿,感谢您阅读本文,欢迎一键三连哦.

  7. Android实现搜索手机内的PDF文件

    前言: 最近在做订单结算功能,需要上传发票,发票有电子和图片发票两种,技术这边有两种方案,一种是上传图片文件,还有一种是上传PDF格式发票文件,但是结算时财务说图片文件上面没有公司盖章,是无效的,于是 ...

  8. Android Studio App开发之利用图像解码器ImageDecoder播放GIF动图、Webp、HEIF图片(附源码 简单实用)

    需要源码和图片集请点赞关注收藏后评论区留言~~~ 一.图像解码器ImageDecoder 早期的Android只支持3种图像格式,分别是JPEG,PNG,GIF 虽然这三类图片都能在ImageView ...

  9. Android 利用广播实现黑名单【指定号码】的短信的拦截 附源码下载链接

    Android 利用广播实现指定号码的短信的拦截 根据最近的学习内容,今天实现了利用广播进行指定号码的拦截 步骤: ①.写一个数据库的帮助类,实现对数据库的创建,总共创建两个数据库psms(受保护的短 ...

最新文章

  1. 2014年七月写过的代码,现在看来,还有待改进呀
  2. python怎么读excel文件-python读写excel文件
  3. C++中对String的各种操作
  4. python人脸照片分类_Python OpenCV 人脸识别(一)
  5. xpath 简单小记
  6. ACL2020 | FastBERT:放飞BERT的推理速度
  7. 次债危机:全世界陪着美国等死
  8. 学习clojure(2)
  9. 计算机教务管理系统ER图,医院病房管理系统ER图
  10. QAM调制解调的仿真实现
  11. ip纯真 mysql_纯真ip导入mysql
  12. Cobalt Strike beacon详解
  13. inkscape工具箱:选择和变换工具(快捷键F1)
  14. 积分使用及有效期管理
  15. QT 支持多客户端网络视频监控的实现
  16. java 英文单词命名缩写_java程序员英文单词缩写和解释
  17. 上海市公积金、养老保险、医疗保险转出事宜
  18. 又是一年植树节,一起为城市添 绿,共赴“春天的约会”
  19. HQChart使用教程30-K线图如何对接第3方数据31-获取指定品种的K线数据
  20. Amos--方差估计与假设检验

热门文章

  1. ChatGPT - ChatPPT快速生成PPT
  2. 计算机软件添加信任,如何在腾讯计算机管理器中取消/添加受信任的文件或软件...
  3. 【CryptoJS】------CryptoJS包下载
  4. 了解undertow容器
  5. 新浪微博如何成了中国​最大的微博平台
  6. Java开发的三大框架有哪些?
  7. R图转成Word、PPT、Excel、HTML、Latex、矢量图等
  8. 精简版 — Hive开发常用操作
  9. 软件测试——fiddler工具(1)
  10. 绘画新手入门如何临摹画画