当前位置: 首页 > article >正文

Android 中实现 PDF 预览三种方式

目录

    • 1. 使用第三方库 PdfRenderer(适用于 Android 5.0 及以上)
  • 步骤:
    • 2. 使用第三方库 MuPDF
    • 步骤:
    • 3. 使用第三方库 PdfiumAndroid
    • 步骤:

1. 使用第三方库 PdfRenderer(适用于 Android 5.0 及以上)

PdfRenderer 是 Android 系统自带的一个用于渲染 PDF 文件的 API,它允许你将 PDF 页面渲染到 Bitmap 上,然后在 ImageView 中显示。

步骤:

添加权限:在 AndroidManifest.xml 中添加读取外部存储的权限(如果 PDF 文件存放在外部存储)。

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  • 布局文件:创建一个简单的布局文件 activity_main.xml,包含一个 ImageView 用于显示 PDF 页面。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><ImageViewandroid:id="@+id/pdfImageView"android:layout_width="match_parent"android:layout_height="match_parent" />
</RelativeLayout>
  • Java 代码实现:在 MainActivity.java 中实现 PDF 预览功能。
import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.pdf.PdfRenderer;
import android.os.Bundle;
import android.os.ParcelFileDescriptor;
import android.widget.ImageView;
import androidx.appcompat.app.AppCompatActivity;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;public class MainActivity extends AppCompatActivity {private ImageView pdfImageView;private PdfRenderer pdfRenderer;private PdfRenderer.Page currentPage;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);pdfImageView = findViewById(R.id.pdfImageView);try {openPdfFromAssets();} catch (IOException e) {e.printStackTrace();}}private void openPdfFromAssets() throws IOException {// 从 assets 文件夹中复制 PDF 文件到应用的缓存目录AssetManager assetManager = getAssets();InputStream inputStream = assetManager.open("example.pdf");File outputFile = new File(getCacheDir(), "example.pdf");FileOutputStream outputStream = new FileOutputStream(outputFile);byte[] buffer = new byte[1024];int length;while ((length = inputStream.read(buffer)) > 0) {outputStream.write(buffer, 0, length);}inputStream.close();outputStream.close();// 打开 PDF 文件ParcelFileDescriptor fileDescriptor = ParcelFileDescriptor.open(outputFile, ParcelFileDescriptor.MODE_READ_ONLY);pdfRenderer = new PdfRenderer(fileDescriptor);// 显示第一页showPage(0);}private void showPage(int index) {if (currentPage != null) {currentPage.close();}currentPage = pdfRenderer.openPage(index);Bitmap bitmap = Bitmap.createBitmap(currentPage.getWidth(), currentPage.getHeight(), Bitmap.Config.ARGB_8888);currentPage.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);pdfImageView.setImageBitmap(bitmap);}@Overrideprotected void onDestroy() {super.onDestroy();if (currentPage != null) {currentPage.close();}if (pdfRenderer != null) {pdfRenderer.close();}}
}

2. 使用第三方库 MuPDF

MuPDF 是一个轻量级的 PDF 查看器库,支持多种文档格式,并且提供了丰富的功能。

步骤:

  • 添加依赖:在 build.gradle 文件中添加 MuPDF 库的依赖。
implementation 'com.artifex.mupdf:mupdf-android:1.19.0'
  • 布局文件:创建一个简单的布局文件 activity_main.xml,包含一个 MuPDFReaderView 用于显示 PDF 文件。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><com.artifex.mupdf.fitz.android.AndroidMuPDFReaderViewandroid:id="@+id/pdfReaderView"android:layout_width="match_parent"android:layout_height="match_parent" />
</RelativeLayout>
  • Java 代码实现:在 MainActivity.java 中实现 PDF 预览功能。
import android.os.Bundle;
import android.os.Environment;
import androidx.appcompat.app.AppCompatActivity;
import com.artifex.mupdf.fitz.Document;
import com.artifex.mupdf.fitz.MuPDFCore;
import com.artifex.mupdf.fitz.android.AndroidMuPDFReaderView;
import java.io.File;public class MainActivity extends AppCompatActivity {private AndroidMuPDFReaderView pdfReaderView;private MuPDFCore muPDFCore;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);pdfReaderView = findViewById(R.id.pdfReaderView);try {// 打开 PDF 文件File pdfFile = new File(Environment.getExternalStorageDirectory(), "example.pdf");muPDFCore = new MuPDFCore(this, pdfFile.getAbsolutePath());// 设置 PDF 阅读器的核心pdfReaderView.setCore(muPDFCore);} catch (Exception e) {e.printStackTrace();}}@Overrideprotected void onDestroy() {super.onDestroy();if (muPDFCore != null) {muPDFCore.destroy();}}
}

3. 使用第三方库 PdfiumAndroid

PdfiumAndroid 是一个基于 Pdfium 库的 Android 封装,用于在 Android 应用中渲染 PDF 文件。

步骤:

  • 添加依赖:在 build.gradle 文件中添加 PdfiumAndroid 库的依赖。
implementation 'com.github.barteksc:android-pdf-viewer:3.2.0-beta.1'
  • 布局文件:创建一个简单的布局文件 activity_main.xml,包含一个 PDFView 用于显示 PDF 文件。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><com.github.barteksc.pdfviewer.PDFViewandroid:id="@+id/pdfView"android:layout_width="match_parent"android:layout_height="match_parent" />
</RelativeLayout>
  • Java 代码实现:在 MainActivity.java 中实现 PDF 预览功能。
import android.os.Bundle;
import android.os.Environment;
import androidx.appcompat.app.AppCompatActivity;
import com.github.barteksc.pdfviewer.PDFView;
import java.io.File;public class MainActivity extends AppCompatActivity {private PDFView pdfView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);pdfView = findViewById(R.id.pdfView);// 打开 PDF 文件File pdfFile = new File(Environment.getExternalStorageDirectory(), "example.pdf");pdfView.fromFile(pdfFile).defaultPage(0).enableSwipe(true).swipeHorizontal(false).load();}
}

以上三种方法都可以在 Android 应用中实现 PDF 预览功能

相关文章:

Android 中实现 PDF 预览三种方式

目录 1. 使用第三方库 PdfRenderer&#xff08;适用于 Android 5.0 及以上&#xff09; 步骤&#xff1a;2. 使用第三方库 MuPDF步骤&#xff1a;3. 使用第三方库 PdfiumAndroid步骤&#xff1a; 1. 使用第三方库 PdfRenderer&#xff08;适用于 Android 5.0 及以上&#xff09…...

10. k8s二进制集群之Kube Scheduler部署

在开始之前需要准备什么?创建kube-scheduler证书请求文件【即证书的生成⓵】根据上面证书配置文件生成kube-scheduler证书【即证书的生成⓶】创建与关联kube-scheduler配置文件(为后面生成系统服务做准备)创建kube-scheduler服务配置文件【准备系统服务⓵】创建kube-schedul…...

bat脚本实现自动化漏洞挖掘

bat脚本 BAT脚本是一种批处理文件&#xff0c;可以在Windows操作系统中自动执行一系列命令。它们可以简化许多日常任务&#xff0c;如文件操作、系统配置等。 bat脚本执行命令 echo off#下面写要执行的命令 httpx 自动存活探测 echo off httpx.exe -l url.txt -o 0.txt nuc…...

一文解释nn、nn.Module与nn.functional的用法与区别

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;零基础入门PyTorch框架_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 …...

Unity VideoPlayer播放视屏不清晰的一种情况

VideoPlayer的Rnder Texture可以设置Size,如果你的视屏是1920*1080那么就设置成1920*1080。 如果设置成其他分辨率比如800*600会导致视屏不清晰。...

Docker 数据卷(Volume)详细介绍

Docker 数据卷&#xff08;Volume&#xff09;详细介绍 1. 什么是 Docker 数据卷&#xff1f; Docker 数据卷&#xff08;Volume&#xff09;是一种用于 持久化数据 和 容器间数据共享 的机制。由于容器的存储是临时的&#xff0c;容器删除后其中的数据会丢失&#xff0c;因此…...

【玩转全栈】--创建一个自己的vue项目

目录 vue介绍 创建vue项目 vue页面介绍 element-plus组件库 启动项目 vue介绍 Vue.js 是一款轻量级、易于上手的前端 JavaScript 框架&#xff0c;旨在简化用户界面的开发。它采用了响应式数据绑定和组件化的设计理念&#xff0c;使得开发者可以通过声明式的方式轻松管理数据和…...

揭秘区块链隐私黑科技:零知识证明如何改变未来

文章目录 1. 引言&#xff1a;什么是零知识证明&#xff1f;2. 零知识证明的核心概念与三大属性2.1 完备性&#xff08;Completeness&#xff09;2.2 可靠性&#xff08;Soundness&#xff09;2.3 零知识性&#xff08;Zero-Knowledge&#xff09; 3. 零知识证明的工作原理4. 零…...

力扣 239.滑动窗口最大值

思路 滑动窗口 遍历 解题思路 基本思路&#xff1a;使用滑动窗口法遍历数组&#xff0c;动态维护当前窗口的最大值。 特殊情况&#xff1a;该方法有一个缺陷&#xff0c;如果出窗口的元素是当前窗口的最大值max时&#xff0c;接下来的窗口中的最大值就无法确定了&#xff0c;所…...

堆的实现——堆的应用(堆排序)

文章目录 1.堆的实现2.堆的应用--堆排序 大家在学堆的时候&#xff0c;需要有二叉树的基础知识&#xff0c;大家可以看我的二叉树文章&#xff1a;二叉树 1.堆的实现 如果有⼀个关键码的集合 K {k0 , k1 , k2 , …&#xff0c;kn−1 } &#xff0c;把它的所有元素按完全⼆叉树…...

【3】高并发导出场景下,服务器性能瓶颈优化方案-文件压缩

使用EasyExcel导出并压缩文件是一种高效且常见的解决方案&#xff0c;尤其适用于需要处理大量数据的场景。 1. 导出多个Excel文件并压缩成ZIP文件的基本流程 &#xff08;1&#xff09;数据准备&#xff1a;从数据库或其他数据源获取需要导出的数据&#xff0c;并将其存储在Ja…...

Ubuntu20.04 本地部署 DeepSeek-R1

一、下载ollama 打开 ollama链接&#xff0c;直接终端运行提供的命令即可。如获取的命令如下&#xff1a; curl -fsSL https://ollama.com/install.sh | sh确保是否安装成功可在终端输入如下命令&#xff1a; ollama -v注意&#xff1a; 如遇到Failed to connect to github.…...

2025年2月6日笔记

第 12 届蓝桥杯 C 青少组中 / 高级组选拔赛&#xff08; STEMA &#xff09; 2020 年 11 月 22 日 真题第一题 解题思路&#xff1a; 第一&#xff1a;因为有整数集合的求和字样&#xff08;所以用for循环来做&#xff09; 第二&#xff1a;题中让我们累加1到N&#xff0c;所…...

Linux: 网络基础

1.协议 为什么要有协议&#xff1a;减少通信成本。所有的网络问题&#xff0c;本质是传输距离变长了。 什么是协议&#xff1a;用计算机语言表达的约定。 2.分层 软件设计方面的优势—低耦合。 一般我们的分层依据&#xff1a;功能比较集中&#xff0c;耦合度比较高的模块层…...

CSS 背景与边框:从基础到高级应用

CSS 背景与边框&#xff1a;从基础到高级应用 1. CSS 背景样式1.1 背景颜色示例代码&#xff1a;设置背景颜色 1.2 背景图像示例代码&#xff1a;设置背景图像 1.3 控制背景平铺行为示例代码&#xff1a;控制背景平铺 1.4 调整背景图像大小示例代码&#xff1a;调整背景图像大小…...

GnuTLS: 在 pull 函数中出错。 无法建立 SSL 连接。

提示信息 [root@localhost ~]# wget https://download.docker.com/linux/static/stable/x86_64/docker-27.5.1.tgz --2025-02-06 12:45:34-- https://download.docker.com/linux/static/stable/x86_64/docker-27.5.1.tgz 正在解析主机 download.docker.com (download.docker.…...

ES6 const 使用总结

1. 声明不可变性 1.1 基本类型的不可变性 // 基本类型声明后不能修改 const name John; name Jane; // TypeError: Assignment to constant variableconst age 25; age 26; // TypeError: Assignment to constant variableconst isValid true; isValid false; // Ty…...

大学资产管理系统中的下载功能设计与实现

大学资产管理系统是高校信息化建设的重要组成部分&#xff0c;它负责记录和管理学校内所有固定资产的信息。随着信息技术的发展&#xff0c;下载功能成为提高资产管理效率的关键环节之一。 系统架构的设计是实现下载功能的基础。一个良好的系统架构能够确保数据的高效传输和存储…...

【华为OD机试python】日志采集系统【 E卷 | 2023 Q1 |100分】

目录 题目描述 输入描述 输出描述 示例1 输入输出示例仅供调试,后台判题数据一般不包含示例 说明 示例2 输入输出示例仅供调试,后台判题数据一般不包含示例 说明 解题思路 考点 代码 题目描述 日志采集是运维系统的的核心组件。日志是按行生成,每行记做一条,由采…...

园区网设计与实战

想做一个自己学习的有关的csdn账号&#xff0c;努力奋斗......会更新我计算机网络实验课程的所有内容&#xff0c;还有其他的学习知识^_^&#xff0c;为自己巩固一下所学知识。 我是一个萌新小白&#xff0c;有误地方请大家指正&#xff0c;谢谢^_^ 文章目录 前言 这个实验主…...

DeepSeek-R1 本地电脑部署 Windows系统 【轻松简易】

本文分享在自己的本地电脑部署 DeepSeek&#xff0c;而且轻松简易&#xff0c;快速上手。 这里借助Ollama工具&#xff0c;在Windows系统中进行大模型部署~ 1、安装Ollama 来到官网地址&#xff1a;Download Ollama on macOS 点击“Download for Windows”下载安装包&#x…...

git进阶--5---git reset 和 git revert 的区别与联系

git进阶–5—git reset 和 git revert 的区别与联系 1. 相同点 都是对版本做出一些改变 2. 不同点 git reset 是进行版本回退&#xff0c;根据不同的参数&#xff0c;是定是否复原索引和工作区git revert 是撤销上一次的提交&#xff0c;不会改变过去的历史&#xff0c;安全…...

AI绘画:解锁商业设计新宇宙(6/10)

1.AI 绘画&#xff1a;商业领域的潜力新星 近年来&#xff0c;AI 绘画技术以惊人的速度发展&#xff0c;从最初简单的图像生成&#xff0c;逐渐演变为能够创造出高度逼真、富有创意的艺术作品。随着深度学习算法的不断优化&#xff0c;AI 绘画工具如 Midjourney、Stable Diffu…...

单硬盘槽笔记本更换硬盘

背景 本人的笔记本电脑只有一个硬盘槽&#xff0c;而且没有M.2的硬盘盒&#xff0c;只有一个移动硬盘 旧硬盘&#xff1a;512G 新硬盘&#xff1a;1T 移动硬盘&#xff1a;512G 参考链接&#xff1a;https://www.bilibili.com/video/BV1iP41187SW/?spm_id_from333.1007.t…...

保姆级教程:利用Ollama与Open-WebUI本地部署 DeedSeek-R1大模型

1. 安装Ollama 根据自己的系统下载Ollama&#xff0c;我的是Linux&#xff0c;所以我使用如下命令进行下载安装&#xff1a; curl -fsSL https://ollama.com/install.sh | sh2. 安装Open-WebUI 使用 Docker 的方式部署 open-webui &#xff0c;使用gpu的话按照如下命令进行 …...

机器学习模型--线性回归、逻辑回归、分类

一、线性回归 级别1&#xff1a;简单一元线性回归&#xff08;手工实现&#xff09; import numpy as np import matplotlib.pyplot as plt# 生成数据 X np.array([1, 2, 3, 4, 5]) y np.array([2, 4, 5, 4, 5])# 手动实现梯度下降 def gradient_descent(X, y, lr0.01, epo…...

使用scoop 下载速度慢怎么办

在国内使用 Scoop 下载速度慢是一个常见问题&#xff0c;主要是因为 Scoop 默认的软件源&#xff08;bucket&#xff09;和下载服务器通常位于国外。以下是一些提高下载速度的方法&#xff1a; 1. 更换 Scoop 镜像源&#xff08;Bucket 镜像&#xff09;&#xff1a; 原理&…...

Kafka 可靠性探究—副本刨析

Kafka 的多副本机制提升了数据容灾能力。 副本通常分为数据副本与服务副本。数据副本是指在不同的节点上持久化同一份数据&#xff1b;服务副本指多个节点提供同样的服务&#xff0c;每个节点都有能力接收来自外部的请求并进行相应的处理。 1 副本刨析 1.1 相关概念 AR&…...

openwebui入门

1 简介 ‌Open WebUI‌&#xff08;网址是openwebui.com&#xff09;是一个高度可扩展、功能强大且用户友好的自托管Web用户界面&#xff0c;专为完全离线操作设计&#xff0c;编程语言是python。它支持对接Ollama和OpenAI兼容的API的大模型。‌ Open WebUI‌在架构上是一种中…...

Windows下怎么安装FFFmpeg呢?

在Windows下使用Open-webui报错&#xff0c;说Couldnt find ffmpeg or avconv,解决open-webui报错Couldn‘t find ffmpeg or avconv-CSDN博客于是尝试解决问题&#xff0c;那么Windows下怎么安装FFFmpeg呢&#xff1f; 尝试了两种方法。 第一种方法pip安装&#xff08;失败&…...