使用 Uri 用 Kotlin 解析 pdf?

Posted

技术标签:

【中文标题】使用 Uri 用 Kotlin 解析 pdf?【英文标题】:Parsing pdf with Kotlin using a Uri? 【发布时间】:2020-11-16 04:28:07 【问题描述】:

我在 android Studio 中编写 Kotlin 代码。用户从手机中选择一个文件(我需要以字符串的形式访问内容)。我有一个 Uri?用那个乌里?我可以从 .csv 和 .txt 文件中提取文本:

if (typeOfFile == ".txt" || typeOfFile == ".csv") 
            try 
                val ins: InputStream? = contentResolver?.openInputStream(uriFromSelectedFile)
                val reader = BufferedReader(ins!!.reader())
                textIWant = reader.readText()

...

获取文件类型也可以正常工作,但在打开 pdf 文件时,似乎没有任何效果。我尝试以各种方式使用来自 Apache 的 PDFBox。我尝试打开的pdf是一个简单的onePager,只包含可提取的文本(可以复制)like this pdf。

这是我尝试过的事情之一,当要打开的文件是 pdf 时手机会死机:

if (typeOfFile == ".pdf") 
            try 
                val myPDDocument:PDDocument = PDDocument(COSDocument(ScratchFile(File(uriFromSelectedFile.path))))
                textIWant = PDFTextStripper().getText(myPDDocument)

...

我已经尝试了好几天了。有谁知道它在 Kotlin 中是如何工作的?

【问题讨论】:

请包含您尝试过的代码,并链接到 PDF。确保 PDF 包含要提取的文本(尝试从 Adob​​e Reader 复制和粘贴) 希望现在更好 您的代码看起来很可疑。在 Java 中,加载 PDF 是“PDDocument.load(file)”。你在做什么是不同的。我不知道 Kotlin,所以请找到如何调用静态方法。似乎不容易:***.com/questions/40352684 如果您设法更正了您的代码,以便 PDF 打开和文本剥离工作,请自己回答问题,这将有助于其他人。 我会尽快。现在我仍然不知道该怎么做。我正在继续进行更多的研究和尝试...... 【参考方案1】:

它使用 tom_roush.pdfbox 和一个伴随对象工作:

import com.tom_roush.pdfbox.text.PDFTextStripper

class MainActivity : AppCompatActivity() 

companion object PdfParser 
    fun parse(fis: InputStream): String 
        var content = ""
        com.tom_roush.pdfbox.pdmodel.PDDocument.load(fis).use  pdfDocument ->
            if (!pdfDocument.isEncrypted) 
               content = PDFTextStripper().getText(pdfDocument)
           
        
        return content
    

调用伴生对象的解析函数:

val fis: InputStream = contentResolver?.openInputStream(uriFromSelectedFile)!!
textIWant = parse(fis)

【讨论】:

太好了,你让它工作了!不要忘记关闭“fis”(除非 Kotlin 自动执行此操作)。

以上是关于使用 Uri 用 Kotlin 解析 pdf?的主要内容,如果未能解决你的问题,请参考以下文章

快速上手 Kotlin 的 11 招

Mockito.anyString()在Kotlin中与NPE崩溃

Kotlin学习手记——Json解析

用Prototype JS解析URI参数

获取AbstractKotlinInspection要包含哪些kotlin库?

无法使用 kotlin-multipatform 项目