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

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

Aspose.Words for Java は、開発者が Word 文書をプログラムで操作できるようにする強力なライブラリです。Word 文書を操作する際の一般的なタスクの 1 つは、文書からコンテンツを抽出することです。この記事では、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: マーカーが同じノードである場合は、ノードを 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.Words for Javaの包括的なドキュメントとサンプルは、AsposeのWebサイトでご覧いただけます。https://reference.aspose.com/words/java/詳細なドキュメントとリソースについては、こちらをご覧ください。