0

MailContentHandler 的源代码是这样的:

try {
            BodyContentHandler bch = new BodyContentHandler(handler);
            parser.parse(is, new EmbeddedContentHandler(bch), submd, context);

此时我想将正文内容作为字符串读取,并根据需要添加一些元数据(如果找到/匹配/生成)...我似乎无法在 BodyContentHandler 对象上调用 toString。

如果有人熟悉 tika,并创建或更改现有解析,请指出正确的方向。

4

1 回答 1

1

BodyContentHandler是一个装饰 ContentHandler,详见javadocs。它所做的只是过滤掉 SAX 事件,以便下游处理程序只获取正文内容。但是,如果您在没有任何参数的情况下创建它,它将在内部WriteOutContentHandler为您创建一个 100k 限制。

要获取主体本身,您需要询问您传递给的任何处理程序BodyContentHandler来获取它。如果您只想要纯文本,并且不会达到默认字符限制,请选择以下内容:

BodyContentHandler bch = new BodyContentHandler();
parser.parse(is, bch, metadata, new ParseContext());
String plainText = bch.toString();

如果你想获得 body 的 XHTML,你会想要更多类似的东西:

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));

BodyContentHandler bch = new BodyContentHandler(handler);

parser.parse(is, bch, metadata, new ParseContext());

String xhtml = sw.toString();
于 2013-04-11T15:24:58.010 回答