如何使用 Java 开发 Android PDF 查看器或编辑器

在如今移动网络普及的时代,开发 Android 应用程序已经成为企业和开发人员的必备技能。与此同时,随着对处理 PDF 文档的需求不断增长,利用功能强大的 PDF SDK ComPDFKit 开发 Android 平台的 PDF 查看器和编辑器,能够让终端用户轻松地查看和编辑 PDF 文件。

在这篇文章中,我们将探讨如何整合 ComPDFKit PDF SDK,并利用它构建 Android 平台上的 PDF 阅读器和编辑器。

ComPDFKit Android PDF SDK 入门

只需几行 Java 代码,即可轻松将 ComPDFKit 集成到您的 Android 应用程序中。花几分钟查看本指南并快速开始吧!

以下部分介绍了 ComPDFKit PDF SDK 包的结构、运行的系统要求、如何运行演示和如何使用 ComPDFKit PDF SDK 用 Java 制作 Android PDF 阅读器。

系统要求

ComPDFKit PDF SDK 支持运行 API 级别 19 或更新版本的 Android 设备,并以最新稳定的 Android 4.4 或更高版本为目标。另外,ComPDFKit PDF SDK 需要应用程序启用 Java 8 语言功能才能构建。

  • Android Studio 3.2 或更新 (支持 AndroidX)
  • 项目规格
    • minSdkVersion 为 19或更高
    • compileSdkVersion 为 30 或更高
    • targetSdkVersion 为 30 或更高
    • Android ABI(s): x86, x86_64, armeabi-v7a, arm64-v8a

Android 软件包结构

您可以自行从 Github上下载 PDF SDK安装包。您将在 Android 软件包中看到以下文件:

  • Libs - 包含 "ComPDFKit.aar"、"ComPDFKit-UI.aar" 和 "ComPDFKit-Tools.aar" 的文件夹。"ComPDFKit.aar" 是 PDF 核心 API。"ComPDFKit-UI.aar" 是PDF视图。"ComPDFKit-Tools.aar" 提供了 ComPDFKit SDK 的完整实现解决方案和 UI 组件,可以帮助您更快地实现 SDK 中的功能。

  • PDFViewer - 一个集成了以上所有功能的多功能 PDF 程序。

  • api_reference_android - API 参考文档。

  • developer_guide_android.pdf - 开发者指南。

  • release_notes.txt - 发布信息。

  • legal.txt - 法律和版权信息。

用 Java 开发 Android PDF 查看器或编辑器

此部分我们将分步说明如何使用 Java 制作 Android 应用程序。这将帮助您快速学会使用 ComPDFKit PDF SDK,完成所有步骤,您将可以获得一个简单的应用程序。

第 1 步:创建一个新项目

  1. 使用Android Studio 创建Phone & Tablet 项目。这里我们以创建一个No Activity项目为例。

第 2 步:添加ComPDFKit PDF SDK包(手动集成为例)

  1. 将 "ComPDFKit.aar" 和 "ComPDFKit-UI.aar" 复制到 app 的 "libs" 目录中。

  1. 将以下代码添加到 app 目录下的 "build.gradle" 文件中:
...
dependencies {
    /*ComPDFKit SDK*/
    implementation(fileTree('libs'))
    ...
}
...
  1. 将 ComPDFKit PDF SDK for Android 作为项目的依赖项添加进去。在 app 目录下的 "build.gradle" 文件中,将 "ComPDFKit.aar" "ComPDFKit-UI.aar" 以及相关的支持库添加到 dependencies 中。为了简化操作,您可以按照以下方式更新依赖项:
dependencies {
    ...
    //glide
    implementation 'com.github.bumptech.glide:glide:4.12.0'
    annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0'

    implementation 'androidx.documentfile:documentfile:1.0.1'
}
  1. AndroidManifest.xml 中申请读写权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

注意:针对 Android 6.0 或更高版本的应用程序,请确保在运行时检查并请求对外部存储的读写权限。

第 3 步:应用许可证密钥

具体步骤请参考应用许可证密钥

第 4 步:添加混淆

在 "proguard-rules.pro" 文件中,请添加 compdfkit 的混淆配置信息如下:

-keep class com.compdfkit.ui.** {*;}
-keep class com.compdfkit.core.** {*;}

第 5 步:显示PDF文档

  1. 将 PDF 文档复制到 Android 项目的 assets 目录中。例如,将文件 "Quick Start Guide.pdf" 导入到路径 src/main/assets 中。

  2. 在您的包下创建一个新的 Empty Activity,并将该 Activity 的名称设置为 MainActivity

Android Studio将自动生成一个名为 "MainActivity.java" 的 source 文件和一个名为 "activity_main.xml" 的 layout 文件。

Source文件:

Layout文件:

  1. 在 "activity_main.xml" 中创建一个 CPDFReaderView 来显示 PDF 文档的内容:
<!-- 你的 activity_main.xml 文件 -->

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <!-- 创建一个 CPDFReaderView -->
    <com.compdfkit.ui.reader.CPDFReaderView
        android:id="@+id/readerview"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

从布局中获取 CPDFReaderView 或者直接在对应的 MainActivity.java 文件中的代码中创建一个 CPDFReaderView

// 你的 MainActivity.java 文件。

package com.compdfkit.pdfviewer;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import com.compdfkit.ui.reader.CPDFReaderView;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 从xml中获取CPDFReaderView
        CPDFReaderView readerView = findViewById(R.id.readerview);
        // 创建CPDFReaderView的代码。
        // CPDFDocument readerView = new CPDFReaderView(content);
    }
}
  1. 打开文档。这是一个耗时的过程,因此需要在子线程中执行。文档成功打开后,会初始化渲染 PDF 的 UI:
// 你的 MainActivity.java 文件。

... //导入。

public class MainActivity extends AppCompatActivity {

    // 将PDF文件从资源文件夹复制到缓存文件夹。
    private void copyPdfFromAssetsToCache(String fileName) {
        try {
            InputStream inputStream = getAssets().open(fileName);
            File outputFile = new File(getCacheDir(), fileName);
            FileOutputStream outputStream = new FileOutputStream(outputFile);

            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = inputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, bytesRead);
            }

            inputStream.close();
            outputStream.flush();
            outputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        CPDFReaderView readerView = findViewById(R.id.readerview);
        // 创建CPDFReaderView的代码。
        // CPDFDocument readerView = new CPDFReaderView(content);

        // 创建文档对象。
        CPDFDocument document = new CPDFDocument(this);
        

        new Thread(() -> {
            String fileName = "Quick Start Guide.pdf";
            copyPdfFromAssetsToCache(fileName);

            File file = new File(getCacheDir(), fileName);
            String filePath = file.getAbsolutePath();

            // 打开文档。
            CPDFDocument.PDFDocumentError error = document.open(filePath);
            if (error == CPDFDocument.PDFDocumentError.PDFDocumentErrorPassword) {
                // 该文档已加密,需要密码才能打开。
                error = document.open(filePath, "password");
            }

            if (error == CPDFDocument.PDFDocumentError.PDFDocumentErrorSuccess) {
                // 文档已成功打开,并且可以对数据进行解析和操作。
            } else {
                //无法打开PDF文件。具体错误可以参考API文件。
            }
        }).start();
    }
}
  1. 设置 CPDFReaderView 的基本属性:
// 你的 MainActivity.java 文件。

... // 导入。

public class MainActivity extends AppCompatActivity {
    // 创建一个处理程序以在主线程上运行代码。
    private Handler mainThreadHandler = new Handler(Looper.getMainLooper());
...
    if (error == CPDFDocument.PDFDocumentError.PDFDocumentErrorSuccess) {
        // 文档已成功打开,并且可以对数据进行解析和操作。
        mainThreadHandler.post(() -> {
            // 设置UI的文档内容。
            readerView.setPDFDocument(document);
        });
    } else {
        // 无法打开PDF文件。具体错误可以参考API文件。
    }
...
}
  1. 在这个阶段,您的代码会像下面展示的这样:
// 你的 MainActivity.java 文件。

... // 导入。

public class MainActivity extends AppCompatActivity {
    // 创建一个处理程序,在主线程上运行代码。

    private Handler mainThreadHandler = new Handler(Looper.getMainLooper());
    // 将PDF文件从资源文件夹复制到缓存文件夹。
    private void copyPdfFromAssetsToCache(String fileName) {
        try {
            InputStream inputStream = getAssets().open(fileName);
            File outputFile = new File(getCacheDir(), fileName);
            FileOutputStream outputStream = new FileOutputStream(outputFile);

            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = inputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, bytesRead);
            }

            inputStream.close();
            outputStream.flush();
            outputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        CPDFReaderView readerView = findViewById(R.id.readerview);

        // 创建文档对象。
        CPDFDocument document = new CPDFDocument(this);

        new Thread(() -> {
            String fileName = "Quick Start Guide.pdf";
            copyPdfFromAssetsToCache(fileName);

            File file = new File(getCacheDir(), fileName);
            String filePath = file.getAbsolutePath();

            // 打开文档。
            CPDFDocument.PDFDocumentError error = document.open(filePath);
            if (error == CPDFDocument.PDFDocumentError.PDFDocumentErrorPassword) {
                // 该文档已加密,需要密码才能打开。
                error = document.open(filePath, "password");
            }

            if (error == CPDFDocument.PDFDocumentError.PDFDocumentErrorSuccess) {
                // 文档已成功打开,并且可以对数据进行解析和操作。
                mainThreadHandler.post(() -> {
                    // 将文档设置为阅读器视图。
                    readerView.setPDFDocument(document);
                });
            } else {
                // 无法打开PDF文件。具体错误可以参考API文件。
            }
        }).start();
    }
}
<!-- 你的 activity_main.xml 文件 -->
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <com.compdfkit.ui.reader.CPDFReaderView
        android:id="@+id/readerview"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</androidx.constraintlayout.widget.ConstraintLayout>
  1. 运行应用程序。

现在,借助ComPDFKit的帮助,您获得了一个简单的应用程序来显示PDF文件。

问题排除

  1. 无法打开 PDF 文件

    我们向您提供的许可证是与您的应用程序 ID 绑定的,因此请确保所获取的许可证与您的应用程序 ID 匹配。

  2. 其它问题

    如果您在集成 ComPDFKit PDF SDK for Android 时遇到其他问题,请随时联系 ComPDFKit 团队。

posted @ 2024-04-12 14:27  ComPDFKit  阅读(32)  评论(0编辑  收藏  举报