MailContentHandler的源代码具有以下内容:

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


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

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

最佳答案

BodyContentHandler是修饰的ContentHandler,如javadocs中所述。它所做的只是过滤掉SAX事件,以便下游处理程序仅获取主体内容。但是,如果您创建without any arguments,它将在内部为您创建一个WriteOutContentHandler,上限为100k。

要获取主体本身,您需要询问传递给BodyContentHandler的任何处理程序以获取主体。如果您只需要纯文本,并且不会达到默认字符数限制,请执行以下操作:

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


如果要获取正文的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();

10-04 14:55