Phương pháp trợ giúp để trích xuất nội dung trong Aspose.Words cho Java

Giới thiệu về các phương pháp trợ giúp để trích xuất nội dung trong Aspose.Words cho Java

Aspose.Words for Java là một thư viện mạnh mẽ cho phép các nhà phát triển làm việc với các tài liệu Word theo chương trình. Một nhiệm vụ phổ biến khi làm việc với các tài liệu Word là trích xuất nội dung từ chúng. Trong bài viết này, chúng ta sẽ khám phá một số phương pháp trợ giúp để trích xuất nội dung hiệu quả bằng Aspose.Words for Java.

Điều kiện tiên quyết

Trước khi chúng ta đi sâu vào các ví dụ mã, hãy đảm bảo bạn đã cài đặt và thiết lập Aspose.Words for Java trong dự án Java của mình. Bạn có thể tải xuống từđây.

Phương pháp trợ giúp 1: Trích xuất đoạn văn theo phong cách

public static ArrayList<Paragraph> paragraphsByStyleName(Document doc, String styleName) {
    // Tạo một mảng để thu thập các đoạn văn có kiểu được chỉ định.
    ArrayList<Paragraph> paragraphsWithStyle = new ArrayList<Paragraph>();
    NodeCollection paragraphs = doc.getChildNodes(NodeType.PARAGRAPH, true);

    // Xem qua tất cả các đoạn văn để tìm những đoạn văn có phong cách được chỉ định.
    for (Paragraph paragraph : (Iterable<Paragraph>) paragraphs) {
        if (paragraph.getParagraphFormat().getStyle().getName().equals(styleName))
            paragraphsWithStyle.add(paragraph);
    }
    return paragraphsWithStyle;
}

Bạn có thể sử dụng phương pháp này để trích xuất các đoạn văn có kiểu cụ thể trong tài liệu Word của mình. Điều này hữu ích khi bạn muốn trích xuất nội dung có định dạng cụ thể, chẳng hạn như tiêu đề hoặc trích dẫn khối.

Phương pháp trợ giúp 2: Trích xuất nội dung theo nút

public static ArrayList<Node> extractContentBetweenNodes(Node startNode, Node endNode, boolean isInclusive) {
    // Đầu tiên, hãy kiểm tra xem các nút được truyền vào phương pháp này có hợp lệ để sử dụng hay không.
    verifyParameterNodes(startNode, endNode);
    
    // Tạo danh sách để lưu trữ các nút đã trích xuất.
    ArrayList<Node> nodes = new ArrayList<Node>();

    // Nếu bất kỳ dấu hiệu nào là một phần của bình luận, bao gồm cả bình luận đó, chúng ta cần di chuyển con trỏ
    // chuyển tiếp đến Nút Bình luận được tìm thấy sau nút CommentRangeEnd.
    if (endNode.getNodeType() == NodeType.COMMENT_RANGE_END && isInclusive) {
        Node node = findNextNode(NodeType.COMMENT, endNode.getNextSibling());
        if (node != null)
            endNode = node;
    }
    
    // Lưu lại bản ghi các nút gốc được truyền cho phương pháp này để phân tách các nút đánh dấu nếu cần.
    Node originalStartNode = startNode;
    Node originalEndNode = endNode;

    //Trích xuất nội dung dựa trên các nút cấp khối (đoạn văn và bảng). Duyệt qua các nút cha để tìm chúng.
    // Chúng tôi sẽ tách nội dung của nút đầu tiên và nút cuối cùng, tùy thuộc vào việc các nút đánh dấu có nằm trong dòng hay không.
    startNode = getAncestorInBody(startNode);
    endNode = getAncestorInBody(endNode);
    boolean isExtracting = true;
    boolean isStartingNode = true;
    // Nút hiện tại mà chúng ta đang trích xuất từ tài liệu.
    Node currNode = startNode;

    // Bắt đầu trích xuất nội dung. Xử lý tất cả các nút cấp khối và tách riêng nút đầu tiên
    // và các nút cuối cùng khi cần thiết để định dạng đoạn văn được giữ nguyên.
    // Phương pháp này phức tạp hơn một chút so với phương pháp trích xuất thông thường vì chúng ta cần phải phân tích
    // trong việc trích xuất bằng cách sử dụng các nút nội tuyến, trường, dấu trang, v.v. để làm cho nó hữu ích.
    while (isExtracting) {
        // Sao chép nút hiện tại và các nút con của nó để có được một bản sao.
        Node cloneNode = currNode.deepClone(true);
        boolean isEndingNode = currNode.equals(endNode);
        if (isStartingNode || isEndingNode) {
            // Chúng ta cần xử lý từng điểm đánh dấu riêng biệt, vì vậy hãy chuyển nó sang một phương pháp riêng biệt.
            // Đầu tiên, phần End phải được xử lý để giữ lại chỉ mục của nút.
            if (isEndingNode) {
                // !isStartingNode: không thêm nút hai lần nếu các điểm đánh dấu là cùng một nút.
                processMarker(cloneNode, nodes, originalEndNode, currNode, isInclusive,
                        false, !isStartingNode, false);
                isExtracting = false;
            }
            //Điều kiện cần phải tách biệt vì điểm bắt đầu và kết thúc ở cấp độ khối có thể là cùng một nút.
            if (isStartingNode) {
                processMarker(cloneNode, nodes, originalStartNode, currNode, isInclusive,
                        true, true, false);
                isStartingNode = false;
            }
        } else
            // Node không phải là điểm bắt đầu hoặc kết thúc, chỉ cần thêm bản sao vào danh sách.
            nodes.add(cloneNode);

        // Di chuyển đến nút tiếp theo và trích xuất nó. Nếu nút tiếp theo là null,
        // phần nội dung còn lại có thể tìm thấy ở một mục khác.
        if (currNode.getNextSibling() == null && isExtracting) {
            // Chuyển sang phần tiếp theo.
            Section nextSection = (Section) currNode.getAncestor(NodeType.SECTION).getNextSibling();
            currNode = nextSection.getBody().getFirstChild();
        } else {
            // Di chuyển đến nút tiếp theo trong thân.
            currNode = currNode.getNextSibling();
        }
    }

    // Để tương thích với chế độ có dấu trang nội tuyến, hãy thêm đoạn văn tiếp theo (trống).
    if (isInclusive && originalEndNode == endNode && !originalEndNode.isComposite())
        includeNextParagraph(endNode, nodes);

    // Trả về các nút nằm giữa các điểm đánh dấu nút.
    return nodes;
}

Phương pháp này cho phép bạn trích xuất nội dung giữa hai nút được chỉ định, cho dù chúng là đoạn văn, bảng hay bất kỳ phần tử cấp khối nào khác. Nó xử lý nhiều tình huống khác nhau, bao gồm các dấu trang nội tuyến, trường và dấu trang.

Phương pháp trợ giúp 3: Tạo một tài liệu mới

public static Document generateDocument(Document srcDoc, ArrayList<Node> nodes) throws Exception {
    Document dstDoc = new Document();
    
    // Xóa đoạn văn đầu tiên khỏi tài liệu trống.
    dstDoc.getFirstSection().getBody().removeAllChildren();
    
    // Nhập từng nút từ danh sách vào tài liệu mới. Giữ nguyên định dạng gốc của nút.
    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;
}

Phương pháp này cho phép bạn tạo một tài liệu mới bằng cách nhập danh sách các nút từ tài liệu nguồn. Nó giữ nguyên định dạng gốc của các nút, giúp tạo tài liệu mới có nội dung cụ thể.

Phần kết luận

Trích xuất nội dung từ tài liệu Word có thể là một phần quan trọng của nhiều tác vụ xử lý tài liệu. Aspose.Words for Java cung cấp các phương thức trợ giúp mạnh mẽ giúp đơn giản hóa quy trình này. Cho dù bạn cần trích xuất đoạn văn theo kiểu, nội dung giữa các nút hay tạo tài liệu mới, các phương thức này sẽ giúp bạn làm việc hiệu quả với tài liệu Word trong các ứng dụng Java của mình.

Câu hỏi thường gặp

Làm thế nào để tôi có thể cài đặt Aspose.Words cho Java?

Để cài đặt Aspose.Words cho Java, bạn có thể tải xuống từ trang web Aspose. Truy cậpđây để có phiên bản mới nhất.

Tôi có thể trích xuất nội dung từ các phần cụ thể của tài liệu Word không?

Có, bạn có thể trích xuất nội dung từ các phần cụ thể của tài liệu Word bằng các phương pháp được đề cập trong bài viết này. Chỉ cần chỉ định các nút bắt đầu và kết thúc xác định phần bạn muốn trích xuất.

Aspose.Words for Java có tương thích với Java 11 không?

Có, Aspose.Words for Java tương thích với Java 11 và các phiên bản cao hơn. Bạn có thể sử dụng nó trong các ứng dụng Java của mình mà không gặp bất kỳ sự cố nào.

Tôi có thể tùy chỉnh định dạng của nội dung được trích xuất không?

Có, bạn có thể tùy chỉnh định dạng của nội dung được trích xuất bằng cách sửa đổi các nút đã nhập trong tài liệu được tạo. Aspose.Words for Java cung cấp các tùy chọn định dạng mở rộng để đáp ứng nhu cầu của bạn.

Tôi có thể tìm thêm tài liệu và ví dụ về Aspose.Words cho Java ở đâu?

Bạn có thể tìm thấy tài liệu và ví dụ toàn diện về Aspose.Words for Java trên trang web Aspose. Truy cậphttps://reference.aspose.com/words/java/ để biết thêm tài liệu và nguồn thông tin chi tiết.