File size: 6,748 Bytes
25d2b3e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
# -*- coding: utf-8 -*-
"""
خدمة استخراج البنود من المستندات

هذا الملف يحتوي على الفئة المسؤولة عن استخراج البنود والجداول من المستندات.
"""

import os
import logging

class ItemExtractor:
    """فئة استخراج البنود من المستندات"""
    
    def __init__(self, config=None):
        """
        تهيئة مستخرج البنود
        
        المعلمات:
            config (dict): إعدادات مستخرج البنود
        """
        self.config = config or {}
        self.logger = logging.getLogger(__name__)
    
    def extract(self, file_path):
        """
        استخراج البنود من ملف
        
        المعلمات:
            file_path (str): مسار الملف
            
        العوائد:
            list: قائمة البنود المستخرجة
        """
        self.logger.info(f"جاري استخراج البنود من الملف: {file_path}")
        
        try:
            # في البيئة الحقيقية، استخدم تحليل متقدم للمستند
            # محاكاة الاستخراج للعرض
            file_name = os.path.basename(file_path)
            
            # تحديد نوع الملف
            _, ext = os.path.splitext(file_path)
            ext = ext.lower()
            
            if ext == '.pdf':
                return self._extract_items_from_pdf(file_path)
            elif ext in ('.doc', '.docx'):
                return self._extract_items_from_docx(file_path)
            else:
                return [{"بند": "نوع الملف غير مدعوم", "قيمة": 0}]
        except Exception as e:
            self.logger.error(f"خطأ في استخراج البنود: {str(e)}")
            return [{"بند": "حدث خطأ أثناء الاستخراج", "قيمة": 0, "خطأ": str(e)}]
    
    def _extract_items_from_pdf(self, file_path):
        """
        استخراج البنود من ملف PDF
        
        المعلمات:
            file_path (str): مسار ملف PDF
            
        العوائد:
            list: قائمة البنود المستخرجة
        """
        # في البيئة الحقيقية، استخدم تحليل متقدم للمستند
        # محاكاة الاستخراج للعرض
        return [
            {"بند": "أعمال الخرسانة", "وحدة": "م3", "كمية": 250, "سعر الوحدة": 1200, "الإجمالي": 300000},
            {"بند": "أعمال التشطيبات", "وحدة": "م2", "كمية": 1500, "سعر الوحدة": 350, "الإجمالي": 525000},
            {"بند": "أعمال الكهرباء", "وحدة": "نقطة", "كمية": 120, "سعر الوحدة": 200, "الإجمالي": 24000},
            {"بند": "أعمال السباكة", "وحدة": "نقطة", "كمية": 75, "سعر الوحدة": 300, "الإجمالي": 22500},
            {"بند": "أعمال الألمنيوم", "وحدة": "م2", "كمية": 85, "سعر الوحدة": 1500, "الإجمالي": 127500}
        ]
    
    def _extract_items_from_docx(self, file_path):
        """
        استخراج البنود من ملف Word
        
        المعلمات:
            file_path (str): مسار ملف Word
            
        العوائد:
            list: قائمة البنود المستخرجة
        """
        # في البيئة الحقيقية، استخدم تحليل متقدم للمستند
        # محاكاة الاستخراج للعرض
        return [
            {"بند": "استشارات هندسية", "وحدة": "ساعة", "كمية": 120, "سعر الوحدة": 500, "الإجمالي": 60000},
            {"بند": "تصميم معماري", "وحدة": "م2", "كمية": 1800, "سعر الوحدة": 100, "الإجمالي": 180000},
            {"بند": "تصميم إنشائي", "وحدة": "م2", "كمية": 1800, "سعر الوحدة": 80, "الإجمالي": 144000},
            {"بند": "تصميم كهربائي", "وحدة": "م2", "كمية": 1800, "سعر الوحدة": 40, "الإجمالي": 72000},
            {"بند": "تصميم ميكانيكي", "وحدة": "م2", "كمية": 1800, "سعر الوحدة": 40, "الإجمالي": 72000}
        ]
    
    def extract_tables(self, document):
        """
        استخراج الجداول من مستند
        
        المعلمات:
            document (dict): المستند المحلل
            
        العوائد:
            list: قائمة الجداول المستخرجة
        """
        self.logger.info("جاري استخراج الجداول من المستند")
        
        try:
            # في البيئة الحقيقية، استخدم تحليل متقدم للمستند
            # محاكاة الاستخراج للعرض
            return [
                {
                    "عنوان": "جدول البنود والتكاليف",
                    "بيانات": [
                        {"بند": "أعمال الخرسانة", "وحدة": "م3", "كمية": 250, "سعر الوحدة": 1200, "الإجمالي": 300000},
                        {"بند": "أعمال التشطيبات", "وحدة": "م2", "كمية": 1500, "سعر الوحدة": 350, "الإجمالي": 525000},
                        {"بند": "أعمال الكهرباء", "وحدة": "نقطة", "كمية": 120, "سعر الوحدة": 200, "الإجمالي": 24000},
                        {"بند": "أعمال السباكة", "وحدة": "نقطة", "كمية": 75, "سعر الوحدة": 300, "الإجمالي": 22500},
                        {"بند": "أعمال الألمنيوم", "وحدة": "م2", "كمية": 85, "سعر الوحدة": 1500, "الإجمالي": 127500}
                    ]
                },
                {
                    "عنوان": "جدول المعلومات العامة",
                    "بيانات": [
                        {"اسم المشروع": "مبنى سكني", "المالك": "شركة الإسكان", "الموقع": "الرياض", "المساحة": "2500 م2"},
                        {"اسم المشروع": "مبنى تجاري", "المالك": "شركة التطوير", "الموقع": "جدة", "المساحة": "3500 م2"}
                    ]
                }
            ]
        except Exception as e:
            self.logger.error(f"خطأ في استخراج الجداول: {str(e)}")
            return [{"عنوان": "حدث خطأ أثناء الاستخراج", "بيانات": []}]