如何使用Tika 2.4.1正确提取DOCX文件的文本与图片?
Tika 2.4.1版本正确提取DOCX文本与图片的解决方案
直接使用OOXMLParser解析
DOCX属于OOXML格式,绕过AutoDetector直接调用专门的OOXMLParser,能确保正确解析文本和嵌入图片:
// 初始化OOXML解析器 Parser parser = new OOXMLParser(); ParseContext context = new ParseContext(); // 配置嵌入资源提取逻辑,仅处理图片 context.set(EmbeddedDocumentExtractor.class, new EmbeddedDocumentExtractor() { @Override public boolean shouldParseEmbedded(Metadata metadata) { return metadata.get(Metadata.CONTENT_TYPE).startsWith("image/"); } @Override public void parseEmbedded(InputStream inputStream, ContentHandler contentHandler, Metadata metadata, boolean b) throws IOException, SAXException, TikaException { // 示例:将图片保存到本地 String imageName = metadata.get(Metadata.RESOURCE_NAME_KEY); Files.copy(inputStream, Paths.get("./extracted_images/" + imageName), StandardCopyOption.REPLACE_EXISTING); } }); // 执行解析 try (InputStream stream = new FileInputStream("target.docx")) { Metadata metadata = new Metadata(); BodyContentHandler contentHandler = new BodyContentHandler(); parser.parse(stream, contentHandler, metadata, context); // 获取提取的文本内容 String docText = contentHandler.toString(); }
调整AutoDetector配置,确保识别DOCX格式
通过TikaConfig加载完整的格式检测规则,让AutoDetector正确识别DOCX的媒体类型:
// 加载默认Tika配置,包含所有格式检测规则 TikaConfig config = TikaConfig.getDefaultConfig(); Detector detector = config.getDetector(); Parser parser = config.getParser(); ParseContext context = new ParseContext(); context.set(Parser.class, parser); try (InputStream stream = new FileInputStream("target.docx")) { Metadata metadata = new Metadata(); // 检测文件格式,此时应识别为application/vnd.openxmlformats-officedocument.wordprocessingml.document MediaType mediaType = detector.detect(stream, metadata); // 解析文件,提取文本和图片 BodyContentHandler contentHandler = new BodyContentHandler(); parser.parse(stream, contentHandler, metadata, context); }
检查依赖完整性
确保项目依赖包含Tika标准解析器包,避免因缺失OOXML解析模块导致识别错误:
Maven依赖配置:
<dependency> <groupId>org.apache.tika</groupId> <artifactId>tika-parsers-standard-package</artifactId> <version>2.4.1</version> </dependency>
补充说明
Tika 2.x对Detector和Parser的结构做了调整,DOCX本质是zip压缩包,若依赖不全或配置不当,AutoDetector会优先识别为application/zip并使用PackageParser,上述方法可强制使用正确的OOXML解析器,实现文本与图片的正常提取。
内容的提问来源于stack exchange,提问作者Mikael Gu
相关产品推荐
相关产品推荐

