EGYADMIN's picture
Upload 114 files
25d2b3e verified
raw
history blame
6.75 kB
# -*- 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 [{"عنوان": "حدث خطأ أثناء الاستخراج", "بيانات": []}]