使用PDFBox 3.0.0加载FDF文件时遇Header不含versioninfo错误求助
问题详情
使用PDFBox 3.0.0处理FDF文件,依赖配置:
implementation 'org.apache.pdfbox:pdfbox:3.0.0'
Kotlin代码片段:
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (requestCode == 101 && resultCode == RESULT_OK) { val uri = data?.data contentResolver.openFileDescriptor(uri!!, "r", null) val file = File(cacheDir, contentResolver.getFileName(uri)) if (file.exists()) { Loader.loadFDF(file) } } }
运行时触发致命错误:
FATAL EXCEPTION: main
Process: com.example.documnet.translator, PID: 31595
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=101, result=-1, data=Intent { dat=content://com.android.providers.downloads.documents/document/msf:796 flg=0x1 }} to activity {com.example.documnet.translator/com.example.documnet.translator.DashboardActivity}: java.io.IOException: Error: Header doesn't contain versioninfo
at android.app.ActivityThread.deliverResults(ActivityThread.java:5946)
...
Caused by: java.io.IOException: Error: Header doesn't contain versioninfo
at org.apache.pdfbox.pdfparser.FDFParser.parse(FDFParser.java:98)
at org.apache.pdfbox.Loader.loadFDF(Loader.java:79)
at com.example.documnet.translator.DashboardActivity.onActivityResult(DashboardActivity.kt:221)
...
解决步骤
修复文件复制逻辑
原代码仅创建了本地文件对象,但未将Uri指向的文件内容写入缓存文件,导致加载的是空文件或无效内容。补充内容复制逻辑:override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (requestCode == 101 && resultCode == RESULT_OK) { val uri = data?.data ?: return contentResolver.openInputStream(uri)?.use { inputStream -> val targetFile = File(cacheDir, contentResolver.getFileName(uri)) targetFile.outputStream().use { outputStream -> inputStream.copyTo(outputStream) } // 加载处理后的文件 try { Loader.loadFDF(targetFile) } catch (e: IOException) { // 处理加载失败,如提示用户文件无效 e.printStackTrace() } } } }验证文件有效性
加载前先确认文件类型为FDF,避免加载错误文件:val mimeType = contentResolver.getType(uri) if (mimeType != "application/vnd.fdf") { // 提示用户选择正确的FDF格式文件 return }增加异常捕获
包裹Loader.loadFDF调用,避免因文件损坏导致崩溃,同时给出友好提示。
内容的提问来源于stack exchange,提问作者Affan Ahmed

