Spaces:
Sleeping
Sleeping
# -*- 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 [{"عنوان": "حدث خطأ أثناء الاستخراج", "بيانات": []}] |