Вспомогательные методы для извлечения контента в Aspose.Words для Java
Введение во вспомогательные методы извлечения контента в Aspose.Words для Java
Aspose.Words for Java — это мощная библиотека, которая позволяет разработчикам работать с документами Word программно. Одной из распространенных задач при работе с документами Word является извлечение из них контента. В этой статье мы рассмотрим некоторые вспомогательные методы для эффективного извлечения контента с помощью Aspose.Words for Java.
Предпосылки
Прежде чем мы погрузимся в примеры кода, убедитесь, что у вас установлен и настроен Aspose.Words for Java в вашем проекте Java. Вы можете загрузить его сздесь.
Вспомогательный метод 1: Извлечение абзацев по стилю
public static ArrayList<Paragraph> paragraphsByStyleName(Document doc, String styleName) {
// Создать массив для сбора абзацев указанного стиля.
ArrayList<Paragraph> paragraphsWithStyle = new ArrayList<Paragraph>();
NodeCollection paragraphs = doc.getChildNodes(NodeType.PARAGRAPH, true);
// Просмотрите все абзацы, чтобы найти те, которые соответствуют указанному стилю.
for (Paragraph paragraph : (Iterable<Paragraph>) paragraphs) {
if (paragraph.getParagraphFormat().getStyle().getName().equals(styleName))
paragraphsWithStyle.add(paragraph);
}
return paragraphsWithStyle;
}
Вы можете использовать этот метод для извлечения абзацев, имеющих определенный стиль в вашем документе Word. Это полезно, когда вы хотите извлечь контент с определенным форматированием, например заголовки или блочные цитаты.
Вспомогательный метод 2: Извлечение контента по узлам
public static ArrayList<Node> extractContentBetweenNodes(Node startNode, Node endNode, boolean isInclusive) {
// Сначала проверьте, что узлы, переданные этому методу, допустимы для использования.
verifyParameterNodes(startNode, endNode);
// Создайте список для хранения извлеченных узлов.
ArrayList<Node> nodes = new ArrayList<Node>();
// Если какой-либо маркер является частью комментария, включая сам комментарий, нам нужно переместить указатель
// перейти к узлу комментария, расположенному после узла CommentRangeEnd.
if (endNode.getNodeType() == NodeType.COMMENT_RANGE_END && isInclusive) {
Node node = findNextNode(NodeType.COMMENT, endNode.getNextSibling());
if (node != null)
endNode = node;
}
// Сохраняйте запись исходных узлов, переданных этому методу, чтобы при необходимости разделить узлы-маркеры.
Node originalStartNode = startNode;
Node originalEndNode = endNode;
//Извлечь содержимое на основе узлов блочного уровня (абзацы и таблицы). Пройтись по родительским узлам, чтобы найти их.
// Мы разделим содержимое первого и последнего узлов в зависимости от того, являются ли узлы-маркеры встроенными.
startNode = getAncestorInBody(startNode);
endNode = getAncestorInBody(endNode);
boolean isExtracting = true;
boolean isStartingNode = true;
// Текущий узел, который мы извлекаем из документа.
Node currNode = startNode;
// Начните извлечение контента. Обработайте все узлы уровня блока и специально разделите первый
// и последние узлы при необходимости, чтобы сохранить форматирование абзацев.
// Этот метод немного сложнее обычного экстрактора, так как нам нужно разложить на множители
// при извлечении с использованием встроенных узлов, полей, закладок и т. д., чтобы сделать его полезным.
while (isExtracting) {
// Клонируйте текущий узел и его дочерние узлы, чтобы получить копию.
Node cloneNode = currNode.deepClone(true);
boolean isEndingNode = currNode.equals(endNode);
if (isStartingNode || isEndingNode) {
// Нам нужно обрабатывать каждый маркер отдельно, поэтому передаем его в отдельный метод.
// Сначала необходимо обработать End, чтобы сохранить индексы узлов.
if (isEndingNode) {
// !isStartingNode: не добавлять узел дважды, если маркеры — это один и тот же узел.
processMarker(cloneNode, nodes, originalEndNode, currNode, isInclusive,
false, !isStartingNode, false);
isExtracting = false;
}
//Условие должно быть отдельным, поскольку начальный и конечный маркеры уровня блока могут быть одним и тем же узлом.
if (isStartingNode) {
processMarker(cloneNode, nodes, originalStartNode, currNode, isInclusive,
true, true, false);
isStartingNode = false;
}
} else
// Узел не является начальным или конечным маркером, просто добавьте копию в список.
nodes.add(cloneNode);
// Перейти к следующему узлу и извлечь его. Если следующий узел нулевой,
// остальная часть контента находится в другом разделе.
if (currNode.getNextSibling() == null && isExtracting) {
// Перейти к следующему разделу.
Section nextSection = (Section) currNode.getAncestor(NodeType.SECTION).getNextSibling();
currNode = nextSection.getBody().getFirstChild();
} else {
// Перейти к следующему узлу в теле.
currNode = currNode.getNextSibling();
}
}
// Для совместимости с режимом со встроенными закладками добавьте следующий абзац (пустой).
if (isInclusive && originalEndNode == endNode && !originalEndNode.isComposite())
includeNextParagraph(endNode, nodes);
// Верните узлы между маркерами узлов.
return nodes;
}
Этот метод позволяет извлекать содержимое между двумя указанными узлами, будь то абзацы, таблицы или любые другие элементы уровня блока. Он обрабатывает различные сценарии, включая встроенные маркеры, поля и закладки.
Вспомогательный метод 3: Создание нового документа
public static Document generateDocument(Document srcDoc, ArrayList<Node> nodes) throws Exception {
Document dstDoc = new Document();
// Удалите первый абзац из пустого документа.
dstDoc.getFirstSection().getBody().removeAllChildren();
// Импортируйте каждый узел из списка в новый документ. Сохраните исходное форматирование узла.
NodeImporter importer = new NodeImporter(srcDoc, dstDoc, ImportFormatMode.KEEP_SOURCE_FORMATTING);
for (Node node : nodes) {
Node importNode = importer.importNode(node, true);
dstDoc.getFirstSection().getBody().appendChild(importNode);
}
return dstDoc;
}
Этот метод позволяет вам создать новый документ, импортируя список узлов из исходного документа. Он сохраняет исходное форматирование узлов, что делает его полезным для создания новых документов с определенным содержанием.
Заключение
Извлечение контента из документов Word может быть важной частью многих задач обработки документов. Aspose.Words for Java предоставляет мощные вспомогательные методы, которые упрощают этот процесс. Если вам нужно извлечь абзацы по стилю, контент между узлами или создать новые документы, эти методы помогут вам эффективно работать с документами Word в ваших приложениях Java.
Часто задаваемые вопросы
Как установить Aspose.Words для Java?
Чтобы установить Aspose.Words для Java, вы можете загрузить его с веб-сайта Aspose. Посетитездесь чтобы получить последнюю версию.
Могу ли я извлечь содержимое из определенных разделов документа Word?
Да, вы можете извлечь содержимое из определенных разделов документа Word, используя методы, упомянутые в этой статье. Просто укажите начальный и конечный узлы, которые определяют раздел, который вы хотите извлечь.
Совместим ли Aspose.Words для Java с Java 11?
Да, Aspose.Words для Java совместим с Java 11 и более поздними версиями. Вы можете использовать его в своих приложениях Java без каких-либо проблем.
Могу ли я настроить форматирование извлеченного контента?
Да, вы можете настроить форматирование извлеченного контента, изменив импортированные узлы в сгенерированном документе. Aspose.Words для Java предоставляет обширные возможности форматирования для удовлетворения ваших потребностей.
Где я могу найти дополнительную документацию и примеры для Aspose.Words для Java?
Подробную документацию и примеры для Aspose.Words for Java можно найти на веб-сайте Aspose. Посетитьhttps://reference.aspose.com/words/java/ для получения подробной документации и ресурсов.