使用Tika解析RTF文件时有序列表编号丢失问题求助
解决Tika解析RTF有序列表丢失编号的问题
使用Tika解析包含有序列表的RTF文件时,列表项的编号会被替换为空白字符,原使用代码如下:
InputStream is = new FileInputStream("files/rtf_auto.rtf"); AutoDetectParser autoDetectParser = new AutoDetectParser(); BodyContentHandler contentHandler = new BodyContentHandler(); Metadata metadata = new Metadata(); autoDetectParser.parse(is, contentHandler, metadata, new ParseContext()); System.out.println(contentHandler);
以下是可行的解决建议:
- 使用RTF专用解析器:AutoDetectParser对RTF格式的列表支持不够完善,直接改用
RTFParser做针对性解析,示例代码:
InputStream is = new FileInputStream("files/rtf_auto.rtf"); RTFParser rtfParser = new RTFParser(); BodyContentHandler contentHandler = new BodyContentHandler(); Metadata metadata = new Metadata(); rtfParser.parse(is, contentHandler, metadata, new ParseContext()); System.out.println(contentHandler);
- 自定义ContentHandler处理列表事件:如果专用解析器仍未解决问题,可以自定义处理器捕获列表相关的SAX事件,手动生成有序列表编号。示例实现:
class CustomListHandler extends BodyContentHandler { private int orderedListCounter = 0; private boolean inOrderedList = false; @Override public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException { if ("orderedlist".equals(localName)) { inOrderedList = true; orderedListCounter = 1; } else if ("listitem".equals(localName) && inOrderedList) { write(orderedListCounter + ". "); orderedListCounter++; } super.startElement(uri, localName, qName, atts); } @Override public void endElement(String uri, String localName, String qName) throws SAXException { if ("orderedlist".equals(localName)) { inOrderedList = false; } super.endElement(uri, localName, qName); } }
使用时将BodyContentHandler替换为CustomListHandler即可。
- 升级Tika版本:旧版本Tika存在RTF列表解析的bug,建议升级至最新稳定版(如2.x系列),新版本通常会修复这类格式兼容问题。
内容的提问来源于stack exchange,提问作者bricked
相关产品推荐
相关产品推荐

