如何在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
相关产品推荐
相关产品推荐

