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 25
    buildToolsVersion "25.0.3"
    defaultConfig {
        applicationId "com.foxit.pdfviewer"
        minSdkVersion 16
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles 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");
    }

    @Override
    protected 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 document
        String path = "mnt/sdcard/pdf/Sample.pdf";

        mPDFReader.openDocument(path, null);
        setContentView(mPDFReader.getContentView());
    }

    @Override
    protected 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);
        }
    }

    @Override
    protected void onStart() {
        super.onStart();
        if (mPDFReader == null)
            return;
        mPDFReader.onStart(this);
    }

    @Override
    protected void onPause() {
        super.onPause();
        if (mPDFReader == null)
            return;
        mPDFReader.onPause(this);
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (mPDFReader == null)
            return;
        mPDFReader.onResume(this);
    }

    @Override
    protected void onStop() {
        super.onStop();
        if (mPDFReader == null)
            return;
        mPDFReader.onStop(this);
    }

    @Override
    protected void onDestroy() {
        this.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        if (mPDFReader != null)
            mPDFReader.onDestroy(this);
        super.onDestroy();
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (mPDFReader != null)
            mPDFReader.onActivityResult(this, requestCode, resultCode, data);
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        if (mPDFReader == null)
            return;
        ((MainFrame) mPDFReader.getMainFrame()).updateSettingBar();
        mPDFReader.onConfigurationChanged(this, newConfig);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (mPDFReader != null && mPDFReader.onKeyDown(this, keyCode, event))
            return true;
        return super.onKeyDown(keyCode, event);
    }

    @Override
    public 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 PDF SDK DLL 3.1是一款功能强大的PDF开发工具。它提供了一套用于创建、编辑和查看PDF文档的API和SDK工具,可帮助开发者在应用程序中实现各种PDF操作和功能。 首先,Foxit PDF SDK DLL 3.1具有高度可定制化的特性。它提供了丰富的接口和功能,允许开发者根据自己的需求自定义PDF的操作和界面,从而创建符合自己应用程序风格和需求的PDF功能。 其次,这款工具还提供了强大的PDF编辑功能。开发者可以通过使用Foxit PDF SDK DLL 3.1实现对PDF文档的编辑,包括添加、删除、移动和修改文本、图像和链接等元素。同时,它还支持对PDF文档进行标注和注释,方便用户在阅读和交流过程中进行笔记和提醒。 此外,Foxit PDF SDK DLL 3.1还具备高效的PDF文档查看功能。它可以在应用程序中加载PDF文件,并提供可定制的界面和操作方式,使用户可以方便地浏览和阅读PDF文档。同时,它还支持查找、复制和粘贴文本等常用操作,提高了用户的使用效率。 最后,Foxit PDF SDK DLL 3.1还具备跨平台和多语言支持的特性。它可以在多种操作系统和开发环境下使用,如Windows、iOS和Android等,满足开发者在不同平台上的需求。同时,它还支持多种语言的开发,如C++、C#和Java等,方便开发者根据自己的熟悉程度进行开发。 综上所述,Foxit PDF SDK DLL 3.1是一款功能强大、可定制、高效和跨平台的PDF开发工具,能够帮助开发者实现各种PDF操作和功能,为用户提供良好的PDF浏览和使用体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值