Foxit MobilePDF SDK_如何快速创建一个功能丰富的PDF 阅读器
一直以来,我都比较关注福昕的PDF SDK套件,这几天稍微有时间看了下最新发布的4.0版本,然后呢,然后呢,我就被深深的震惊到了,为甚么? 因为这个版本可以很轻松很容易的创建一个功能超级丰富的PDF阅读器,而且可以通过一个配置文件就能实现功能定制。
还是附上下载的链接: 有兴趣的同学们可以下载试用下: https://www.foxitsoftware.com/products/sdk/register.php?product=MobilePDFSDK
话不多说,我们来看下福昕新发布的MobilePDF SDK是如何做到快速创建一个功能丰富的PDF阅读器的。
新建Android工程,导入Foxit的SDK库
创建一个Android 工程,这里我命名为PDFViewer, 然后导入Foxit的SDK库,这两步可以看我之前的文章Foxit Mobile PDF SDK for Android_渲染PDF文档(2) 中准备工作的第一点和第二点。
附上配置后的app下的build.gradle:
apply plugin: 'com.android.application'android {compileSdkVersion 25buildToolsVersion "25.0.3"defaultConfig {applicationId "com.foxit.pdfviewer"minSdkVersion 16targetSdkVersion 22versionCode 1versionName "1.0"testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}}sourceSets {main {jniLibs.srcDirs = ['libs']}}
}repositories {flatDir {dirs 'libs'}
}dependencies {compile name: 'FoxitRDKUIExtensions', ext: 'aar'compile 'com.android.support:appcompat-v7:25.3.1'compile 'com.android.support.constraint:constraint-layout:1.0.0-alpha7'compile 'com.android.support:recyclerview-v7:25.3.1'testCompile 'junit:junit:4.12'
}
Unlock SDK 库
// load "librdk.so" library.
static {System.loadLibrary("rdk");
}
….
String sn = " ";
String key = " ";try {// initialize the library.Library.init(sn, key);
} catch (PDFException e) {e.printStackTrace();return;
}
note: sn和key是一串比较长的字符串,大家可以到libs目录下的rdk_sn.txt和rdk_key.txt文件中copy过来,或者从demo中copy。
编写JSON配置文件
如下所示:(这里我命名为:config.json)
{"defaultReader": true,"modules": {"readingbookmark": true,"outline": true,"annotations": true,"thumbnail" : true,"attachment": true,"signature": true,"search": true,"pageNavigation": true,"form": true,"selection": true,"encryption" : true}
}
然后将编写好的JSON文件放到”PDFViewer\app\src\main\res\raw” 目录下(需要自己创建”raw”目录).
Note:配置文件中的 “defaultReader”在默认情况下是false的,也就是和4.0版本之前的SDK是兼容的。以前的SDK是没有这么智能化的,如果你想实现一个功能丰富的PDF Reader app, 你需要自己设计app的界面,以及调用福昕SDK来实现你想要的功能。这是一个比较复杂的过程,你需要对福昕的SDK有一定的了解才能做好这个app。而SDK 4.0 将很多基础的UI都封装到了一个PDFReader的类中,而且通过简单的配置文件可以自由的定制你想要的功能。
初始化UIExtensionsManager和PDFReader
关于UIExtensionsManager可以查看Foxit Mobile PDF SDK for Android_渲染PDF文档(2)中的介绍。
这里使用JSON配置文件来初始化UIExtensionsManager, 以及获取当前的PDFReader,代码如下:
private PDFViewCtrl pdfViewCtrl = null;
private UIExtensionsManager uiextensionsManager = null;
private PDFReader mPDFReader = null;
...
// Instantiate a PDFViewCtrl object.
pdfViewCtrl = new PDFViewCtrl(this.getApplicationContext());// Get the config file, and set it to UIExtensionsManager.
InputStream stream = this.getApplicationContext().getResources().openRawResource(R.raw.uiextensions_config);
UIExtensionsManager.Config config = new UIExtensionsManager.Config(stream);// Instantiate a UIExtensionsManager object and set it to PDFViewCtrl.
uiextensionsManager = new UIExtensionsManager(this.getApplicationContext(), null, pdfViewCtrl, config);
uiextensionsManager.setAttachedActivity(this);
pdfViewCtrl.setUIExtensionsManager(uiextensionsManager);// Get current PDFReader, and set it to PDFViewCtrl.
mPDFReader = (PDFReader) uiextensionsManager.getPDFReader();
mPDFReader.onCreate(this, pdfViewCtrl, savedInstanceState);
Activity生命周期处理
需要加入Activity生命周期的处理,不然有些功能使用会出现问题。
更新MainActivity.java 如下:
package com.foxit.pdfreader;import android.content.Intent;
import android.content.res.Configuration;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.WindowManager;import com.foxit.sdk.PDFViewCtrl;
import com.foxit.sdk.common.Library;
import com.foxit.sdk.common.PDFException;
import com.foxit.uiextensions.UIExtensionsManager;
import com.foxit.uiextensions.home.IHomeModule;
import com.foxit.uiextensions.pdfreader.impl.MainFrame;
import com.foxit.uiextensions.pdfreader.impl.PDFReader;
import com.foxit.uiextensions.utils.AppFileUtil;import java.io.InputStream;public class MainActivity extends AppCompatActivity {private PDFViewCtrl pdfViewCtrl = null;private UIExtensionsManager uiextensionsManager = null;private PDFReader mPDFReader = null;// Load "librdk.so" library.static {System.loadLibrary("rdk");}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// The value of "sn" can be found in the “rdk_sn.txt”.// The value of "key" can be found in the “rdk_key.txt”.String sn = " ";String key = " ";try {// initialize the library.Library.init(sn, key);} catch (PDFException e) {e.printStackTrace();return;}// Instantiate a PDFViewCtrl object.pdfViewCtrl = new PDFViewCtrl(this.getApplicationContext());// Get the config file, and set it to UIExtensionsManager.InputStream stream = this.getApplicationContext().getResources().openRawResource(R.raw.uiextensions_config);UIExtensionsManager.Config config = new UIExtensionsManager.Config(stream);// Instantiate a UIExtensionsManager object and set it to PDFViewCtrl.uiextensionsManager = new UIExtensionsManager(this.getApplicationContext(), null, pdfViewCtrl, config);uiextensionsManager.setAttachedActivity(this);pdfViewCtrl.setUIExtensionsManager(uiextensionsManager);// Get current PDFReader, and set it to PDFViewCtrl.mPDFReader = (PDFReader) uiextensionsManager.getPDFReader();mPDFReader.onCreate(this, pdfViewCtrl, savedInstanceState);// load a documentString path = "mnt/sdcard/pdf/Sample.pdf";mPDFReader.openDocument(path, null);setContentView(mPDFReader.getContentView());}@Overrideprotected void onNewIntent(Intent intent) {super.onNewIntent(intent);if (mPDFReader == null)return;if (mPDFReader.getMainFrame().getAttachedActivity() != this)return;setIntent(intent);String path = AppFileUtil.getFilePath(this, intent, IHomeModule.FILE_EXTRA);if (path != null) {mPDFReader.openDocument(path, null);}}@Overrideprotected void onStart() {super.onStart();if (mPDFReader == null)return;mPDFReader.onStart(this);}@Overrideprotected void onPause() {super.onPause();if (mPDFReader == null)return;mPDFReader.onPause(this);}@Overrideprotected void onResume() {super.onResume();if (mPDFReader == null)return;mPDFReader.onResume(this);}@Overrideprotected void onStop() {super.onStop();if (mPDFReader == null)return;mPDFReader.onStop(this);}@Overrideprotected void onDestroy() {this.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);if (mPDFReader != null)mPDFReader.onDestroy(this);super.onDestroy();}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (mPDFReader != null)mPDFReader.onActivityResult(this, requestCode, resultCode, data);}@Overridepublic void onConfigurationChanged(Configuration newConfig) {super.onConfigurationChanged(newConfig);if (mPDFReader == null)return;((MainFrame) mPDFReader.getMainFrame()).updateSettingBar();mPDFReader.onConfigurationChanged(this, newConfig);}@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {if (mPDFReader != null && mPDFReader.onKeyDown(this, keyCode, event))return true;return super.onKeyDown(keyCode, event);}@Overridepublic boolean onPrepareOptionsMenu(Menu menu) {if (mPDFReader != null && !mPDFReader.onPrepareOptionsMenu(this, menu))return false;return super.onPrepareOptionsMenu(menu);}
}
更新 AndroidManifest.xml文件
填写相应的读写权限,以及设置“android:configChanges="keyboardHidden|orientation|screenSize">”
属性(为了在屏幕发生旋转时,只调用onConfigurationChanged()函数,而不用重新执行Activity的生命周期).
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.foxit.pdfviewer"><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.CAMERA" /><application
android:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"><activity android:name=".MainActivity"android:configChanges="keyboardHidden|orientation|screenSize"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application>
</manifest>
运行PDFViewer
我这里使用他们的sample.pdf文件,运行后,可以看到一个功能丰富的PDF viewer就出现了,如下图所示:
主界面:
List面板
View面板
Annotation面板
Signature面板
看了这些图,是不是觉得灰常的强大啊,只需要这么点代码就能实现一个如此强大,如此专业的PDF Viewer。 反正我是被震惊到了,所以写了这篇文章来和大家分享。
注:此文主要参考了他们官方的Developer Guide文档,很多代码都直接从里面copy的,有点小偷懒哈。
Foxit MobilePDF SDK_如何快速创建一个功能丰富的PDF 阅读器相关推荐
- 【原创】从头开始,使用安卓系统WebView做一个功能强大的Epub阅读器(一)
之前业务需求要做一个自己专属的Epub阅读器(非标准Epub格式,内嵌多媒体文件,基本上属于Epub3.0标准,但是文件结构并不规范),主要需求如下: 1.首先需要实现一般电子书阅读器的基本功能.翻页 ...
- Android快速SDK(12)文本pdf阅读器PdfViewer【傻瓜模式】
代码:http://download.csdn.net/detail/huangbin95487710/9259967 依赖包模式 完整运行还需要用到以下依赖包 Android快速SDK(4)对话框A ...
- 【原创】从头开始,使用安卓系统WebView做一个功能强大的Epub阅读器(五)
上一章传送:https://blog.csdn.net/mzy24511cs/article/details/80563448. 这一章专门讲一下阅读器的各种工具栏. 1.背景音乐.这个工具简单,用M ...
- 【原创】从头开始,使用安卓系统WebView做一个功能强大的Epub阅读器(二)
上一章传送:https://blog.csdn.net/mzy24511cs/article/details/80423719 要做一个Epub阅读器首先要了解一下什么是Epub.(可自行百度)其实说 ...
- 【原创】从头开始,使用安卓系统WebView做一个功能强大的Epub阅读器(四)
上一章传送:https://blog.csdn.net/mzy24511cs/article/details/80507257. 首先构建阅读器的父容器.用于加载每一章的WebView以及所有的工具V ...
- 推荐一个好用的PDF阅读器
电脑上推荐轻量的Sumatra PDF阅读器.在左上角-设置-高级选项里面,修改FixedPageUI 里的BackgroundColor即可.推荐设置为灰色#909090,具体按喜好来 其他几种电脑 ...
- 手机PDF阅读器的功能有哪些
手机上的PDF阅读器如何去进行对PDF文件的一个查阅,手机PDF阅读器针对PDF文件有哪些特别的功能呢?或者说有哪些可以实际操作的操作按钮? 前往轻快pdf阅读器下载地址http://qingkuai ...
- 如何使用Foxit Mobile SDK 6.0 快速创建一个PDF阅读器-Android篇
Foxit MobilePDF SDK是一款用于移动平台的快速开发包,专注于帮助开发人员将强大的Foxit PDF技术轻松地集成到他们的应用程序中.不知不觉,产品的版本已经到了6.0,近期刚刚发布,6 ...
- HQChart使用教程1- 如何快速创建一个K线图页面
快速创建一个K线图页面 HQChart介绍 demo页面代码 Option的配置项说明 Type Symbol IsAutoUpdate IsShowRightMenu IsShowCorssCurs ...
最新文章
- Java项目:企业人事管理系统(java+SSM+jsp+mysql+maven)
- python爬取动态网站
- SQLite单例模式(QT4)
- VTK修炼之道17:图像基本操作_图像信息的访问与修改(vtkImageData)
- leetcde-27-移除元素
- wince下Gpio 驱动程序
- 袁亚湘:愿为数学做更多
- python实现单链表快速排序升序linkedqueue_数据结构1
- 《redis-php中文参考手册》-php版
- 【转】C#操作sqlServer数据库
- 迪赛智慧数——柱状图(堆叠极扇图):近5年各行业员工离职率
- 李彦宏“泼水门”:舆论的狂欢,还是魏则西的葬歌?
- Python基于OpenCV的指针式表盘检测系统(附带源码&技术文档)
- 阿里内核数据库文章-目录
- Python做手写数字识别
- Apollo MPC OSQP Solver
- RK3399 Android7.1电脑端adb devices检测不到设备
- SpringBoot响应式编程(整理一)
- 【黑金ZYNQ7000系列原创视频教程】07.自定义IP——定制RTC IP实验
- hadoop经验调优