使用 apache tika Parser 对象解析 .doc 和 .docx 文件格式的问题
issues using apache tika Parser object to parse .doc and .docx file formats
当我尝试使用 org.apache.tika.parser.Parser
和 DefaultDetector()
来检测和解析 .doc 和 .docx 文件格式时。但是我从 Tika 罐子中抛出一些错误(不是异常),并且没有任何有用的堆栈跟踪可供我放在这里。我可以确认它只发生在 .doc 和 .docx 上。 PDF、jpeg、文本都可以。有没有人遇到过 .doc 和 .docx 文件格式的这个问题?有什么解决办法吗?
我的代码如下:
unzippedBytes = loadUnzippedByteCode(attachment.getContents()); /* This is utility method written using native Java Zip library - returns byte array byte[] */
/* All the objects below were declared beforehand, but not initialised until now */
parseContextObj = new ParseContext();
dObj = new DefaultDetector();
detectedParser = new AutoDetectParser(dObj);
context.set(Parser.class, parser);
OutputStream outputstream = new ByteArrayOutputStream();
metadata = new Metadata();
InputStream input = TikaInputStream.get(unzippedBytes, metadata);
ContentHandler handler = new BodyContentHandler(outputstream);
detectedParser.parse(input, handler, metadata, parseContextObj); // This is where it is throwing NoSuchMethodError - cannot understand why and also cannot get the stacktrace - using tika 1.10 */
input.close();
上面的代码是我在其他一些 SO 问题中找到的,并决定将其用于我的工作。此外,我使用的 byte[] 是我从非常旧的 struts 1.0 FormFile 接口(returns byte[] 的 getFileData())收到的东西。我曾经使用扩音器的 irex 解析器来解析,但出于多种原因决定使用 Tika。 byte[] 适用于 irex,但每当我尝试解析 .docx 和 .doc 内容时就会出现问题。
以下是由于隐私原因我屏蔽了某些部分的堆栈跟踪:
2016-01-15 16:21:06,947 [http-apr-80-exec-3] [ERROR] XXXXX.XXXX.XXXXService - java.lang.NoSuchMethodError: org.apache.poi.util.POILogger.log(I[L
java/lang/Object;)V
at org.apache.poi.openxml4j.opc.PackageRelationshipCollection.parseRelationshipsPart(PackageRelationshipCollection.java:313)
at org.apache.poi.openxml4j.opc.PackageRelationshipCollection.<init>(PackageRelationshipCollection.java:163)
at org.apache.poi.openxml4j.opc.PackageRelationshipCollection.<init>(PackageRelationshipCollection.java:131)
at org.apache.poi.openxml4j.opc.PackagePart.loadRelationships(PackagePart.java:561)
at org.apache.poi.openxml4j.opc.PackagePart.<init>(PackagePart.java:109)
at org.apache.poi.openxml4j.opc.PackagePart.<init>(PackagePart.java:80)
at org.apache.poi.openxml4j.opc.PackagePart.<init>(PackagePart.java:125)
at org.apache.poi.openxml4j.opc.ZipPackagePart.<init>(ZipPackagePart.java:78)
at org.apache.poi.openxml4j.opc.ZipPackage.getPartsImpl(ZipPackage.java:245)
at org.apache.poi.openxml4j.opc.OPCPackage.getParts(OPCPackage.java:684)
at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:227)
at org.apache.tika.parser.pkg.ZipContainerDetector.detectOPCBased(ZipContainerDetector.java:208)
at org.apache.tika.parser.pkg.ZipContainerDetector.detectZipFormat(ZipContainerDetector.java:145)
at org.apache.tika.parser.pkg.ZipContainerDetector.detect(ZipContainerDetector.java:88)
at org.apache.tika.detect.CompositeDetector.detect(CompositeDetector.java:77)
at org.apache.tika.parser.AutoDetectParser.parse(AutoDetectParser.java:112)
我意识到我的路径有 POI jar 版本 2.5.1,根据 maven central repo,我是一只恐龙(看起来像),这可能是为什么?在将所有 these 分别用于 poi 工件和 xmlbeans 的版本 3.13 和 2.60 之后,我也遇到了错误(由@venkyreddy 在该答案中建议)。
更新
我尝试从原来的工作中单独构建一个新项目,并仅在我的 class 路径中使用 tika-app-1.10.jar。我还调查了 tika-app-1.10.jar
,发现所有 POI 依赖项实际上都在那里,包括 xmlbeans
和 'xml-schema'。在我的 class 路径中仅保留 tika-app-1.10.jar
后,我收到以下错误(不是异常):
java.lang.NoClassDefFoundError: org/apache/poi/POIXMLTypeLoader
at org.openxmlformats.schemas.wordprocessingml.x2006.main.DocumentDocument$Factory.parse(Unknown Source)
at org.apache.poi.xwpf.usermodel.XWPFDocument.onDocumentRead(XWPFDocument.java:158)
at org.apache.poi.POIXMLDocument.load(POIXMLDocument.java:167)
at org.apache.poi.xwpf.usermodel.XWPFDocument.<init>(XWPFDocument.java:119)
at org.apache.poi.xwpf.extractor.XWPFWordExtractor.<init>(XWPFWordExtractor.java:59)
at org.apache.poi.extractor.ExtractorFactory.createExtractor(ExtractorFactory.java:204)
at org.apache.tika.parser.microsoft.ooxml.OOXMLExtractorFactory.parse(OOXMLExtractorFactory.java:86)
at org.apache.tika.parser.microsoft.ooxml.OOXMLParser.parse(OOXMLParser.java:87)
at org.apache.tika.parser.CompositeParser.parse(CompositeParser.java:280)
at org.apache.tika.parser.CompositeParser.parse(CompositeParser.java:280)
at org.apache.tika.parser.AutoDetectParser.parse(AutoDetectParser.java:120)
at xxx.xxx.xxx.xxx.xxxxxAttachmentWithTika(xxxService.java:792)
我浏览了包,但找不到任何 POIXMLTypeLoader class。这是一个已知的问题?有人可以回复我吗?
确保没有过时的 POI jar 并使用与您尝试使用的 Tika 版本匹配的 POI 版本。
class POIXMLTypeLoader
是在 POI 3.13 发布后添加到 POI 中的,所以你似乎以某种方式混合了更新的版本。只有发布 POI 3.14-beta1 才知道这个 class!确保您没有以某种方式包含该版本。
当我尝试使用 org.apache.tika.parser.Parser
和 DefaultDetector()
来检测和解析 .doc 和 .docx 文件格式时。但是我从 Tika 罐子中抛出一些错误(不是异常),并且没有任何有用的堆栈跟踪可供我放在这里。我可以确认它只发生在 .doc 和 .docx 上。 PDF、jpeg、文本都可以。有没有人遇到过 .doc 和 .docx 文件格式的这个问题?有什么解决办法吗?
我的代码如下:
unzippedBytes = loadUnzippedByteCode(attachment.getContents()); /* This is utility method written using native Java Zip library - returns byte array byte[] */
/* All the objects below were declared beforehand, but not initialised until now */
parseContextObj = new ParseContext();
dObj = new DefaultDetector();
detectedParser = new AutoDetectParser(dObj);
context.set(Parser.class, parser);
OutputStream outputstream = new ByteArrayOutputStream();
metadata = new Metadata();
InputStream input = TikaInputStream.get(unzippedBytes, metadata);
ContentHandler handler = new BodyContentHandler(outputstream);
detectedParser.parse(input, handler, metadata, parseContextObj); // This is where it is throwing NoSuchMethodError - cannot understand why and also cannot get the stacktrace - using tika 1.10 */
input.close();
上面的代码是我在其他一些 SO 问题中找到的,并决定将其用于我的工作。此外,我使用的 byte[] 是我从非常旧的 struts 1.0 FormFile 接口(returns byte[] 的 getFileData())收到的东西。我曾经使用扩音器的 irex 解析器来解析,但出于多种原因决定使用 Tika。 byte[] 适用于 irex,但每当我尝试解析 .docx 和 .doc 内容时就会出现问题。
以下是由于隐私原因我屏蔽了某些部分的堆栈跟踪:
2016-01-15 16:21:06,947 [http-apr-80-exec-3] [ERROR] XXXXX.XXXX.XXXXService - java.lang.NoSuchMethodError: org.apache.poi.util.POILogger.log(I[L
java/lang/Object;)V
at org.apache.poi.openxml4j.opc.PackageRelationshipCollection.parseRelationshipsPart(PackageRelationshipCollection.java:313)
at org.apache.poi.openxml4j.opc.PackageRelationshipCollection.<init>(PackageRelationshipCollection.java:163)
at org.apache.poi.openxml4j.opc.PackageRelationshipCollection.<init>(PackageRelationshipCollection.java:131)
at org.apache.poi.openxml4j.opc.PackagePart.loadRelationships(PackagePart.java:561)
at org.apache.poi.openxml4j.opc.PackagePart.<init>(PackagePart.java:109)
at org.apache.poi.openxml4j.opc.PackagePart.<init>(PackagePart.java:80)
at org.apache.poi.openxml4j.opc.PackagePart.<init>(PackagePart.java:125)
at org.apache.poi.openxml4j.opc.ZipPackagePart.<init>(ZipPackagePart.java:78)
at org.apache.poi.openxml4j.opc.ZipPackage.getPartsImpl(ZipPackage.java:245)
at org.apache.poi.openxml4j.opc.OPCPackage.getParts(OPCPackage.java:684)
at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:227)
at org.apache.tika.parser.pkg.ZipContainerDetector.detectOPCBased(ZipContainerDetector.java:208)
at org.apache.tika.parser.pkg.ZipContainerDetector.detectZipFormat(ZipContainerDetector.java:145)
at org.apache.tika.parser.pkg.ZipContainerDetector.detect(ZipContainerDetector.java:88)
at org.apache.tika.detect.CompositeDetector.detect(CompositeDetector.java:77)
at org.apache.tika.parser.AutoDetectParser.parse(AutoDetectParser.java:112)
我意识到我的路径有 POI jar 版本 2.5.1,根据 maven central repo,我是一只恐龙(看起来像),这可能是为什么?在将所有 these 分别用于 poi 工件和 xmlbeans 的版本 3.13 和 2.60 之后,我也遇到了错误(由@venkyreddy 在该答案中建议)。
更新
我尝试从原来的工作中单独构建一个新项目,并仅在我的 class 路径中使用 tika-app-1.10.jar。我还调查了 tika-app-1.10.jar
,发现所有 POI 依赖项实际上都在那里,包括 xmlbeans
和 'xml-schema'。在我的 class 路径中仅保留 tika-app-1.10.jar
后,我收到以下错误(不是异常):
java.lang.NoClassDefFoundError: org/apache/poi/POIXMLTypeLoader
at org.openxmlformats.schemas.wordprocessingml.x2006.main.DocumentDocument$Factory.parse(Unknown Source)
at org.apache.poi.xwpf.usermodel.XWPFDocument.onDocumentRead(XWPFDocument.java:158)
at org.apache.poi.POIXMLDocument.load(POIXMLDocument.java:167)
at org.apache.poi.xwpf.usermodel.XWPFDocument.<init>(XWPFDocument.java:119)
at org.apache.poi.xwpf.extractor.XWPFWordExtractor.<init>(XWPFWordExtractor.java:59)
at org.apache.poi.extractor.ExtractorFactory.createExtractor(ExtractorFactory.java:204)
at org.apache.tika.parser.microsoft.ooxml.OOXMLExtractorFactory.parse(OOXMLExtractorFactory.java:86)
at org.apache.tika.parser.microsoft.ooxml.OOXMLParser.parse(OOXMLParser.java:87)
at org.apache.tika.parser.CompositeParser.parse(CompositeParser.java:280)
at org.apache.tika.parser.CompositeParser.parse(CompositeParser.java:280)
at org.apache.tika.parser.AutoDetectParser.parse(AutoDetectParser.java:120)
at xxx.xxx.xxx.xxx.xxxxxAttachmentWithTika(xxxService.java:792)
我浏览了包,但找不到任何 POIXMLTypeLoader class。这是一个已知的问题?有人可以回复我吗?
确保没有过时的 POI jar 并使用与您尝试使用的 Tika 版本匹配的 POI 版本。
class POIXMLTypeLoader
是在 POI 3.13 发布后添加到 POI 中的,所以你似乎以某种方式混合了更新的版本。只有发布 POI 3.14-beta1 才知道这个 class!确保您没有以某种方式包含该版本。