如何用 Kotlin 创建 Android PDF 查看器或编辑器

在当今以移动端为先的世界中,为企业和开发者创建一个安卓应用程序是必不可少的。随着对处理PDF文档的需求日益增加,使用强大的PDF SDK------ComPDFKit来构建安卓PDF查看器和编辑器,可以让您的最终用户轻松查看和编辑PDF文档。

本文将探讨整合ComPDFKit PDF SDK所需的步骤,并使用ComPDFKit构建一个安卓PDF阅读器。

入门指南

ComPDFKit是一个强大的PDF SDK。通过几行Kotlin代码,您就可以轻松嵌入ComPDFKit PDF SDK到您的安卓应用程序中。以下部分介绍了 ComPDFKit PDF SDK 包的结构、运行的系统要求、如何运行演示和如何使用 ComPDFKit PDF SDK 用 Kotlin 制作 Android PDF 阅读器。

系统要求

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

  • Android Studio 3.2 或更新 (支持 AndroidX)

  • 项目规格

    • minSdkVersion19或更高
    • compileSdkVersion30 或更高
    • targetSdkVersion30 或更高
    • Android ABI(s): x86, x86_64, armeabi-v7a, arm64-v8a

Android 包结构

您可以在 GitHub 获取我们的 PDF SDK 安装包。ComPDFKit PDF SDK for Android 的软件包包括以下文件:

  • "Libs" - 包含 "ComPDFKit.aar""ComPDFKit-UI.aar""ComPDFKit-Tools.aar" 的文件夹。 "ComPDFKit.aar" 是 PDF 核心 API。 "ComPDFKit-UI.aar" 是PDF视图。
  • "PDFViewer" - 一个集成了以上所有功能的多功能 PDF 程序。
  • "api_reference_android" - API 参考文档。
  • "developer_guide_android.pdf" - 开发者指南。
  • "release_notes.txt" - 发布信息。
  • "legal.txt" - 法律和版权信息。

用 Kotlin 制作 Android PDF 阅读器

本节将分步说明,帮助您快速入门使用 ComPDFKit PDF SDK 在 Kotlin 中制作 Android 应用程序。通过以下步骤,您将创建一个可以显示指定 PDF 文档的简单应用程序:

第 1 步:创建新项目

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

第 2 步:添加 ComPDFKit PDF SDK

  1. 我们首先要做的是导入 ComPDFKit SDK。将 "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 中。为了简化操作,您可以按照以下方式更新依赖项:
arduino 复制代码
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中申请读写权限:
ini 复制代码
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

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

第 3 步:应用许可证密钥

您可以联系 ComPDFKit 团队获取试用许可证。在使用任何 ComPDFKit PDF SDK 类之前,必须执行的操作是设置许可证密钥。将此许可证添加到主模块的 AndroidManifest.xml 中:

第 4 步:显示PDF文档

  1. 将 PDF 文档复制到 Android 项目的 assets 目录中。例如,将文件 "Quick Start Guide.pdf" 导入到路径 src/main/assets 中。
  1. 在您的包下创建一个新的 Empty Activity ,并将该 Activity 的名称设置为 MainActivity

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

Source文件:

Layout文件:

  1. "activity_main.xml" 中创建一个 CPDFReaderView 来显示 PDF 文档的内容:
xml 复制代码
<!-- 你的 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

kotlin 复制代码
// 你的 MainActivity.kt 文件。
package com.compdfkit.pdfviewer

import androidx.appcompat.app.AppCompatActivity

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

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

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

... //导入。

class MainActivity : AppCompatActivity() {

  // 将PDF文件从资源文件夹复制到缓存文件夹。
  private fun copyPdfFromAssetsToCache(fileName: String) {
    try {
      val inputStream = assets.open(fileName)
      val outputFile = File(cacheDir, fileName)
      val outputStream = FileOutputStream(outputFile)

      val buffer = ByteArray(1024)
      var bytesRead: Int
      while (inputStream.read(buffer).also { bytesRead = it } != -1) {
        outputStream.write(buffer, 0, bytesRead)
      }
      inputStream.close()
      outputStream.flush()
      outputStream.close()
    } catch (e: IOException) {
      e.printStackTrace()
    }
  }

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

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

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

    Thread {
      val fileName = "Quick Start Guide.pdf"
      copyPdfFromAssetsToCache(fileName)

      val file = File(cacheDir, fileName)
      val filePath = file.absolutePath

      // 打开文档。
      var 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的基本属性:
kotlin 复制代码
// 你的 MainActivity.java 文件。

... // 导入。

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

... // 导入。

class MainActivity : AppCompatActivity() {
    // 创建一个处理程序,在主线程上运行代码。
    private val mainThreadHandler = Handler(Looper.getMainLooper())

    // 将PDF文件从资源文件夹复制到缓存文件夹。
    private fun copyPdfFromAssetsToCache(fileName: String) {
        try {
            val inputStream = assets.open(fileName)
            val outputFile = File(cacheDir, fileName)
            val outputStream = FileOutputStream(outputFile)
            val buffer = ByteArray(1024)
            var bytesRead: Int
            while (inputStream.read(buffer).also { bytesRead = it } != -1) {
                outputStream.write(buffer, 0, bytesRead)
            }
            inputStream.close()
            outputStream.flush()
            outputStream.close()
        } catch (e: IOException) {
            e.printStackTrace()
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val readerView = findViewById<CPDFReaderView>(R.id.readerview)

        // 创建文档对象。
        val document = CPDFDocument(this)
        Thread {
            val fileName = "Quick Start Guide.pdf"
            copyPdfFromAssetsToCache(fileName)
            val file = File(cacheDir, fileName)
            val filePath = file.absolutePath

            // 打开文档。
            var error = document.open(filePath)
            if (error == PDFDocumentError.PDFDocumentErrorPassword) {
                // 该文档已加密,需要密码才能打开。
                error = document.open(filePath, "password")
            }
            if (error == PDFDocumentError.PDFDocumentErrorSuccess) {
                // 文档已成功打开,并且可以对数据进行解析和操作。
                mainThreadHandler.post {
                    // 将文档设置为阅读器视图。
                    readerView.pdfDocument = document
                }
            } else {
                // 无法打开PDF文件。具体错误可以参考API文件。
            }
        }.start()
    }
}
xml 复制代码
<!-- 你的 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 团队。

相关推荐
雨白1 分钟前
协程间的通信管道 —— Kotlin Channel 详解
android·kotlin
天一生水water43 分钟前
均值回归(配对交易)策略
均值算法·回归·kotlin·量化交易
Dashing2 小时前
KN:Kotlin 与 OC 交互
ios·kotlin
星光不问赶路人2 小时前
彻底清理 Git 分支:从查看到批量删除无效分支的全流程指南
git·github
逛逛GitHub5 小时前
推荐 4 个实用、好玩儿的 GitHub 开源项目。
github
SelectDB6 小时前
Apache Doris 与 ClickHouse:运维与开源闭源对比
大数据·数据分析·github
CoderJia程序员甲8 小时前
GitHub 热榜项目 - 日榜(2025-10-20)
ai·开源·大模型·github·ai教程
spionbo8 小时前
Java Stream API中如何实现数据的并行处理?
github
over6978 小时前
Git 版本控制:从零开始掌握代码的时间旅行术
github
shandianchengzi8 小时前
【记录】Unity|Unity从安装到打开一个Github项目(以我的世界(仿)为例)
unity·c#·游戏引擎·github·我的世界·mc