File size: 6,748 Bytes
25d2b3e |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 |
# -*- 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 [{"عنوان": "حدث خطأ أثناء الاستخراج", "بيانات": []}] |