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