Aspose.Words for Java でコンテンツを抽出するためのヘルパー メソッド

Aspose.Words for Java でコンテンツを抽出するためのヘルパー メソッドの概要

Aspose.Words for Java は、開発者が Word ドキュメントをプログラムで操作できるようにする強力なライブラリです。 Word 文書を操作するときの一般的なタスクの 1 つは、文書からコンテンツを抽出することです。この記事では、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 ノードの後に見つかった Comment ノードに転送します。
    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: マーカーが同じノードの場合、ノードを 2 回追加しないでください。
                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);

        //次のノードに移動して抽出します。次のノードが null の場合、
        //残りのコンテンツは別のセクションにあります。
        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;
}

このメソッドを使用すると、段落、表、またはその他のブロック レベル要素であるかどうかに関係なく、指定した 2 つのノード間のコンテンツを抽出できます。インライン マーカー、フィールド、ブックマークなどのさまざまなシナリオを処理します。

ヘルパー方法 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 Web サイトからダウンロードできます。訪問ここ最新バージョンを入手するには。

Word 文書の特定のセクションからコンテンツを抽出できますか?

はい、この記事で説明されている方法を使用して、Word 文書の特定のセクションからコンテンツを抽出できます。抽出するセクションを定義する開始ノードと終了ノードを指定するだけです。

Aspose.Words for Java は Java 11 と互換性がありますか?

はい、Aspose.Words for Java は Java 11 以降のバージョンと互換性があります。 Java アプリケーションで問題なく使用できます。

抽出したコンテンツの形式をカスタマイズできますか?

はい、生成されたドキュメント内のインポートされたノードを変更することで、抽出されたコンテンツの書式設定をカスタマイズできます。 Aspose.Words for Java は、ニーズを満たす広範な書式設定オプションを提供します。

Aspose.Words for Java のドキュメントと例はどこで入手できますか?

Aspose Web サイトでは、Aspose.Words for Java の包括的なドキュメントと例を見つけることができます。訪問https://reference.aspose.com/words/java/詳細なドキュメントとリソースについては、こちらをご覧ください。