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

Android PDF 操作 - AndroidPdfViewer 显示 PDF 异常清单(数据为 null、数据为空、PDF 文件损坏、非 PDF 文件)

正常情况

1、Setting
  • settings.gradle
dependencyResolutionManagement {...repositories {...maven { url 'https://jitpack.io' }maven { url "https://repository.liferay.com/nexus/content/repositories/public/" }}
}
  • 模块级 build.gradle
implementation 'com.github.barteksc:android-pdf-viewer:3.2.0-beta.1'
2、Activity Layout
<?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:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".viewpdf.ViewPDFActivity"><Buttonandroid:id="@+id/btn_open_pdf"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="打开 PDF 文件"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" /><com.github.barteksc.pdfviewer.PDFViewandroid:id="@+id/pdfv_container"android:layout_width="300dp"android:layout_height="300dp"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@+id/btn_open_pdf" />
</androidx.constraintlayout.widget.ConstraintLayout>
3、Activity Code
Button btnOpenPdf = findViewById(R.id.btn_open_pdf);
PDFView pdfvContainer = findViewById(R.id.pdfv_container);btnOpenPdf.setOnClickListener(v -> {File pdfFile = new File(getFilesDir(), "test.pdf");InputStream inputStream;try {inputStream = new FileInputStream(pdfFile);} catch (FileNotFoundException e) {e.printStackTrace();Toast.makeText(this, "PDF 文件不存在", Toast.LENGTH_SHORT).show();return;}pdfvContainer.fromStream(inputStream).enableSwipe(true) // 启用手势滑动翻页.swipeHorizontal(false) // 设置滑动方向为垂直滑动.enableDoubletap(true) // 启用双击缩放.defaultPage(0) // 设置初始显示的页面.load();
});

一、数据为 null

1、基本测试
private byte[] getData() {return null;
}
byte[] data = getData();pdfvContainer.fromBytes(data).enableSwipe(true) // 启用手势滑动翻页.swipeHorizontal(false) // 设置滑动方向为垂直滑动.enableDoubletap(true) // 启用双击缩放.defaultPage(0) // 设置初始显示的页面.load();
  • 底层报错,应用闪退,输出结果如下
D  Init FPDF library
java_vm_ext.cc:570] JNI DETECTED ERROR IN APPLICATION: java_array == null
java_vm_ext.cc:570]     in call to GetPrimitiveArray
java_vm_ext.cc:570]     from long com.shockwave.pdfium.PdfiumCore.nativeOpenMemDocument(byte[], java.lang.String)
runtime.cc:647] Runtime aborting...
runtime.cc:647] Dumping all threads without mutator lock held
2、异常捕获测试
private byte[] getData() {return null;
}
byte[] data = getData();try {pdfvContainer.fromBytes(data).enableSwipe(true) // 启用手势滑动翻页.swipeHorizontal(false) // 设置滑动方向为垂直滑动.enableDoubletap(true) // 启用双击缩放.defaultPage(0) // 设置初始显示的页面.load();
} catch (Exception e) {e.printStackTrace();
}
  • 异常捕获无效,底层报错,应用闪退,输出结果如下
D  Init FPDF library
java_vm_ext.cc:570] JNI DETECTED ERROR IN APPLICATION: java_array == null
java_vm_ext.cc:570]     in call to GetPrimitiveArray
java_vm_ext.cc:570]     from long com.shockwave.pdfium.PdfiumCore.nativeOpenMemDocument(byte[], java.lang.String)
runtime.cc:647] Runtime aborting...
runtime.cc:647] Dumping all threads without mutator lock held
3、onError 回调测试
private byte[] getData() {return null;
}
byte[] data = getData();pdfvContainer.fromBytes(data).enableSwipe(true) // 启用手势滑动翻页.swipeHorizontal(false) // 设置滑动方向为垂直滑动.enableDoubletap(true) // 启用双击缩放.defaultPage(0) // 设置初始显示的页面.onError(t -> {Log.i(TAG, "加载 PDF 失败:" + t.getMessage());}).load();
  • onError 回调无效,底层报错,应用闪退,输出结果如下
D  Init FPDF library
java_vm_ext.cc:570] JNI DETECTED ERROR IN APPLICATION: java_array == null
java_vm_ext.cc:570]     in call to GetPrimitiveArray
java_vm_ext.cc:570]     from long com.shockwave.pdfium.PdfiumCore.nativeOpenMemDocument(byte[], java.lang.String)
runtime.cc:647] Runtime aborting...
runtime.cc:647] Dumping all threads without mutator lock held

二、数据为空

1、基本测试
private byte[] getData() {return new byte[0];
}
byte[] data = getData();pdfvContainer.fromBytes(data).enableSwipe(true) // 启用手势滑动翻页.swipeHorizontal(false) // 设置滑动方向为垂直滑动.enableDoubletap(true) // 启用双击缩放.defaultPage(0) // 设置初始显示的页面.load();
  • 报错,应用不闪退,异常在库内被捕获,输出结果如下
load pdf error
java.io.IOException: cannot create document: File not in PDF format or corrupted.at com.shockwave.pdfium.PdfiumCore.nativeOpenMemDocument(Native Method)at com.shockwave.pdfium.PdfiumCore.newDocument(PdfiumCore.java:150)at com.github.barteksc.pdfviewer.source.ByteArraySource.createDocument(ByteArraySource.java:35)at com.github.barteksc.pdfviewer.DecodingAsyncTask.doInBackground(DecodingAsyncTask.java:53)at com.github.barteksc.pdfviewer.DecodingAsyncTask.doInBackground(DecodingAsyncTask.java:27)...
2、onError 回调测试
private byte[] getData() {return new byte[0];
}
byte[] data = getData();pdfvContainer.fromBytes(data).enableSwipe(true) // 启用手势滑动翻页.swipeHorizontal(false) // 设置滑动方向为垂直滑动.enableDoubletap(true) // 启用双击缩放.defaultPage(0) // 设置初始显示的页面.onError(t -> {Log.i(TAG, "加载 PDF 失败:" + t.getMessage());}).load();
  • onError 回调触发,输出结果如下
加载 PDF 失败:cannot create document: File not in PDF format or corrupted.

三、数据异常(PDF 文件损坏)

1、基本测试
private byte[] getData() {try {File pdfFile = new File(getFilesDir(), "test.pdf");InputStream inputStream = new FileInputStream(pdfFile);ByteArrayOutputStream buffer = new ByteArrayOutputStream();int nRead;byte[] data = new byte[1024];while ((nRead = inputStream.read(data, 0, data.length)) != -1) {buffer.write(data, 0, nRead);}byte[] bytes = buffer.toByteArray();// 替换 100 个字节for (int i = 0; i < 100; i++) {bytes[i] = (byte) (bytes[i] + 1);}return bytes;} catch (IOException e) {e.printStackTrace();}return null;
}
byte[] data = getData();pdfvContainer.fromBytes(data).enableSwipe(true) // 启用手势滑动翻页.swipeHorizontal(false) // 设置滑动方向为垂直滑动.enableDoubletap(true) // 启用双击缩放.defaultPage(0) // 设置初始显示的页面.load();
  • 报错,应用不闪退,异常在库内被捕获,输出结果如下
load pdf error
java.io.IOException: cannot create document: File not in PDF format or corrupted.at com.shockwave.pdfium.PdfiumCore.nativeOpenMemDocument(Native Method)at com.shockwave.pdfium.PdfiumCore.newDocument(PdfiumCore.java:150)at com.github.barteksc.pdfviewer.source.ByteArraySource.createDocument(ByteArraySource.java:35)at com.github.barteksc.pdfviewer.DecodingAsyncTask.doInBackground(DecodingAsyncTask.java:53)at com.github.barteksc.pdfviewer.DecodingAsyncTask.doInBackground(DecodingAsyncTask.java:27)...
2、onError 回调测试
private byte[] getData() {try {File pdfFile = new File(getFilesDir(), "test.pdf");InputStream inputStream = new FileInputStream(pdfFile);ByteArrayOutputStream buffer = new ByteArrayOutputStream();int nRead;byte[] data = new byte[1024];while ((nRead = inputStream.read(data, 0, data.length)) != -1) {buffer.write(data, 0, nRead);}byte[] bytes = buffer.toByteArray();// 替换 100 个字节for (int i = 0; i < 100; i++) {bytes[i] = (byte) (bytes[i] + 1);}return bytes;} catch (IOException e) {e.printStackTrace();}return null;
}
byte[] data = getData();pdfvContainer.fromBytes(data).enableSwipe(true) // 启用手势滑动翻页.swipeHorizontal(false) // 设置滑动方向为垂直滑动.enableDoubletap(true) // 启用双击缩放.defaultPage(0) // 设置初始显示的页面.onError(t -> {Log.i(TAG, "加载 PDF 失败:" + t.getMessage());}).load();
  • onError 回调触发,输出结果如下
加载 PDF 失败:cannot create document: File not in PDF format or corrupted.

四、数据异常(非 PDF 文件)

1、基本测试
private byte[] getData() {try {File pdfFile = new File(getFilesDir(), "test.docx");InputStream inputStream = new FileInputStream(pdfFile);ByteArrayOutputStream buffer = new ByteArrayOutputStream();int nRead;byte[] data = new byte[1024];while ((nRead = inputStream.read(data, 0, data.length)) != -1) {buffer.write(data, 0, nRead);}return buffer.toByteArray();} catch (IOException e) {e.printStackTrace();}return null;
}
byte[] data = getData();pdfvContainer.fromBytes(data).enableSwipe(true) // 启用手势滑动翻页.swipeHorizontal(false) // 设置滑动方向为垂直滑动.enableDoubletap(true) // 启用双击缩放.defaultPage(0) // 设置初始显示的页面.load();
  • 报错,应用不闪退,异常在库内被捕获,输出结果如下
load pdf error
java.io.IOException: cannot create document: File not in PDF format or corrupted.at com.shockwave.pdfium.PdfiumCore.nativeOpenMemDocument(Native Method)at com.shockwave.pdfium.PdfiumCore.newDocument(PdfiumCore.java:150)at com.github.barteksc.pdfviewer.source.ByteArraySource.createDocument(ByteArraySource.java:35)at com.github.barteksc.pdfviewer.DecodingAsyncTask.doInBackground(DecodingAsyncTask.java:53)at com.github.barteksc.pdfviewer.DecodingAsyncTask.doInBackground(DecodingAsyncTask.java:27)...
2、onError 回调测试
private byte[] getData() {try {File pdfFile = new File(getFilesDir(), "test.docx");InputStream inputStream = new FileInputStream(pdfFile);ByteArrayOutputStream buffer = new ByteArrayOutputStream();int nRead;byte[] data = new byte[1024];while ((nRead = inputStream.read(data, 0, data.length)) != -1) {buffer.write(data, 0, nRead);}return buffer.toByteArray();} catch (IOException e) {e.printStackTrace();}return null;
}
byte[] data = getData();pdfvContainer.fromBytes(data).enableSwipe(true) // 启用手势滑动翻页.swipeHorizontal(false) // 设置滑动方向为垂直滑动.enableDoubletap(true) // 启用双击缩放.defaultPage(0) // 设置初始显示的页面.onError(t -> {Log.i(TAG, "加载 PDF 失败:" + t.getMessage());}).load();
  • onError 回调触发,输出结果如下
加载 PDF 失败:cannot create document: File not in PDF format or corrupted.
http://www.dtcms.com/a/540041.html

相关文章:

  • 界面控件DevExpress WPF v25.2预览 - 模板工具包全新升级
  • 【音视频】H264中的SPS和PPS
  • ThinkPHP6 集成TCP长连接 GatewayWorker
  • TMap的查询
  • SpringCloud--Sleuth 解析
  • 【C++:继承和多态】多态加餐:面试常考——多态的常见问题11问
  • 零基础新手小白快速了解掌握服务集群与自动化运维(十五)Redis模块-哨兵集群
  • 今日Cortex-M3/M4研究总结
  • 2014吉林省赛题解 | CCUT应用OJ题解——Sign in
  • 涿州网站建设推广浙江建筑信息网站
  • 前端性能优化实战指南:从首屏加载到用户体验的全面提升
  • 【OPENGL ES 3.0 学习笔记】第十一天:glDrawArrays和glDrawElements
  • Linux入门1(2/2)
  • ubuntu24安装mysql遇到的坑----解决Mysql报错缺少libaio.so.1
  • 【星光不负 码向未来 | 万字解析:基于ArkUI声明式UI与分布式数据服务构建生产级跨设备音乐播放器】
  • UniApp 在手机端(Android)打开选择文件和文件写入
  • HarmonyOS分布式媒体播放器——跨设备音视频无缝流转
  • 【金融行业案例】基于Vaadin全栈Java框架重构内部系统,全面提升开发效率与用户体验
  • 小型网站开发要多少钱苏州专业做网站的公司哪家好
  • RocketMQ 生产环境性能调优实战:从 0 到 1 打造高可用消息队列系统
  • 脉冲按摩贴方案开发, 脉冲按摩贴MCU控制方案设计
  • 特别酷炫网站做网站有费用吗
  • DrissionPage 基于 Python 的网页自动化工具
  • Next.js vs Vue.js:2025年全栈战场,谁主沉浮?
  • DAY01笔记
  • 10-js基础(ESMAScript)
  • 一次深入排查:Spring Cloud Gateway TCP 连接复用导致 K8s 负载均衡失效
  • 基于 Vue3 及TypeScript 项目后的总结
  • Android下解决滑动冲突的常见思路是什么?
  • 建筑外观设计网站如何做一个门户网站