我正在使用Tika / tika-app-1.17.jar来提取出一张有两张幻灯片的MS-PowerPoint(.pptx) - 一张幻灯片由一个嵌入式Excel /表格组成(我假设是一个OLE自动化对象)。第二个是带内容的普通幻灯片。
我的问题是尝试使用Apache POIFS将.pptx的提取部分(特别是嵌入式Excel /表)读回Java VM。 POI无法将生成的slide1_rId3_oleObject1.bin识别为嵌入的OLE对象。运行PowerShell(gc命令)向我显示二进制文件确实有正确的“标题” - 这是转储的前30个字节:
d0 cf 11 e0 a1 b1 1a e1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3e 0 3 0 fe ff
我尝试将文件作为DocumentInputStream重新读取,并尝试将其作为Ole10Native实现 - 来自POIFS,但没有取得多大成功。
当Tika提取.pptx部分时,我注意到以下内容。这是Tika在打开--list-parser-details选项的情况下运行(和-v用于详细):
org.apache.tika.parser.AutoDetectParser (Composite Parser):
org.apache.tika.parser.CompositeParser (Composite Parser):
org.apache.tika.parser.txt.TXTParser (Wrapped by With Types)
text/plain
org.apache.tika.parser.pdf.PDFParser (Wrapped by With Types)
application/pdf
org.apache.tika.parser.html.HtmlParser (Wrapped by With Types)
text/html
application/vnd.wap.xhtml+xml
application/x-asp
application/xhtml+xml
org.apache.tika.parser.microsoft.OfficeParser (Wrapped by With Types)
application/x-tika-msoffice-embedded; format=ole10_native
application/msword
application/vnd.visio
application/vnd.ms-project
more output...
org.apache.tika.parser.microsoft.ooxml.OOXMLParser (Wrapped by With Types)
application/vnd.ms-powerpoint.template.macroenabled.12
application/vnd.ms-excel.addin.macroenabled.12
application/vnd.openxmlformats-officedocument.wordprocessingml.template
application/vnd.ms-excel.sheet.binary.macroenabled.12
application/vnd.openxmlformats-officedocument.wordprocessingml.document
more output...
<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta name="X-Parsed-By" content="org.apache.tika.parser.CompositeParser"/>
<meta name="X-Parsed-By" content="org.apache.tika.parser.microsoft.OfficeParser"/>
<meta name="resourceName" content="sample.pptx"/>
<meta name="Content-Length" content="1536"/>
<meta name="Content-Type" content="application/x-tika-msoffice"/>
<title/>
</head>
<body/>
</html>
我可以共享我用来尝试实现嵌入式.bin文件的代码(用Java)。但是,我还没有看到有人回读使用POIFS从Tika中提取的这些“嵌入式OLE”文件之一的具体示例。这是否可能 - 或者是否有更有效的方法来做到这一点 - 我忽略了?
感谢您提供的任何指导或代码示例。