我有包含文本和图像的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();
我想从文档中提取图像,并将它们转换为二进制格式。我不知道如何从文档中提取嵌入的资源。
您需要定义自己的类来实现Parser
,并在解析外部文档时将其附加到您提供的ParseContext
。然后,您的Parser将被调用以获取所有嵌入的资源,如果您想,可以将它们保存出来
我能想到的最好的例子是在Tika CLI中,如-z
(提取)标志所使用的。如果您查看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更好的话