Вспомогательные методы для извлечения контента в Aspose.Words для Java

Введение во вспомогательные методы для извлечения контента в Aspose.Words для Java

Aspose.Words for Java — это мощная библиотека, которая позволяет разработчикам программно работать с документами Word. Одной из распространенных задач при работе с документами Word является извлечение из них содержимого. В этой статье мы рассмотрим некоторые вспомогательные методы для эффективного извлечения контента с помощью Aspose.Words для 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 for Java предоставляет широкие возможности форматирования для удовлетворения ваших потребностей.

Где я могу найти дополнительную документацию и примеры для Aspose.Words для Java?

Вы можете найти подробную документацию и примеры для Aspose.Words для Java на веб-сайте Aspose. Посещатьhttps://reference.aspose.com/words/java/ подробную документацию и ресурсы.