Apache Tika解析doc/docx/pdf文件返回空白文本问题求助
问题原因
1. 依赖配置错误(核心原因)
Apache Tika 2.x版本中,tika-parsers-standard-package属于POM类型依赖,你未在依赖声明中指定<type>pom</type>,导致该依赖下的所有解析器实现Jar包没有被引入项目,Tika无法加载对应文件类型的解析器,只能识别文件类型但无法提取文本。
2. 依赖版本冲突
Tika 2.1.0官方适配的POI版本为5.0.0,你手动指定了POI 5.1.0版本,会导致类版本不兼容,进一步影响解析器初始化。
3. 输入流操作逻辑错误
parser.parse()执行完成后输入流已经被完全读取,流指针处于EOF位置,此时调用detect方法无法读取到有效数据- 若输入流不支持
mark/reset,自动类型检测时读取流头部字节后,流指针不会复位,后续解析会从偏移位置开始读取,导致解析失败
解决方案
第一步:修正依赖配置
移除手动添加的POI相关依赖,直接使用Tika标准包传递的适配版本POI,同时指定解析器包的类型为pom,修正后的依赖如下:
<dependency> <groupId>org.apache.tika</groupId> <artifactId>tika-core</artifactId> <version>2.1.0</version> </dependency> <dependency> <groupId>org.apache.tika</groupId> <artifactId>tika-parsers-standard-package</artifactId> <version>2.1.0</version> <type>pom</type> </dependency>
第二步:修正解析代码逻辑
调整流操作顺序,增加流指针复位逻辑,修正后的代码如下:
public String parseToPlainText(InputStream inputStream) { // 确保输入流支持mark/reset,不支持则包装为BufferedInputStream if (!inputStream.markSupported()) { inputStream = new BufferedInputStream(inputStream); } // 标记流起始位置,预留足够大的读取上限避免mark失效 inputStream.mark(Integer.MAX_VALUE); BodyContentHandler handler = new BodyContentHandler(Integer.MAX_VALUE); AutoDetectParser parser = new AutoDetectParser(); Metadata metadata = new Metadata(); ParseContext parseContext = new ParseContext(); String content = ""; try { // 先检测MIME类型,检测完成后复位流指针 MediaType mediaType = parser.getDetector().detect(inputStream, metadata); System.out.println("检测到文件类型:" + mediaType); inputStream.reset(); // 执行解析 parser.parse(inputStream, handler, metadata, parseContext); content = handler.toString(); } catch (IOException | SAXException | TikaException e) { logger.error("文件解析失败", e); } finally { try { inputStream.close(); } catch (IOException e) { logger.error("流关闭失败", e); } } return content; }
内容的提问来源于stack exchange,提问作者Jedupont
相关产品推荐
相关产品推荐

