Как убедиться что word-документ содержит разрыв страницы/раздела

У меня есть .docx содержащий разрывы страницы и разрыв раздела. Мне надо программно убедиться, что они в нём есть. введите сюда описание изображения При помощи org.apache.poi.poi-ooxml не выходит найти способ. Нашел com.deepoove.poi-tl содержащий в себе XWPFSection. Тоже не вижу рабочего решения. Просматривал BodyElements и Paragraphs, но не увидел ничего схожего внутри.

XWPFDocument docx = new XWPFDocument(Files.newInputStream(Paths.get(path)));
XWPFWordExtractor xwpfWordExtractor = new XWPFWordExtractor(docx);
for (IBodyElement bodyElement : xwpfWordExtractor.getDocument().getBodyElements()) {
    System.out.println(bodyElement.getElementType());    
    if (bodyElement instanceof XWPFSection) {
        System.out.println("Section break found.");
    }
}

Данный код не работает. Пробовал и с XWPFWordExtractor и без.

Другие варианты dependency - предлагать, интересны любые варианты.


Ответы (3 шт):

Автор решения: sevnight
  1. Aspose.Words for Java

Нашел такой вариант решения, жаль мне не подходит потому что он платный.

<repositories>
    <repository>
        <id>AsposeJavaAPI</id>
        <name>Aspose Java API</name>
        <url>https://releases.aspose.com/java/repo/</url>
    </repository>
</repositories>

<dependency>
    <groupId>com.aspose</groupId>
    <artifactId>aspose-words</artifactId>
    <version>22.11</version>
    <classifier>jdk17</classifier>
</dependency>
<dependency>
    <groupId>com.aspose</groupId>
    <artifactId>aspose-words</artifactId>
    <version>22.11</version>
    <classifier>javadoc</classifier>
</dependency>

Document docx = new Document(path);
docx.getSections().get(0).getBody().getText()

Таким образом можно по каждой секции проверять текст, что решило бы мою задачу. Думаю в данной библиотеке можно найти и другой полезный функционал...

  1. Смотреть на docx как на zip архив. Извлечь из него xml с контентом и парсить.

Такой мудрый вариант пока что не готов проверять, но выглядит тоже реалистично.

→ Ссылка
Автор решения: Qwertiy

Разрыв страницы задаётся элементом <w:br w:type="page" /> в файле word\document.xml если рассмиатривать docx-файл как zip-архив.

скриншот

Я не знаю, можно ли найти этот элемент приведёнными в вопросе библиотеками, но если нельзя, то я бы просто распаковал в памяти файл как zip-архив, добыл из него нужный файл и любым способом проверил наличие элемента (по css-селектору, xpath-селектору, или регуляркой).

→ Ссылка
Автор решения: sevnight

Можно реализовать перебор тела документа через XmlCursor.

Классы для поиска разрывов:

  • CTSectPr класс представляющий из себя разрыв раздела <w:sectPr/>;
  • CTP класс представляющий из себя ряд элементов, один из которых может быть разрывом страницы <w:br w:type="page"/>.

XWPFDocument docx = new XWPFDocument(Files.newInputStream(Paths.get(path)));
CTBody body = docx.getDocument().getBody();
XmlCursor cursor = body.newCursor();
while (true) {
    XmlTokenSource token = cursor.getObject();
    if (token instanceof CTSectPr) {
        System.out.println("Разрыв секции обнаружен!");
    } else if (token instanceof CTP) {
        CTP paragraph = (CTP) token;
        if (paragraph.isSetRsidR() && paragraph.getRArray().length > 0) {
            paragraph.getRArray(0).getBrList().forEach(br -> {
                if (br.isSetType() && "page".equals(br.getType().toString())) {
                    System.out.println("Разрыв страницы обнаружен!");
                }
            });
        }
    }
    if (!cursor.hasNextToken()) break;
    cursor.toNextToken();
}
→ Ссылка