Android PDF 查看器

Jetpack PDF 查看器库由框架 API 提供支持,可为 Android 上与 PDF 文档相关的应用提供现成的、高性能的解决方案。

PDF 查看器库 (androidx.pdf) 提供了一个可嵌入的 PDF 查看器界面,使用户能够执行以下操作:

  • 打开和查看 PDF 文档
  • 搜索并选择内容
  • 缩放和滚动
  • 保存文档注释
  • 使用触控笔与 PDF 文件互动

您可以通过集成 Jetpack 库 API 或直接使用框架 API 来创建功能全面的 PDF 体验。

Jetpack PDF 库

Jetpack PDF 库提供 PdfViewerFragment 类,用于呈现 PDF 文档,包括分页 PDF。每个网页都在自己的视图中呈现。PdfViewerFragment 会显示一个用于支持注释的浮动操作按钮,并且通常包含一个用于打开搜索菜单的按钮或其他界面控件。

如需了解如何实现 PdfViewerFragment,请参阅实现 PDF 查看器

框架 API

Jetpack 库使用框架 API 来解析和加载 PDF 文档。PdfRenderer 提供与 PDF 渲染相关的基本框架 API。

在 Android V(API 级别 35)之前,PdfRendererPdfRenderer.Page 类提供了用于处理 PDF 的 API。Android V 中已更新 PdfRendererPdfRenderer.Page 类,以提供高级 PDF 功能。

PdfRenderer

Android V 之前的 API

  • getPageCount() - 获取文档中的页数。
  • openPage(index: Int) - 打开用于渲染的网页。
  • shouldScaleForPrinting() - 获取文档是否应缩放以进行打印。如果文档是为打印而呈现的,并且目标媒体尺寸与页面尺寸不同,请考虑此信息。

Android V 中添加的 API

  • PdfRenderer(fileDescriptor: ParcelFileDescriptor, params: LoadParams) — 构造一个新实例。支持加载受密码保护的 PDF。
  • getDocumentLinearizedType() - 针对小于 1KB 的 PDF 返回文档的线性化类型。
  • getPdfFormType() - 返回已加载 PDF 的表单类型。
  • write(destination: ParcelFileDescriptor, removePasswordProtection: Boolean) - 将当前加载的文档的状态保存到作为实参传递的可写入文件描述符中。

PdfRenderer.Page

PdfRenderer.Page 类表示用于渲染的 PDF 文档页面。

Android V 之前的 API

  • RENDER_MODE_FOR_DISPLAY - 用于在屏幕上显示内容的内容渲染模式。
  • RENDER_MODE_FOR_PRINT - 用于呈现要打印的内容的模式。
  • getIndex() - 获取网页索引。
  • getWidth() - 获取页面宽度(以点为单位,1 点为 1/72 英寸)。
  • getHeight() - 获取页面高度(以点为单位,1 点为 1/72 英寸)。
  • render(destination: Bitmap, destClip: Rect?, transform: Matrix?, renderMode: Int) - 将网页渲染为位图。

Android V 中添加的 API

  • applyEdit(editRecord: FormEditRecord) - 将 FormEditRecord 应用于 PDF。
  • getFormWidgetInfos() - 返回页面上所有表单 widget 的相关信息。
  • getFormWidgetInfos(types: IntArray) - 返回页面上指定类型的所有表单 widget 的相关信息。
  • getFormWidgetInfoAtIndex(widgetIndex: Int) - 返回由 widgetIndex 实参标识的 widget 的相关信息。
  • fun getFormWidgetInfoAtPosition(x: Int, y: Int) - 返回有关指定点的 widget 的信息。
  • getGotoLinks() - 获取 PDF 文档页面上的书签和跳转链接。
  • getImageContents() - 返回网页上找到的 PdfPageImageContent 列表。
  • getLinkContents() - 获取网页上所有链接的边界和网址。
  • getTextContents() - 返回页面上 PdfPageTextContent 的列表。
  • render(destination: Bitmap, destClip: Rect?, transform: Matrix?, params: RenderParams) - 将网页渲染为位图。
  • searchText(query: String) - 在网页中搜索指定字符串,并返回所有匹配项的边界。
  • selectContent(start: SelectionBoundary, stop: SelectionBoundary) - 返回一个 PageSelection,表示两个边界之间的内容。

API 用法

  • PdfRenderer#write() API 会将加载的 PDF 的版本写入 ParcelFileDescriptor。使用场景包括:

    • 移除密码保护后保存 PDF 文档的副本
    • 保存修改(注释、表单填写等)
  • PdfRenderer.Page#render() API 可将网页或网页的一部分渲染为位图。在缩放的情况下,该 API 还可用于将网页的一部分渲染为指定大小的位图。

  • PdfRenderer.Page API getImageContents()getLinkContents()getTextContents() 会返回页面上可用的内容。您可以使用该内容来实现无障碍功能和 TalkBack 播报,或在 AI 赋能的功能中使用该内容,例如生成网页摘要。

  • PdfRenderer.Page#selectContent API 会选择网页上可用的内容。您可以使用所选内容执行以下操作:

    • 拨打电话(如果显示电话号码)
    • 打开 Google 地图(如果已选择地址)
    • 复制
    • 分享
    • 评论

兼容性

PdfRendererPreV 类在 Android R 到 U(API 级别 30-34)上公开了 Android V API。

其他资源

如需了解如何向应用添加 PDF 查看器,请参阅实现 PDF 查看器