Aspose.Words for Java 中提取内容的辅助方法

Aspose.Words for Java 中提取内容的辅助方法简介

Aspose.Words for Java 是一个功能强大的库,允许开发人员以编程方式处理 Word 文档。处理 Word 文档时,一项常见任务是从中提取内容。在本文中,我们将探索一些使用 Aspose.Words for Java 高效提取内容的辅助方法。

先决条件

在深入研究代码示例之前,请确保您已在 Java 项目中安装并设置了 Aspose.Words for 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) {
            //我们需要单独处理每个标记,因此将其传递给单独的方法。
            //应首先处理结束以保留节点索引。
            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 提供了强大的辅助方法来简化此过程。无论您需要按样式提取段落、节点之间的内容还是生成新文档,这些方法都可以帮助您在 Java 应用程序中高效处理 Word 文档。

常见问题解答

如何安装 Aspose.Words for Java?

要安装 Aspose.Words for Java,您可以从 Aspose 网站下载。请访问这里获取最新版本。

我可以从 Word 文档的特定部分提取内容吗?

是的,您可以使用本文中提到的方法从 Word 文档的特定部分提取内容。只需指定定义要提取的部分的起始节点和结束节点即可。

Aspose.Words for Java 与 Java 11 兼容吗?

是的,Aspose.Words for Java 与 Java 11 及更高版本兼容。您可以在 Java 应用程序中使用它而不会出现任何问题。

我可以自定义提取内容的格式吗?

是的,您可以通过修改生成的文档中导入的节点来自定义提取内容的格式。Aspose.Words for Java 提供了广泛的格式化选项来满足您的需求。

在哪里可以找到有关 Aspose.Words for Java 的更多文档和示例?

您可以在 Aspose 网站上找到 Aspose.Words for Java 的全面文档和示例。请访问https://reference.aspose.com/words/java/以获取详细的文档和资源。