You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PDFBox 3.0.0加载FDF文件时遇Header不含versioninfo错误求助

PDFBox加载FDF文件报错:Header doesn't contain 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)
...

解决步骤

  1. 修复文件复制逻辑
    原代码仅创建了本地文件对象,但未将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()
                }
            }
        }
    }
    
  2. 验证文件有效性
    加载前先确认文件类型为FDF,避免加载错误文件:

    val mimeType = contentResolver.getType(uri)
    if (mimeType != "application/vnd.fdf") {
        // 提示用户选择正确的FDF格式文件
        return
    }
    
  3. 增加异常捕获
    包裹Loader.loadFDF调用,避免因文件损坏导致崩溃,同时给出友好提示。

内容的提问来源于stack exchange,提问作者Affan Ahmed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 02:59:59