【问题标题】:How to resolve the Java Exception In Initialize error?如何解决 Java Exception In Initialize 错误?
【发布时间】:2021-09-13 12:09:20
【问题描述】:

我正在创建一个可以从 pdf 中提取文本的应用程序。为此,我正在使用 PdfBox 库。但是,当我从文件管理器导入 pdf 时,应用程序停止,并且在初始化 PDFTextStripper 的行的 Initialize 错误中给出异常。我该如何解决这个问题?

下面是从pdf中提取文本的功能。

private fun extractTextPdfFile() {
   var document: PDDocument? = null
    var parsedText: String? = null
    try {
        val inputStream: InputStream? = this.contentResolver.openInputStream(fileUri!!)
        document = PDDocument.load(inputStream)
    } catch (e: IOException) {
        e.printStackTrace()
    }

    try {
        val pdfStripper = PDFTextStripper()
        pdfStripper.startPage = 0
        if (document != null) {
            pdfStripper.endPage = 1
        }
        parsedText="Parsed text: " + pdfStripper.getText(document)
    } catch (e: IOException) {
        e.printStackTrace()
    } finally {
        try {
            document?.close()
        } catch (e: IOException) {
            e.printStackTrace()
        }
    }
    findViewById<TextView>(R.id.file_path).text=parsedText

 }
}

我已经使用 registerForActivityResult 来获取 pdf 文档 Uri。

private var fileUri: Uri? = null
private val getContent =
    registerForActivityResult(ActivityResultContracts.GetContent()) { uri: Uri? ->
        // Handle the returned Uri
        if (uri != null) {
            fileUri = uri
        } else {
            Toast.makeText(
                this,
                "Cannot fetch document from the file manager",
                Toast.LENGTH_SHORT
            ).show()
        }
    }
  
 override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    findViewById<Button>(R.id.Import).setOnClickListener {
        getContent.launch("application/pdf")
        if (fileUri != null)
            extractTextPdfFile()
    }
}

这是我得到的例外。我不知道它现在如何给出空指针异常,之前它给出了我提到的异常。

 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void java.io.InputStream.close()' on a null object reference
    at com.tom_roush.pdfbox.text.PDFTextStripper.<clinit>(PDFTextStripper.java:1874)
    at com.example.doctranslator.MainActivity.extractTextPdfFile(MainActivity.kt:82) 
    at com.example.doctranslator.MainActivity.onCreate$lambda-1(MainActivity.kt:44) 
    at com.example.doctranslator.MainActivity.$r8$lambda$8z4EEPr6Q6JatIakz-DO65v-zdE(Unknown Source:0) 
    at com.example.doctranslator.MainActivity$$ExternalSyntheticLambda0.onClick(Unknown Source:2) 
    at android.view.View.performClick(View.java:8160) 
    at android.widget.TextView.performClick(TextView.java:16222) 
    at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1119) 
    at android.view.View.performClickInternal(View.java:8137) 
    at android.view.View.access$3700(View.java:888) 
    at android.view.View$PerformClick.run(View.java:30236) 
    at android.os.Handler.handleCallback(Handler.java:938) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:246) 
    at android.app.ActivityThread.main(ActivityThread.java:8595) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602) 

【问题讨论】:

  • 你能发布完整的异常消息(包括堆栈跟踪)吗?
  • 我添加了异常,但它现在给出了空指针异常。我很困惑,因为我没有更改代码。
  • 您的 jar 文件有问题,请确保“com/tom_roush/pdfbox/resources/text/BidiMirroring.txt”存在。看看github.com/TomRoush/PdfBox-Android/blob/master/library/src/main/…,如果资源不存在,输入将为空。
  • 如何在我的项目中添加这个 .txt 文件。我刚刚添加了 pdfBox 的依赖项来实现它。请帮我解决这个问题。
  • 首先确保你使用的是maven。其次,尝试它是否适用于以前的版本。我无法直接提供帮助,因为我没有设置 android 构建环境。您应该尝试使用以前的版本,但也要在错误跟踪器上报告错误。提到文件丢失并且空值检查丢失。我查看了 .aar(不是 .jar)文件,但它丢失了。 repo1.maven.org/maven2/com/tom-roush/pdfbox-android/2.0.3.0

标签: java kotlin exception pdfbox pdf-extraction


【解决方案1】:

听起来您在使用 PDFTextStripper 之前没有调用过PDFBoxResourceLoader.init(Context)。这是加载 PdfBox-Android 使用的某些文件(如 BidiMirroring.txt)所必需的。

我将PDFBoxResourceLoader.init(applicationContext) 添加到您的onCreate 函数中,并且能够使用您的代码成功提取文本。

【讨论】:

    【解决方案2】:

    您确定 PdfBox 库正在编译到您的代码中吗?因为如果它是在初始化时发生的错误,它似乎是一个编译错误,因为它无法引用库。

    您应该获取一些 kotlin 代码来将您的依赖项编译到您构建的应用程序中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-30
      • 1970-01-01
      • 1970-01-01
      • 2018-01-09
      • 1970-01-01
      • 2023-02-12
      • 2023-01-03
      • 1970-01-01
      相关资源
      最近更新 更多