OpenDocument (.odt) - это практически zip-пакет, содержащий несколько файлов xml.Content.xml содержит фактическое текстовое содержание документа.Нас интересуют заголовки, и их можно найти внутри текста: h-теги.Подробнее о ODT .
Я нашел реализацию для извлечения заголовков из файлов .odt с помощью QueryPath .
Поскольку первоначальный вопрос был о Java, вот.Сначала нам нужно получить доступ к content.xml с помощью ZipFile.Затем мы используем SAX для анализа содержимого XML из файла content.xml.Пример кода просто распечатывает все заголовки:
<code>Test3.odt
content.xml
3764
1 My New Great Paper
2 Abstract
2 Introduction
2 Content
3 More content
3 Even more
2 Conclusions
</p>
<p>Sample code:</p>
<pre> public void printHeadingsOfOdtFIle(File odtFile) {
try {
ZipFile zFile = new ZipFile(odtFile);
System.out.println(zFile.getName());
ZipEntry contentFile = zFile.getEntry("content.xml");
System.out.println(contentFile.getName());
System.out.println(contentFile.getSize());
XMLReader xr = XMLReaderFactory.createXMLReader();
OdtDocumentContentHandler handler = new OdtDocumentContentHandler();
xr.setContentHandler(handler);
xr.parse(new InputSource(zFile.getInputStream(contentFile)));
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new OdtDocumentStructureExtractor().printHeadingsOfOdtFIle(new File("Test3.odt"));
}
Соответствующие части используемого ContentHandler выглядят так:
@Override
public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
temp = "";
if("text:h".equals(qName)) {
String headingLevel = atts.getValue("text:outline-level");
if(headingLevel != null) {
System.out.print(headingLevel + " ");
}
}
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
char[] subArray = new char[length];
System.arraycopy(ch, start, subArray, 0, length);
temp = new String(subArray);
fullText.append(temp);
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if("text:h".equals(qName)) {
System.out.println(temp);
}
}
</code>