Использование Apache POI (или docx4j ) для извлечения текста из документов Microsoft Word DOCX
(XWPF), что является лучшим методом для определения ограничений различных разделов ?
Проверка стилей абзацев (например, с помощью метода XWPFParagraph.getStyle()
в POI) во многих случаях возвращает null
, поэтому требуются дополнительные или альтернативные подходы.
Один из таких подходов заключается в проверка на изменение стиля шрифта или размера шрифта, например, в POI:
public static List<String> getStyles(XWPFRun run) {
List<String> styles = new ArrayList<>();
if (run.is bold()) {
styles.add("bold");
}
if (run.isItalic()) {
styles.add("italic");
}
if (run.getUnderline() != UnderlinePatterns.NONE) {
styles.add("underline");
}
if (run.isHighlighted()) {
styles.add("highlighted");
}
return styles;
}
public static int getfontSize(XWPFRun run) {
int size = run.getFontSize();
if (size == -1) {
return run.getDocument().getStyles().getDefaultStyle().getFontSize();
}
return size;
}
Другой подход, который можно использовать в сочетании с вышеизложенным, заключается в извлечении оглавления (TO C) посредством проверки для TOCx
стилей абзаца (или через объект SDT
в Apache POI), а затем попытайтесь сопоставить текст каждой записи TO C в однострочных абзацах. Однако Thατ осложняется наличием нескольких уровней абзацев в оглавлении и потенциальными «ложными срабатываниями» в остальной части текста.
Например, в следующем TO C a текстовый поиск для каждой из записей (например, «Раздел A», «Подраздел ii») может быть выполнен по абзацам и сопоставлять абзацы, где единственное содержание идентично (или почти идентично, согласно некоторым критерии) ДО C текст записи.
Section A . . . . . . . . . . 3
Subsection 1 . . . . . . 5
Subsection 2 . . . . . . 6
Sub-subsection i . . 7
Sub-subsection ii . . 8
Subsection 3 . . . . . . 9
Section B . . . . . . . . . . 10
Очевидно, что процесс будет heuristi c, и он требует более умных методов (например, НЛП и / или НЛУ) для получения более точных результатов, но в отсутствие таких методов, есть ли «рекомендуемый» способ (или, еще лучше, примеры кода) для решения проблемы?