|
|
|
""" |
|
خدمة استخراج البنود من المستندات |
|
|
|
هذا الملف يحتوي على الفئة المسؤولة عن استخراج البنود والجداول من المستندات. |
|
""" |
|
|
|
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 [{"عنوان": "حدث خطأ أثناء الاستخراج", "بيانات": []}] |