طرق مساعدة لاستخراج المحتوى في 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 for Java؟

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