الطرق المساعدة لاستخراج المحتوى في Aspose.Words لـ Java

مقدمة إلى الأساليب المساعدة لاستخراج المحتوى في Aspose.Words لـ Java

Aspose.Words for Java هي مكتبة قوية تتيح للمطورين العمل مع مستندات Word برمجيًا. إحدى المهام الشائعة عند العمل مع مستندات Word هي استخراج المحتوى منها. في هذه المقالة، سنستكشف بعض الطرق المساعدة لاستخراج المحتوى بكفاءة باستخدام 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.
    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 أساليب مساعدة قوية تعمل على تبسيط هذه العملية. سواء كنت بحاجة إلى استخراج الفقرات حسب النمط، أو المحتوى بين العقد، أو إنشاء مستندات جديدة، فإن هذه الطرق ستساعدك على العمل بكفاءة مع مستندات Word في تطبيقات Java الخاصة بك.

الأسئلة الشائعة

كيف يمكنني تثبيت Aspose.Words لـ 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 لـ Java؟

يمكنك العثور على وثائق وأمثلة شاملة لـ Aspose.Words for Java على موقع Aspose الإلكتروني. يزورhttps://reference.aspose.com/words/Java/ للحصول على وثائق وموارد مفصلة.