【问题标题】:get embedded resourses in doc files using apache tika使用 apache tika 在 doc 文件中获取嵌入式资源
【发布时间】:2013-12-08 23:06:19
【问题描述】:

我有包含文本和图像的 ms word 文档。我想解析它们以获得它们的 xml 结构。经过研究,我最终使用 apache tika 来转换我的文档。我可以将我的文档解析为 xml。这是我的代码:

AutoDetectParser parser=new AutoDetectParser();
InputStream input=new FileInputStream(new File("1.docx"));
Metadata metadata = new Metadata();
StringWriter sw = new StringWriter();
SAXTransformerFactory factory = (SAXTransformerFactory)SAXTransformerFactory.newInstance();
TransformerHandler handler = factory.newTransformerHandler();
handler.getTransformer().setOutputProperty(OutputKeys.METHOD, "xml");
handler.getTransformer().setOutputProperty(OutputKeys.INDENT, "no");
handler.setResult(new StreamResult(sw));

parser.parse(input, handler, metadata, new ParseContext());
String xhtml = sw.toString();

我想从文档中提取图像并将它们转换为二进制格式。我不知道如何从文档中提取嵌入资源。

【问题讨论】:

    标签: java apache-tika


    【解决方案1】:

    您需要定义自己的实现Parser 的类,并将其附加到您在解析外部文档时提供的ParseContext。然后将为所有嵌入式资源调用您的 Parser,如果您愿意,您可以将它们保存出来

    我能想到的最好的例子是在 Tika CLI 中,-z(提取)标志使用。如果您查看source code for TikaCLI,您正在寻找FileEmbeddedDocumentExtractor 作为您的示例。

    最简单的代码如下:

    final AutoDetectParser parser = new AutoDetectParser();
    
    public class ExtractParser extends AbstractParser {
       private int att = 0;
       public Set<MediaType> getSupportedTypes(ParseContext context) {
         // Everything AutoDetect parser does
         return parser.getSupportedTypes(context);
       }
       public void parse(
            InputStream stream, ContentHandler handler,
            Metadata metadata, ParseContext context)
            throws IOException, SAXException, TikaException {
          // Stream to a new file
          File f = new File("out-" + (++att) + ".bin");
          FileOutputStream fout = new FileOutputStream(f);
          IOUtils.copy(strea, fout);
          fout.closee();
       }
    }
    
    InputStream input = new FileInputStream(new File("1.docx"));
    Metadata metadata = new Metadata();
    ParseContext context = new ParseContext();
    context.set(Parser.class, extractParser);
    parser.parse(input, handler, metadata, context);
    

    如果你愿意,也可以使用EmbeddedDocumentExtractor接口,取决于你想做什么,如果直接使用Parser更好

    【讨论】:

    • 和另一个问题。在解析方法中是否可以找出以支持的类型声明的输出嵌入文件的格式并放入正确的类型而不是.bin?
    • 您可以从 MimeTypesRegistry 中查找建议的扩展
    • 非常感谢。你是最棒的 ;)
    • 我想知道为什么 Tika 在解析器中不支持此功能,仅在 CLI 中支持
    • @OhadR Tika 确实从 CLI 支持它!只需使用与上述类似的代码,根据您自己的要求定制!
    猜你喜欢
    • 2023-03-03
    • 1970-01-01
    • 2017-11-18
    • 2011-09-21
    • 2017-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-03
    相关资源
    最近更新 更多