当前位置: 首页 > 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">

    <ImageView
        android: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;

    @Override
    protected 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);
    }

    @Override
    protected 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.AndroidMuPDFReaderView
        android: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;

    @Override
    protected 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();
        }
    }

    @Override
    protected 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.PDFView
        android: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;

    @Override
    protected 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 预览功能


http://www.kler.cn/a/535610.html

相关文章:

  • PHP JSON操作指南
  • 基于RTOS的STM32游戏机
  • 【Prometheus】如何通过golang生成prometheus格式数据
  • 三维粒子滤波(Particle Filter)MATLAB例程,估计三维空间中匀速运动目标的位置(x, y, z),提供下载链接
  • PostgreSQL函数自动Commit/Rollback所带来的问题
  • 6 加密技术与认证技术
  • 【机器学习】K近邻算法的实现
  • (四)QT——QMainWindow——界面菜单设计
  • 【React】setState进阶
  • git 项目的更新
  • C++ auto的使用
  • CVPR2021 | VMI-FGSM VNI-FGSM | 通过方差调整增强对抗攻击的可迁移性
  • vs code 使用教程
  • 采用gitlab的package registry 方式 通过api 上传发布包,解决git命令拉取大文件异常退出问题
  • Deno vs Node.js:性能对比深度解析
  • 2025简约的打赏系统PHP网站源码
  • 语义分割简述
  • Python-memoryutils:内存泄漏检测与防止工具
  • JS:将JS对象格式化为php语法形式(完美支持无unicode编码匹配的正则)
  • Debian安装Seafile
  • 【基于SprintBoot+Mybatis+Mysql】电脑商城项目之修改密码和个人资料
  • android 适配 api 35(android 15) 遇到的问题
  • 接雨水算法 思路讲解与拓展
  • python:csv文件批量导入mysql
  • 前端控制器模式
  • 【目标检测】模型验证:K-Fold 交叉验证