Как убедиться что 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 шт):
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()
Таким образом можно по каждой секции проверять текст, что решило бы мою задачу. Думаю в данной библиотеке можно найти и другой полезный функционал...
- Смотреть на
docx
как наzip
архив. Извлечь из негоxml
с контентом и парсить.
Такой мудрый вариант пока что не готов проверять, но выглядит тоже реалистично.
Разрыв страницы задаётся элементом <w:br w:type="page" />
в файле word\document.xml
если рассмиатривать docx-файл как zip-архив.
Я не знаю, можно ли найти этот элемент приведёнными в вопросе библиотеками, но если нельзя, то я бы просто распаковал в памяти файл как zip-архив, добыл из него нужный файл и любым способом проверил наличие элемента (по css-селектору, xpath-селектору, или регуляркой).
Можно реализовать перебор тела документа через 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();
}