一直以来,我都比较关注福昕的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 阅读器相关推荐

  1. 【原创】从头开始,使用安卓系统WebView做一个功能强大的Epub阅读器(一)

    之前业务需求要做一个自己专属的Epub阅读器(非标准Epub格式,内嵌多媒体文件,基本上属于Epub3.0标准,但是文件结构并不规范),主要需求如下: 1.首先需要实现一般电子书阅读器的基本功能.翻页 ...

  2. Android快速SDK(12)文本pdf阅读器PdfViewer【傻瓜模式】

    代码:http://download.csdn.net/detail/huangbin95487710/9259967 依赖包模式 完整运行还需要用到以下依赖包 Android快速SDK(4)对话框A ...

  3. 【原创】从头开始,使用安卓系统WebView做一个功能强大的Epub阅读器(五)

    上一章传送:https://blog.csdn.net/mzy24511cs/article/details/80563448. 这一章专门讲一下阅读器的各种工具栏. 1.背景音乐.这个工具简单,用M ...

  4. 【原创】从头开始,使用安卓系统WebView做一个功能强大的Epub阅读器(二)

    上一章传送:https://blog.csdn.net/mzy24511cs/article/details/80423719 要做一个Epub阅读器首先要了解一下什么是Epub.(可自行百度)其实说 ...

  5. 【原创】从头开始,使用安卓系统WebView做一个功能强大的Epub阅读器(四)

    上一章传送:https://blog.csdn.net/mzy24511cs/article/details/80507257. 首先构建阅读器的父容器.用于加载每一章的WebView以及所有的工具V ...

  6. 推荐一个好用的PDF阅读器

    电脑上推荐轻量的Sumatra PDF阅读器.在左上角-设置-高级选项里面,修改FixedPageUI 里的BackgroundColor即可.推荐设置为灰色#909090,具体按喜好来 其他几种电脑 ...

  7. 手机PDF阅读器的功能有哪些

    手机上的PDF阅读器如何去进行对PDF文件的一个查阅,手机PDF阅读器针对PDF文件有哪些特别的功能呢?或者说有哪些可以实际操作的操作按钮? 前往轻快pdf阅读器下载地址http://qingkuai ...

  8. 如何使用Foxit Mobile SDK 6.0 快速创建一个PDF阅读器-Android篇

    Foxit MobilePDF SDK是一款用于移动平台的快速开发包,专注于帮助开发人员将强大的Foxit PDF技术轻松地集成到他们的应用程序中.不知不觉,产品的版本已经到了6.0,近期刚刚发布,6 ...

  9. HQChart使用教程1- 如何快速创建一个K线图页面

    快速创建一个K线图页面 HQChart介绍 demo页面代码 Option的配置项说明 Type Symbol IsAutoUpdate IsShowRightMenu IsShowCorssCurs ...

最新文章

  1. Java项目:企业人事管理系统(java+SSM+jsp+mysql+maven)
  2. python爬取动态网站
  3. SQLite单例模式(QT4)
  4. VTK修炼之道17:图像基本操作_图像信息的访问与修改(vtkImageData)
  5. leetcde-27-移除元素
  6. wince下Gpio 驱动程序
  7. 袁亚湘:愿为数学做更多
  8. python实现单链表快速排序升序linkedqueue_数据结构1
  9. 《redis-php中文参考手册》-php版
  10. 【转】C#操作sqlServer数据库
  11. 迪赛智慧数——柱状图(堆叠极扇图):近5年各行业员工离职率
  12. 李彦宏“泼水门”:舆论的狂欢,还是魏则西的葬歌?
  13. Python基于OpenCV的指针式表盘检测系统(附带源码&技术文档)
  14. 阿里内核数据库文章-目录
  15. Python做手写数字识别
  16. Apollo MPC OSQP Solver
  17. RK3399 Android7.1电脑端adb devices检测不到设备
  18. SpringBoot响应式编程(整理一)
  19. 【黑金ZYNQ7000系列原创视频教程】07.自定义IP——定制RTC IP实验
  20. hadoop经验调优

热门文章

  1. 算法——0-1背包问题
  2. android开发,3秒学会修改底部导航按钮图标
  3. 范冰冰着大仁哥新装出街 款款皆真爱
  4. XP_SP3_专业汉化版__x86_cd_x14-80404
  5. h5 3D旋转立方体
  6. 聚合支付的优势哪些?
  7. 第四周作业————多线程编程
  8. 2017年全球最具影响力50家机器人公司排行榜!我国企业基本都有研发类似产品!
  9. docx 图片预处理 Java_java使用poi给docx文档添加图片(官方例子)
  10. 虚拟企业:21世纪企业管理新模式