# -*- coding: utf-8 -*- """ خدمة تحليل المستندات هذا الملف يحتوي على الفئة المسؤولة عن تحليل المستندات واستخراج المعلومات الهيكلية منها. """ import os import logging import datetime class DocumentParser: """فئة تحليل المستندات واستخراج المعلومات منها""" def __init__(self, config=None): """ تهيئة محلل المستندات المعلمات: config (dict): إعدادات محلل المستندات """ self.config = config or {} self.logger = logging.getLogger(__name__) def parse(self, file_path): """ تحليل المستند واستخراج المعلومات منه المعلمات: file_path (str): مسار الملف العوائد: dict: معلومات المستند المستخرجة """ self.logger.info(f"جاري تحليل المستند: {file_path}") try: # في البيئة الحقيقية، استخدم تحليل متقدم للمستند # محاكاة التحليل للعرض file_name = os.path.basename(file_path) file_size = os.path.getsize(file_path) if os.path.exists(file_path) else 0 # تحديد نوع الملف _, ext = os.path.splitext(file_path) ext = ext.lower() # تحديد نوع المستند document_type = self._get_document_type(ext) # محاكاة معلومات المستند current_date = datetime.datetime.now().strftime("%Y-%m-%d") result = { "اسم الملف": file_name, "حجم الملف": f"{file_size / 1024:.2f} كيلوبايت", "نوع الملف": document_type, "تاريخ التحليل": current_date, "تقدير عدد الصفحات": self._estimate_pages(file_size), "نتائج التحليل": { "نوع المستند": self._classify_document(file_name), "درجة الثقة": "85%", "الأقسام الرئيسية": self._get_main_sections(), "الكلمات الرئيسية": self._get_main_keywords(), "الشروط الهامة": self._get_important_terms() } } return result except Exception as e: self.logger.error(f"خطأ في تحليل المستند: {str(e)}") return {"خطأ": f"حدث خطأ أثناء تحليل المستند: {str(e)}"} def parse_document(self, file_path): """ تحليل المستند واستخراج المعلومات الأساسية منه المعلمات: file_path (str): مسار الملف العوائد: dict: معلومات المستند الأساسية """ self.logger.info(f"جاري تحليل المستند الأساسي: {file_path}") # في البيئة الحقيقية، استخدم تحليل متقدم للمستند # محاكاة التحليل للعرض file_name = os.path.basename(file_path) return { "نوع": self._classify_document(file_name), "محتوى": "محتوى المستند...", "هيكل": { "عنوان": "عنوان المستند", "أقسام": ["قسم 1", "قسم 2", "قسم 3"] } } def _get_document_type(self, ext): """ تحديد نوع المستند من امتداد الملف المعلمات: ext (str): امتداد الملف العوائد: str: نوع المستند """ document_types = { '.pdf': 'مستند PDF', '.doc': 'مستند Word', '.docx': 'مستند Word', '.jpg': 'صورة JPEG', '.jpeg': 'صورة JPEG', '.png': 'صورة PNG', '.xlsx': 'جدول Excel', '.xls': 'جدول Excel', '.txt': 'ملف نصي' } return document_types.get(ext, 'نوع ملف غير معروف') def _estimate_pages(self, file_size): """ تقدير عدد صفحات المستند بناءً على حجمه المعلمات: file_size (int): حجم الملف بالبايت العوائد: int: تقدير عدد الصفحات """ # تقدير بسيط: كل 50 كيلوبايت تقريباً صفحة واحدة # هذا تقدير بسيط جداً ويختلف حسب نوع المستند ومحتواه return max(1, int(file_size / (50 * 1024))) def _classify_document(self, file_name): """ تصنيف نوع المستند بناءً على اسمه المعلمات: file_name (str): اسم الملف العوائد: str: تصنيف المستند """ file_name_lower = file_name.lower() if 'عقد' in file_name_lower or 'contract' in file_name_lower: return "عقد" elif 'مناقصة' in file_name_lower or 'tender' in file_name_lower: return "مستند مناقصة" elif 'تقرير' in file_name_lower or 'report' in file_name_lower: return "تقرير" elif 'فاتورة' in file_name_lower or 'invoice' in file_name_lower: return "فاتورة" elif 'عرض' in file_name_lower or 'proposal' in file_name_lower: return "عرض سعر" elif 'مواصفات' in file_name_lower or 'spec' in file_name_lower: return "مواصفات فنية" elif 'كراسة' in file_name_lower or 'شروط' in file_name_lower: return "كراسة شروط" else: return "مستند عام" def _get_main_sections(self): """ الحصول على قائمة الأقسام الرئيسية التقديرية للمستند العوائد: list: قائمة الأقسام الرئيسية """ # محاكاة قائمة الأقسام return [ "مقدمة", "نطاق العمل", "المواصفات الفنية", "جدول الكميات", "الشروط والأحكام", "الجدول الزمني", "المتطلبات الخاصة" ] def _get_main_keywords(self): """ الحصول على قائمة الكلمات الرئيسية التقديرية للمستند العوائد: list: قائمة الكلمات الرئيسية """ # محاكاة قائمة الكلمات الرئيسية return [ "مناقصة", "بناء", "تشييد", "تسليم مفتاح", "مواصفات فنية", "جدول كميات", "ضمان", "غرامة تأخير", "دفعة مقدمة", "محتوى محلي" ] def _get_important_terms(self): """ الحصول على قائمة الشروط الهامة التقديرية للمستند العوائد: list: قائمة الشروط الهامة """ # محاكاة قائمة الشروط الهامة return [ "مدة تنفيذ المشروع: 18 شهر", "غرامة التأخير: 0.5% أسبوعياً بحد أقصى 10%", "الدفعة المقدمة: 10%", "الضمان النهائي: 5% لمدة سنة", "شروط الدفع: دفعات شهرية حسب نسبة الإنجاز", "المحتوى المحلي: 70% كحد أدنى" ]