Android App开发手机阅读中PDF文件渲染器的讲解及使用(附源码 简单易懂)
需要源码和图片集请点赞关注收藏后评论区留言~~~
一、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文件渲染器的讲解及使用(附源码 简单易懂)相关推荐
- Android App开发手机阅读中实现平滑翻书效果和卷曲翻书动画实战(附源码 简单易懂 可直接使用)
需要图片集和源码请点赞关注收藏后评论区留言~~~ 一.平滑翻书效果 与纸质书籍类似,手机上的电子书也有很多页,逐页浏览可采用翻页视图,然而翻页视图犹如一幅从左到右的绵长画卷,与现实生活中上下层叠的书籍 ...
- Android App开发实战项目之模仿美图秀秀的抠图工具(附源码和演示视频 简单易懂 可直接使用)
需要图片集和源码请点赞关注收藏后评论区留言~~~ 所谓抠图神器,就是从一副图片中扣出用户想要的某块区域 一.需求描述 美图的修图功能如此强大,离不开专业的图片加工技术,抠图便是其中重要的一项功能.在A ...
- C#使用Xamarin开发可移植移动应用进阶篇(6.使用渲染器针对单个平台自定义控件),附源码
本篇..基本可以算是Xamarin在应用开发过程中的核心了..真的很很很重要.. 想学习的..想用的..建议仔细阅读..嗯..打酱油的 ..快速滑倒下面点个推荐 - - 哈哈哈... 今天的学习内容? ...
- 【Android App】实战项目之虚拟现实(VR)的全景相册(附源码和演示视频 可用于学习和大作业)
需要源码请点赞关注收藏后评论区留言私信~~~ 不管是绘画还是摄影,都是把三维的物体投影到平面上,其实仍旧呈现二维的模拟画面. 随着科技的发展,传统的成像手段越来越凸显出局限性,缘由在于人们需要一种更逼 ...
- Android App开发之自定义图形中位图与图形互转、剪裁图形内部区域、给图形添加部件的讲解及实战(附源码 简单易懂)
需要图片和源码点赞关注收藏后评论区留言~~~ 一.位图与图形互转 Drawable用于在界面上展示图片,Bitmap用于加工图像数据,所以两者之间的转换非常有必要,位图图形BitmapDrawable ...
- (基于安卓app开发项目)英语学习记单词软件的毕业设计(java+j2ee+mysql)(附源码)
大家好!我是岛上程序猿,感谢您阅读本文,欢迎一键三连哦.
- Android实现搜索手机内的PDF文件
前言: 最近在做订单结算功能,需要上传发票,发票有电子和图片发票两种,技术这边有两种方案,一种是上传图片文件,还有一种是上传PDF格式发票文件,但是结算时财务说图片文件上面没有公司盖章,是无效的,于是 ...
- Android Studio App开发之利用图像解码器ImageDecoder播放GIF动图、Webp、HEIF图片(附源码 简单实用)
需要源码和图片集请点赞关注收藏后评论区留言~~~ 一.图像解码器ImageDecoder 早期的Android只支持3种图像格式,分别是JPEG,PNG,GIF 虽然这三类图片都能在ImageView ...
- Android 利用广播实现黑名单【指定号码】的短信的拦截 附源码下载链接
Android 利用广播实现指定号码的短信的拦截 根据最近的学习内容,今天实现了利用广播进行指定号码的拦截 步骤: ①.写一个数据库的帮助类,实现对数据库的创建,总共创建两个数据库psms(受保护的短 ...
最新文章
- 2014年七月写过的代码,现在看来,还有待改进呀
- python怎么读excel文件-python读写excel文件
- C++中对String的各种操作
- python人脸照片分类_Python OpenCV 人脸识别(一)
- xpath 简单小记
- ACL2020 | FastBERT:放飞BERT的推理速度
- 次债危机:全世界陪着美国等死
- 学习clojure(2)
- 计算机教务管理系统ER图,医院病房管理系统ER图
- QAM调制解调的仿真实现
- ip纯真 mysql_纯真ip导入mysql
- Cobalt Strike beacon详解
- inkscape工具箱:选择和变换工具(快捷键F1)
- 积分使用及有效期管理
- QT 支持多客户端网络视频监控的实现
- java 英文单词命名缩写_java程序员英文单词缩写和解释
- 上海市公积金、养老保险、医疗保险转出事宜
- 又是一年植树节,一起为城市添 绿,共赴“春天的约会”
- HQChart使用教程30-K线图如何对接第3方数据31-获取指定品种的K线数据
- Amos--方差估计与假设检验