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

如何在Apache Tika代码中指定PDF文件读取编码?

在Kotlin中使用Apache Tika显式指定编码提取PDF文本

问题背景

我正在尝试使用Apache Tika提取PDF文件中的文本,现有Kotlin代码可正常运行,但需要处理非UTF-8编码的文件。已知Tika具备自动编码检测能力,但希望能像CLI的--encoding选项那样,在代码中显式指定编码。现有代码如下:

class SampleParser {
    fun execute(fileName: String) {
        val pdfParser = PDFParser()
        val contentHandler = BodyContentHandler()
        val metadata = Metadata()
        val context = ParseContext()

        val inputStream = this.javaClass.classLoader.getResourceAsStream(fileName)

        pdfParser.parse(inputStream, contentHandler, metadata, context)

        println(contentHandler.toString())
    }
}

解决方案

可以通过两种方式实现显式指定编码:

1. 控制输出文本的编码

默认的BodyContentHandler使用UTF-8编码写入内容,你可以通过传入指定编码的Writer来显式控制输出编码:

class SampleParser {
    fun execute(fileName: String, targetCharset: String = "UTF-8") {
        val pdfParser = PDFParser()
        val metadata = Metadata()
        val context = ParseContext()

        val inputStream = this.javaClass.classLoader.getResourceAsStream(fileName)
        // 创建指定编码的Writer
        val stringWriter = StringWriter()
        val encodedWriter = OutputStreamWriter(stringWriter, targetCharset)
        val contentHandler = BodyContentHandler(encodedWriter)

        pdfParser.parse(inputStream, contentHandler, metadata, context)
        
        // 确保内容完全写入并关闭资源
        encodedWriter.flush()
        encodedWriter.close()

        println(stringWriter.toString())
    }
}

调用时直接传入目标编码即可,比如:

SampleParser().execute("non-utf8.pdf", "GBK")

2. 告知Tika优先使用指定编码解析

如果PDF文件的编码检测不准确,你可以通过Metadata设置CONTENT_ENCODING属性,让Tika优先使用指定编码解析内容:

class SampleParser {
    fun execute(fileName: String, parseCharset: String = "UTF-8") {
        val pdfParser = PDFParser()
        val contentHandler = BodyContentHandler()
        val metadata = Metadata()
        val context = ParseContext()

        // 设置解析时优先使用的编码
        metadata.set(Metadata.CONTENT_ENCODING, parseCharset)

        val inputStream = this.javaClass.classLoader.getResourceAsStream(fileName)

        pdfParser.parse(inputStream, contentHandler, metadata, context)

        println(contentHandler.toString())
    }
}

注意事项

PDF文件的文本编码通常由其内部的字体和编码字典定义,Tika的PDFParser会优先遵循PDF内部的编码配置。显式设置编码更多是用于编码信息缺失、检测错误,或者需要将输出文本转换为指定编码的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 15:25:07