如何在 Kotlin 中构建您自己的 PDF 利器,无需将数据发送到云端
最近,我需要在智能手机上快速压缩一个大型 PDF 文档。我打开 Google Play,输入搜索内容,然后……就放弃了。大多数应用要么被广告淹没,要么需要订阅,要么——最糟糕的是——将您的文件发送到第三方服务器进行处理。对于包含个人数据或工作报告的文档,这根本不是一个选项。
在 GitHub 上,我发现了开发者 Karna14314 的 PDF Toolkit 项目。这是一个完全离线的 Android 实用工具,使用 Kotlin 和 Jetpack Compose 编写。它具备付费替代品的所有功能,但遵循隐私优先原则:无网络、无分析、无云。
这把瑞士军刀能做什么
作者将您处理文档时可能需要的所有基本操作都打包到了这个应用中。如果我们按类别细分功能,会得到一个相当不错的列表。
首先,是经典的页面操作。您可以将多个文件合并为一个(Merge),或者反过来将文档拆分成多个部分。有一个可视化编辑器,您可以用手指拖动页面来更改顺序,或者直接删除不需要的页面。对于大型文件,可以在不损失可读性的情况下进行压缩。
其次是转换。该应用可以将相册中的图片转换为 PDF,反之亦然——以 JPG、PNG 或 WebP 格式提取文档页面。甚至还有内置的扫描功能:您对准摄像头,应用会自动找到页面边缘,并生成一份整洁的扫描件。
第三是内容处理和安全。您可以添加水印、设置文件密码(或者如果您知道旧密码也可以移除),甚至可以在屏幕上直接签署文档。OCR——从图像中识别文字——值得特别一提。
技术内部实现
对于 Android 开发者来说,PDF Toolkit 的架构很有趣。这个项目很新,所以使用了现代技术栈:
- UI:完全基于 Jetpack Compose,遵循 Material Design 3 规范。
- 架构:经典 MVVM 结合 Clean Architecture。代码组织清晰,PDF 处理逻辑与 UI 层分离。
- PDF 处理:使用 PdfBox-Android。这是知名 Apache 库的移植版本,在移动操作系统下运行可靠。
- OCR(文字识别):这里作者使用了有趣的 build flavors 方案。
仓库中提供了三种构建变体:
- Play Store:使用 Google ML Kit 进行文字识别。这使得 APK 更小(首次下载约 40 MB),但增加了对 Google 专有服务的依赖。
- F-Droid / 开源:这些版本使用 Tesseract(tess-two 库)。这是一个完全开源的引擎,100% 离线工作。非常适合想要最大程度摆脱供应商依赖的人。
异步任务使用 Coroutines 和 Flow,本地数据存储(如操作历史)依赖 Room 和 DataStore。
为什么值得学习
如果您使用 Kotlin 编写,这个项目是在 Android 中处理大型文件和图像的优秀范例。在代码中,您可以找到 CameraX 用于文档扫描的实现,或者 AndroidX Ink 用于注释和签名的用法。
图像处理也很有趣。项目同时使用了多个流行库:Coil 用于加载、Glide 用于特定任务、uCrop 用于在将图像插入 PDF 之前进行裁剪。
谁会发现这个项目有用
如果您在寻找一个现成的自用应用,PDF Toolkit 是一个没有隐藏陷阱的诚实工具。它不要求互联网访问(权限根本不在清单文件中),这意味着您的文件在物理上不可能离开您的设备。
对于开发者来说,这是一个具有正确架构的现成应用模板。您可以 fork 这个仓库,然后添加例如导出到其他格式或特定的元数据处理等功能。
该项目正在积极开发中,作者对 pull requests 持开放态度。唯一需要注意的:要从此源码构建,您需要 Android Studio Hedgehog 或更高版本以及 JDK 17。
构建项目很简单:
git clone https://github.com/Karna14314/Pdf_Tools.git
cd Pdf_Tools
# Если нужен полностью открытый вариант без Google-сервисов:
./gradlew assembleOpensourceRelease
最终,我们得到了一个解决真实隐私问题的可靠开源项目。在这个几乎每个应用都想收集您数据的世界上,像这样的实用工具令人耳目一新。
相关项目