gemini_prompts_all_ocr
Browse filesThis file contains structured prompt templates for Gemini used to extract Arabic-language fields from various Saudi government document types. Each prompt is tailored for a specific class such as CR1–CR7 (Commercial Registration), B1–B4 (Municipal Licenses), and V1–V3 (Tax Certificates).
These prompts are designed to guide Gemini API responses for accurate field extraction, with consistent output formatting per document type. Ideal for use in automated OCR pipelines.
- gemini_requestB.py +81 -0
- gemini_requestCR1.py +128 -0
- gemini_requestCR2.py +134 -0
- gemini_requestCR3.py +140 -0
- gemini_requestCR6.py +108 -0
- gemini_requestCR7.py +103 -0
- gemini_requestV1.py +77 -0
- gemini_requestV2.py +82 -0
- gemini_requestV3.py +95 -0
- gemini_requestcr4.py +135 -0
- gemini_requestcr5.py +118 -0
gemini_requestB.py
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import base64
|
| 2 |
+
import json
|
| 3 |
+
import re
|
| 4 |
+
import requests
|
| 5 |
+
import os
|
| 6 |
+
|
| 7 |
+
# Your Gemini API key
|
| 8 |
+
API_KEY = "your_gemini_api_key_here"
|
| 9 |
+
|
| 10 |
+
# Path to the document image you want to extract data from
|
| 11 |
+
image_path = r"C:\Users\ASUS\Downloads\CR_OCR_Cls.v4-original_images.folder\train\CR4\CS000130_CR_jpg.rf.b2528e60546ec399c3088ac69c6a66e2.jpg"
|
| 12 |
+
# قراءة الصورة وتحويلها إلى base64
|
| 13 |
+
with open(image_path, "rb") as f:
|
| 14 |
+
image_b64 = base64.b64encode(f.read()).decode()
|
| 15 |
+
|
| 16 |
+
prompt = """
|
| 17 |
+
Please extract the following fields in Arabic and English from the government registration document image:
|
| 18 |
+
- License Number
|
| 19 |
+
- Owner's Name
|
| 20 |
+
- ISIC Classification
|
| 21 |
+
- Detailed Activity
|
| 22 |
+
- Municipality
|
| 23 |
+
- Sub-Municipality
|
| 24 |
+
- District
|
| 25 |
+
- Street
|
| 26 |
+
- Shop's Total Area
|
| 27 |
+
|
| 28 |
+
Return the result in a JSON format with these keys:
|
| 29 |
+
en_license_number, en_owner_name, en_isic_classification, en_detailed_activity, en_municipality, en_sub_municipality, en_district, en_street, en_shop_total_area,
|
| 30 |
+
ar_license_number, ar_owner_name, ar_isic_classification, ar_detailed_activity, ar_municipality, ar_sub_municipality, ar_district, ar_street, ar_shop_total_area
|
| 31 |
+
|
| 32 |
+
If a field is missing, return null.
|
| 33 |
+
"""
|
| 34 |
+
|
| 35 |
+
url = f"https://generativelanguage.googleapis.com/v1/models/gemini-1.5-flash:generateContent?key={API_KEY}"
|
| 36 |
+
|
| 37 |
+
headers = {
|
| 38 |
+
"Content-Type": "application/json"
|
| 39 |
+
}
|
| 40 |
+
|
| 41 |
+
data = {
|
| 42 |
+
"contents": [
|
| 43 |
+
{
|
| 44 |
+
"role": "user",
|
| 45 |
+
"parts": [
|
| 46 |
+
{"text": prompt},
|
| 47 |
+
{
|
| 48 |
+
"inline_data": {
|
| 49 |
+
"mime_type": "image/jpeg",
|
| 50 |
+
"data": image_b64
|
| 51 |
+
}
|
| 52 |
+
}
|
| 53 |
+
]
|
| 54 |
+
}
|
| 55 |
+
]
|
| 56 |
+
}
|
| 57 |
+
|
| 58 |
+
response = requests.post(url, headers=headers, json=data)
|
| 59 |
+
response_text = response.json()['candidates'][0]['content']['parts'][0]['text']
|
| 60 |
+
|
| 61 |
+
# تنظيف النص من ```json
|
| 62 |
+
match = re.search(r"```json\s*(\{.*\})\s*```", response_text, re.DOTALL)
|
| 63 |
+
if match:
|
| 64 |
+
json_text = match.group(1)
|
| 65 |
+
result = json.loads(json_text)
|
| 66 |
+
|
| 67 |
+
# استخراج اسم الصورة بدون الامتداد
|
| 68 |
+
image_name = os.path.splitext(os.path.basename(image_path))[0]
|
| 69 |
+
# استخراج مسار المجلد
|
| 70 |
+
image_dir = os.path.dirname(image_path)
|
| 71 |
+
# تحديد مسار ملف الجيسون
|
| 72 |
+
output_path = os.path.join(image_dir, f"{image_name}.json")
|
| 73 |
+
|
| 74 |
+
# حفظ الناتج
|
| 75 |
+
with open(output_path, "w", encoding="utf-8") as f:
|
| 76 |
+
json.dump(result, f, ensure_ascii=False, indent=2)
|
| 77 |
+
|
| 78 |
+
print(f"✅ تم حفظ النتيجة في: {output_path}")
|
| 79 |
+
else:
|
| 80 |
+
print("❌ لم أتمكن من استخراج JSON من الرد:")
|
| 81 |
+
print(response_text)
|
gemini_requestCR1.py
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import base64
|
| 2 |
+
import json
|
| 3 |
+
import re
|
| 4 |
+
import requests
|
| 5 |
+
import os
|
| 6 |
+
|
| 7 |
+
# Your Gemini API key
|
| 8 |
+
API_KEY = "your_gemini_api_key_here"
|
| 9 |
+
|
| 10 |
+
# Path to the document image you want to extract data from
|
| 11 |
+
image_path = r"C:\Users\ASUS\Downloads\CR_OCR_Cls.v4-original_images.folder\train\CR4\CS000130_CR_jpg.rf.b2528e60546ec399c3088ac69c6a66e2.jpg"
|
| 12 |
+
|
| 13 |
+
|
| 14 |
+
# قراءة الصورة وتحويلها إلى base64
|
| 15 |
+
with open(image_path, "rb") as f:
|
| 16 |
+
image_b64 = base64.b64encode(f.read()).decode()
|
| 17 |
+
|
| 18 |
+
prompt = """
|
| 19 |
+
يرجى استخراج الحقول التالية من صورة مستند السجل التجاري (CR1)، جميعها بالعربية فقط:
|
| 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 |
+
أرجو إعادة النتيجة بصيغة JSON بهذه المفاتيح فقط، وإذا أي حقل غير موجود فضع قيمته null:
|
| 51 |
+
|
| 52 |
+
{
|
| 53 |
+
"رقم الموحد": null,
|
| 54 |
+
"رقم المنشأة": null,
|
| 55 |
+
"الاسم التجاري للمؤسسة": null,
|
| 56 |
+
"مركزها الرئيسي": null,
|
| 57 |
+
"هاتف": null,
|
| 58 |
+
"الرمز البريدي": null,
|
| 59 |
+
"اسم التاجر": null,
|
| 60 |
+
"الجنسية": null,
|
| 61 |
+
"تاريخ الميلاد": null,
|
| 62 |
+
"رقم السجل المدني-الإقامة": null,
|
| 63 |
+
"تاريخه": null,
|
| 64 |
+
"مصدره": null,
|
| 65 |
+
"رقم الحفيظة-الجواز": null,
|
| 66 |
+
"تاريخه_2": null,
|
| 67 |
+
"مصدرة": null,
|
| 68 |
+
"النشاط": null,
|
| 69 |
+
"رأس المال": null,
|
| 70 |
+
"اسم المدير أو الوكيل المفوض": null,
|
| 71 |
+
"الجنسية_2": null,
|
| 72 |
+
"تاريخ الميلاد_2": null,
|
| 73 |
+
"رقم السجل المدني-الإقامة_2": null,
|
| 74 |
+
"تاريخه_3": null,
|
| 75 |
+
"مصدره_2": null,
|
| 76 |
+
"يشهد مكتب السجل التجاري بمدينة": null,
|
| 77 |
+
"بأنه تم تسجيل المؤسسة المذكورة أعلاه بمدينة": null,
|
| 78 |
+
"تنتهي صلاحية الشهادات في": null,
|
| 79 |
+
"بموجب الإيصال رقم": null,
|
| 80 |
+
"تاريخ_الإيصال": null
|
| 81 |
+
}
|
| 82 |
+
"""
|
| 83 |
+
|
| 84 |
+
url = f"https://generativelanguage.googleapis.com/v1/models/gemini-1.5-flash:generateContent?key={API_KEY}"
|
| 85 |
+
|
| 86 |
+
headers = {
|
| 87 |
+
"Content-Type": "application/json"
|
| 88 |
+
}
|
| 89 |
+
|
| 90 |
+
data = {
|
| 91 |
+
"contents": [
|
| 92 |
+
{
|
| 93 |
+
"role": "user",
|
| 94 |
+
"parts": [
|
| 95 |
+
{"text": prompt},
|
| 96 |
+
{
|
| 97 |
+
"inline_data": {
|
| 98 |
+
"mime_type": "image/jpeg",
|
| 99 |
+
"data": image_b64
|
| 100 |
+
}
|
| 101 |
+
}
|
| 102 |
+
]
|
| 103 |
+
}
|
| 104 |
+
]
|
| 105 |
+
}
|
| 106 |
+
|
| 107 |
+
response = requests.post(url, headers=headers, json=data)
|
| 108 |
+
response_text = response.json()['candidates'][0]['content']['parts'][0]['text']
|
| 109 |
+
|
| 110 |
+
# تنظيف النص من علامات ```json ... ```
|
| 111 |
+
match = re.search(r"```json\s*(\{.*\})\s*```", response_text, re.DOTALL)
|
| 112 |
+
if match:
|
| 113 |
+
json_text = match.group(1)
|
| 114 |
+
result = json.loads(json_text)
|
| 115 |
+
|
| 116 |
+
# هنا نحدد مسار ملف JSON بنفس مجلد الصورة وبنفس اسمها ولكن بامتداد json
|
| 117 |
+
folder = os.path.dirname(image_path)
|
| 118 |
+
base_name = os.path.splitext(os.path.basename(image_path))[0]
|
| 119 |
+
output_file = os.path.join(folder, base_name + ".json")
|
| 120 |
+
|
| 121 |
+
with open(output_file, "w", encoding="utf-8") as f:
|
| 122 |
+
json.dump(result, f, ensure_ascii=False, indent=2)
|
| 123 |
+
|
| 124 |
+
print(f"تم حفظ النتيجة في ملف {output_file}")
|
| 125 |
+
print(json.dumps(result, indent=2, ensure_ascii=False))
|
| 126 |
+
else:
|
| 127 |
+
print("لم أتمكن من استخراج JSON نظيف من الرد:")
|
| 128 |
+
print(response_text)
|
gemini_requestCR2.py
ADDED
|
@@ -0,0 +1,134 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import base64
|
| 2 |
+
import json
|
| 3 |
+
import re
|
| 4 |
+
import requests
|
| 5 |
+
import os
|
| 6 |
+
|
| 7 |
+
# Your Gemini API key
|
| 8 |
+
API_KEY = "your_gemini_api_key_here"
|
| 9 |
+
|
| 10 |
+
# Path to the document image you want to extract data from
|
| 11 |
+
image_path = r"C:\Users\ASUS\Downloads\CR_OCR_Cls.v4-original_images.folder\train\CR4\CS000130_CR_jpg.rf.b2528e60546ec399c3088ac69c6a66e2.jpg"
|
| 12 |
+
|
| 13 |
+
|
| 14 |
+
# قراءة الصورة وتحويلها إلى base64
|
| 15 |
+
with open(image_path, "rb") as f:
|
| 16 |
+
image_b64 = base64.b64encode(f.read()).decode()
|
| 17 |
+
|
| 18 |
+
prompt = """
|
| 19 |
+
يرجى استخراج الحقول التالية من صورة مستند CR2 (السجل التجاري 2)، جميعها بالعربية فقط:
|
| 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 |
+
أرجو إعادة النتيجة بصيغة JSON بهذه المفاتيح فقط، وإذا أي حقل غير موجود فضع قيمته null:
|
| 54 |
+
|
| 55 |
+
{
|
| 56 |
+
"الرقم": null,
|
| 57 |
+
"التاريخ": null,
|
| 58 |
+
"الرقم الموحد للمنشأة": null,
|
| 59 |
+
"الاسم التجاري للمؤسسة": null,
|
| 60 |
+
"مركزها الرئيسي": null,
|
| 61 |
+
"هاتف": null,
|
| 62 |
+
"الرمز البريدي": null,
|
| 63 |
+
"اسم التاجر": null,
|
| 64 |
+
"الجنسية": null,
|
| 65 |
+
"تاريخ الميلاد": null,
|
| 66 |
+
"رقم السجل المدني-الإقامة": null,
|
| 67 |
+
"تاريخه": null,
|
| 68 |
+
"مصدره": null,
|
| 69 |
+
"رقم الحفيظة-الجواز": null,
|
| 70 |
+
"تاريخه_2": null,
|
| 71 |
+
"مصدرة": null,
|
| 72 |
+
"النشاط": null,
|
| 73 |
+
"رأس المال": null,
|
| 74 |
+
"اسم المدير او الوكيل المفوض": null,
|
| 75 |
+
"الجنسية_2": null,
|
| 76 |
+
"تاريخ الميلاد_2": null,
|
| 77 |
+
"رقم السجل المدني-الإقامة_2": null,
|
| 78 |
+
"تاريخه_3": null,
|
| 79 |
+
"مصدره_2": null,
|
| 80 |
+
"سلطات المدير": null,
|
| 81 |
+
"يشهد مكتب السجل التجاري بمدينة": null,
|
| 82 |
+
"بأنه تم تسجيل المؤسسة المذكورة أعلاه بمدينة": null,
|
| 83 |
+
"تنتهي صلاحية الشهادات في": null,
|
| 84 |
+
"بموجب الإيصال رقم": null,
|
| 85 |
+
"تاريخ_الإيصال": null,
|
| 86 |
+
"مدير السجل التجاري": null
|
| 87 |
+
}
|
| 88 |
+
"""
|
| 89 |
+
|
| 90 |
+
url = f"https://generativelanguage.googleapis.com/v1/models/gemini-1.5-flash:generateContent?key={API_KEY}"
|
| 91 |
+
|
| 92 |
+
headers = {
|
| 93 |
+
"Content-Type": "application/json"
|
| 94 |
+
}
|
| 95 |
+
|
| 96 |
+
data = {
|
| 97 |
+
"contents": [
|
| 98 |
+
{
|
| 99 |
+
"role": "user",
|
| 100 |
+
"parts": [
|
| 101 |
+
{"text": prompt},
|
| 102 |
+
{
|
| 103 |
+
"inline_data": {
|
| 104 |
+
"mime_type": "image/jpeg",
|
| 105 |
+
"data": image_b64
|
| 106 |
+
}
|
| 107 |
+
}
|
| 108 |
+
]
|
| 109 |
+
}
|
| 110 |
+
]
|
| 111 |
+
}
|
| 112 |
+
|
| 113 |
+
response = requests.post(url, headers=headers, json=data)
|
| 114 |
+
response_text = response.json()['candidates'][0]['content']['parts'][0]['text']
|
| 115 |
+
|
| 116 |
+
# تنظيف النص من علامات ```json ... ```
|
| 117 |
+
match = re.search(r"```json\s*(\{.*\})\s*```", response_text, re.DOTALL)
|
| 118 |
+
if match:
|
| 119 |
+
json_text = match.group(1)
|
| 120 |
+
result = json.loads(json_text)
|
| 121 |
+
|
| 122 |
+
# حفظ بنفس مجلد الصورة وبنفس اسمها بامتداد json
|
| 123 |
+
folder = os.path.dirname(image_path)
|
| 124 |
+
base_name = os.path.splitext(os.path.basename(image_path))[0]
|
| 125 |
+
output_file = os.path.join(folder, base_name + ".json")
|
| 126 |
+
|
| 127 |
+
with open(output_file, "w", encoding="utf-8") as f:
|
| 128 |
+
json.dump(result, f, ensure_ascii=False, indent=2)
|
| 129 |
+
|
| 130 |
+
print(f"تم حفظ النتيجة في ملف {output_file}")
|
| 131 |
+
print(json.dumps(result, indent=2, ensure_ascii=False))
|
| 132 |
+
else:
|
| 133 |
+
print("لم أتمكن من استخراج JSON نظيف من الرد:")
|
| 134 |
+
print(response_text)
|
gemini_requestCR3.py
ADDED
|
@@ -0,0 +1,140 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import base64
|
| 2 |
+
import json
|
| 3 |
+
import re
|
| 4 |
+
import requests
|
| 5 |
+
import os
|
| 6 |
+
|
| 7 |
+
# Your Gemini API key
|
| 8 |
+
API_KEY = "your_gemini_api_key_here"
|
| 9 |
+
|
| 10 |
+
# Path to the document image you want to extract data from
|
| 11 |
+
image_path = r"C:\Users\ASUS\Downloads\CR_OCR_Cls.v4-original_images.folder\train\CR4\CS000130_CR_jpg.rf.b2528e60546ec399c3088ac69c6a66e2.jpg"
|
| 12 |
+
|
| 13 |
+
|
| 14 |
+
with open(image_path, "rb") as f:
|
| 15 |
+
image_b64 = base64.b64encode(f.read()).decode()
|
| 16 |
+
|
| 17 |
+
prompt = """
|
| 18 |
+
Extract the following fields from the CR3 document image. Return both Arabic and English text where available:
|
| 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 |
+
Return as JSON with keys:
|
| 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 |
+
If a field is missing, set it to null.
|
| 89 |
+
"""
|
| 90 |
+
|
| 91 |
+
url = f"https://generativelanguage.googleapis.com/v1/models/gemini-1.5-flash:generateContent?key={API_KEY}"
|
| 92 |
+
|
| 93 |
+
headers = {
|
| 94 |
+
"Content-Type": "application/json"
|
| 95 |
+
}
|
| 96 |
+
|
| 97 |
+
data = {
|
| 98 |
+
"contents": [
|
| 99 |
+
{
|
| 100 |
+
"role": "user",
|
| 101 |
+
"parts": [
|
| 102 |
+
{"text": prompt},
|
| 103 |
+
{
|
| 104 |
+
"inline_data": {
|
| 105 |
+
"mime_type": "image/jpeg",
|
| 106 |
+
"data": image_b64
|
| 107 |
+
}
|
| 108 |
+
}
|
| 109 |
+
]
|
| 110 |
+
}
|
| 111 |
+
]
|
| 112 |
+
}
|
| 113 |
+
|
| 114 |
+
response = requests.post(url, headers=headers, json=data)
|
| 115 |
+
|
| 116 |
+
try:
|
| 117 |
+
response_text = response.json()['candidates'][0]['content']['parts'][0]['text']
|
| 118 |
+
|
| 119 |
+
match = re.search(r"```json\s*(\{.*?\})\s*```", response_text, re.DOTALL)
|
| 120 |
+
if match:
|
| 121 |
+
json_text = match.group(1)
|
| 122 |
+
result = json.loads(json_text)
|
| 123 |
+
|
| 124 |
+
base_name = os.path.splitext(os.path.basename(image_path))[0]
|
| 125 |
+
folder = os.path.dirname(image_path)
|
| 126 |
+
json_path = os.path.join(folder, f"{base_name}.json")
|
| 127 |
+
|
| 128 |
+
with open(json_path, "w", encoding="utf-8") as f:
|
| 129 |
+
json.dump(result, f, ensure_ascii=False, indent=2)
|
| 130 |
+
|
| 131 |
+
print(f"✅ تم حفظ النتيجة في الملف: {json_path}")
|
| 132 |
+
print(json.dumps(result, indent=2, ensure_ascii=False))
|
| 133 |
+
else:
|
| 134 |
+
print("❌ لم أتمكن من استخراج JSON نظيف من الرد:")
|
| 135 |
+
print(response_text)
|
| 136 |
+
|
| 137 |
+
except Exception as e:
|
| 138 |
+
print(f"❌ حدث خطأ أثناء المعالجة: {e}")
|
| 139 |
+
print("الرد الكامل من Gemini:")
|
| 140 |
+
print(response.text)
|
gemini_requestCR6.py
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import base64
|
| 2 |
+
import json
|
| 3 |
+
import re
|
| 4 |
+
import requests
|
| 5 |
+
import os
|
| 6 |
+
|
| 7 |
+
# Your Gemini API key
|
| 8 |
+
API_KEY = "your_gemini_api_key_here"
|
| 9 |
+
|
| 10 |
+
# Path to the document image you want to extract data from
|
| 11 |
+
image_path = r"C:\Users\ASUS\Downloads\CR_OCR_Cls.v4-original_images.folder\train\CR4\CS000130_CR_jpg.rf.b2528e60546ec399c3088ac69c6a66e2.jpg"
|
| 12 |
+
|
| 13 |
+
|
| 14 |
+
# قراءة الصورة وتحويلها إلى base64
|
| 15 |
+
with open(image_path, "rb") as f:
|
| 16 |
+
image_b64 = base64.b64encode(f.read()).decode()
|
| 17 |
+
|
| 18 |
+
prompt = """
|
| 19 |
+
يرجى استخراج الحقول التالية من مستند السجل التجاري (CR6) بالصورة، باللغة العربية فقط:
|
| 20 |
+
|
| 21 |
+
- الكيان التجاري
|
| 22 |
+
- حالة السجل
|
| 23 |
+
- مدة المنشأة
|
| 24 |
+
- الرقم الوطني الموحد للمنشأة
|
| 25 |
+
- رابط المتجر الإكتروني
|
| 26 |
+
- رأس المال
|
| 27 |
+
- المدينة
|
| 28 |
+
- صندوق البريد
|
| 29 |
+
- الرمز البريدي
|
| 30 |
+
- هاتف
|
| 31 |
+
- تاريخ اصدار السجل
|
| 32 |
+
- تاريخ انتهاء السجل
|
| 33 |
+
- الموقع الاكتروني
|
| 34 |
+
- العنوان
|
| 35 |
+
- النشاط التجاري
|
| 36 |
+
|
| 37 |
+
أرجو إعادة النتيجة بصيغة JSON بهذه المفاتيح فقط، وإذا أي حقل غير موجود فضع قيمته null:
|
| 38 |
+
|
| 39 |
+
{
|
| 40 |
+
"الكيان التجاري": null,
|
| 41 |
+
"حالة السجل": null,
|
| 42 |
+
"مدة المنشأة": null,
|
| 43 |
+
"الرقم الوطني الموحد للمنشأة": null,
|
| 44 |
+
"رابط المتجر الإكتروني": null,
|
| 45 |
+
"رأس المال": null,
|
| 46 |
+
"المدينة": null,
|
| 47 |
+
"صندوق البريد": null,
|
| 48 |
+
"الرمز البريدي": null,
|
| 49 |
+
"هاتف": null,
|
| 50 |
+
"تاريخ اصدار السجل": null,
|
| 51 |
+
"تاريخ انتهاء السجل": null,
|
| 52 |
+
"الموقع الاكتروني": null,
|
| 53 |
+
"العنوان": null,
|
| 54 |
+
"النشاط التجاري": null
|
| 55 |
+
}
|
| 56 |
+
"""
|
| 57 |
+
|
| 58 |
+
url = f"https://generativelanguage.googleapis.com/v1/models/gemini-1.5-flash:generateContent?key={API_KEY}"
|
| 59 |
+
|
| 60 |
+
headers = {
|
| 61 |
+
"Content-Type": "application/json"
|
| 62 |
+
}
|
| 63 |
+
|
| 64 |
+
data = {
|
| 65 |
+
"contents": [
|
| 66 |
+
{
|
| 67 |
+
"role": "user",
|
| 68 |
+
"parts": [
|
| 69 |
+
{"text": prompt},
|
| 70 |
+
{
|
| 71 |
+
"inline_data": {
|
| 72 |
+
"mime_type": "image/jpeg",
|
| 73 |
+
"data": image_b64
|
| 74 |
+
}
|
| 75 |
+
}
|
| 76 |
+
]
|
| 77 |
+
}
|
| 78 |
+
]
|
| 79 |
+
}
|
| 80 |
+
|
| 81 |
+
response = requests.post(url, headers=headers, json=data)
|
| 82 |
+
|
| 83 |
+
try:
|
| 84 |
+
response_text = response.json()['candidates'][0]['content']['parts'][0]['text']
|
| 85 |
+
|
| 86 |
+
match = re.search(r"```json\s*(\{.*?\})\s*```", response_text, re.DOTALL)
|
| 87 |
+
if match:
|
| 88 |
+
json_text = match.group(1)
|
| 89 |
+
result = json.loads(json_text)
|
| 90 |
+
|
| 91 |
+
# حفظ النتيجة بنفس اسم ملف الصورة وداخل نفس المجلد
|
| 92 |
+
folder = os.path.dirname(image_path)
|
| 93 |
+
base_name = os.path.splitext(os.path.basename(image_path))[0]
|
| 94 |
+
output_file = os.path.join(folder, base_name + ".json")
|
| 95 |
+
|
| 96 |
+
with open(output_file, "w", encoding="utf-8") as f:
|
| 97 |
+
json.dump(result, f, ensure_ascii=False, indent=2)
|
| 98 |
+
|
| 99 |
+
print(f"✅ تم حفظ النتيجة في ملف: {output_file}")
|
| 100 |
+
print(json.dumps(result, indent=2, ensure_ascii=False))
|
| 101 |
+
else:
|
| 102 |
+
print("❌ لم أتمكن من استخراج JSON نظيف من الرد:")
|
| 103 |
+
print(response_text)
|
| 104 |
+
|
| 105 |
+
except Exception as e:
|
| 106 |
+
print(f"❌ حدث خطأ أثناء المعالجة: {e}")
|
| 107 |
+
print("🔴 الرد الكامل من Gemini:")
|
| 108 |
+
print(response.text)
|
gemini_requestCR7.py
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import base64
|
| 2 |
+
import json
|
| 3 |
+
import re
|
| 4 |
+
import requests
|
| 5 |
+
import os
|
| 6 |
+
|
| 7 |
+
# Your Gemini API key
|
| 8 |
+
API_KEY = "your_gemini_api_key_here"
|
| 9 |
+
|
| 10 |
+
#Path to the document image you want to extract data from
|
| 11 |
+
image_path = r"C:\Users\ASUS\Downloads\OneDrive_1_7-30-2025\CR7\CS015431_CR.jpg"
|
| 12 |
+
|
| 13 |
+
# قراءة الصورة وتحويلها إلى base64
|
| 14 |
+
with open(image_path, "rb") as f:
|
| 15 |
+
image_b64 = base64.b64encode(f.read()).decode()
|
| 16 |
+
|
| 17 |
+
prompt = """
|
| 18 |
+
يرجى استخراج الحقول التالية من مستند السجل التجاري (CR7) بالصورة، باللغة العربية فقط:
|
| 19 |
+
|
| 20 |
+
- اسم المنشأة
|
| 21 |
+
- نوع السجل
|
| 22 |
+
- حالة السجل
|
| 23 |
+
- الرقم الموحد للمنشأة
|
| 24 |
+
- رقم السجل التجاري
|
| 25 |
+
- اسم المالك
|
| 26 |
+
- نوع الكيان
|
| 27 |
+
- تاريخ الاصدار
|
| 28 |
+
- تاريخ الانتهاء
|
| 29 |
+
- قائمة المدراء
|
| 30 |
+
- المدينة
|
| 31 |
+
- الموقع الإلكتروني
|
| 32 |
+
- الانشطة التجارية
|
| 33 |
+
|
| 34 |
+
أرجو إعادة النتيجة بصيغة JSON بهذه المفاتيح فقط، وإذا أي حقل غير موجود فضع قيمته null:
|
| 35 |
+
|
| 36 |
+
{
|
| 37 |
+
"اسم المنشأة": null,
|
| 38 |
+
"نوع السجل": null,
|
| 39 |
+
"حالة السجل": null,
|
| 40 |
+
"الرقم الموحد للمنشأة": null,
|
| 41 |
+
"رقم السجل التجاري": null,
|
| 42 |
+
"اسم المالك": null,
|
| 43 |
+
"نوع الكيان": null,
|
| 44 |
+
"تاريخ الاصدار": null,
|
| 45 |
+
"تاريخ الانتهاء": null,
|
| 46 |
+
"قائمة المدراء": null,
|
| 47 |
+
"المدينة": null,
|
| 48 |
+
"الموقع الإلكتروني": null,
|
| 49 |
+
"الانشطة التجارية": null
|
| 50 |
+
}
|
| 51 |
+
"""
|
| 52 |
+
|
| 53 |
+
url = f"https://generativelanguage.googleapis.com/v1/models/gemini-1.5-flash:generateContent?key={API_KEY}"
|
| 54 |
+
|
| 55 |
+
headers = {
|
| 56 |
+
"Content-Type": "application/json"
|
| 57 |
+
}
|
| 58 |
+
|
| 59 |
+
data = {
|
| 60 |
+
"contents": [
|
| 61 |
+
{
|
| 62 |
+
"role": "user",
|
| 63 |
+
"parts": [
|
| 64 |
+
{"text": prompt},
|
| 65 |
+
{
|
| 66 |
+
"inline_data": {
|
| 67 |
+
"mime_type": "image/jpeg",
|
| 68 |
+
"data": image_b64
|
| 69 |
+
}
|
| 70 |
+
}
|
| 71 |
+
]
|
| 72 |
+
}
|
| 73 |
+
]
|
| 74 |
+
}
|
| 75 |
+
|
| 76 |
+
response = requests.post(url, headers=headers, json=data)
|
| 77 |
+
|
| 78 |
+
try:
|
| 79 |
+
response_text = response.json()['candidates'][0]['content']['parts'][0]['text']
|
| 80 |
+
|
| 81 |
+
match = re.search(r"```json\s*(\{.*?\})\s*```", response_text, re.DOTALL)
|
| 82 |
+
if match:
|
| 83 |
+
json_text = match.group(1)
|
| 84 |
+
result = json.loads(json_text)
|
| 85 |
+
|
| 86 |
+
# حفظ النتيجة بنفس اسم ملف الصورة وداخل نفس المجلد
|
| 87 |
+
folder = os.path.dirname(image_path)
|
| 88 |
+
base_name = os.path.splitext(os.path.basename(image_path))[0]
|
| 89 |
+
output_file = os.path.join(folder, base_name + ".json")
|
| 90 |
+
|
| 91 |
+
with open(output_file, "w", encoding="utf-8") as f:
|
| 92 |
+
json.dump(result, f, ensure_ascii=False, indent=2)
|
| 93 |
+
|
| 94 |
+
print(f"✅ تم حفظ النتيجة في ملف: {output_file}")
|
| 95 |
+
print(json.dumps(result, indent=2, ensure_ascii=False))
|
| 96 |
+
else:
|
| 97 |
+
print("❌ لم أتمكن من استخراج JSON نظيف من الرد:")
|
| 98 |
+
print(response_text)
|
| 99 |
+
|
| 100 |
+
except Exception as e:
|
| 101 |
+
print(f"❌ حدث خطأ أثناء المعالجة: {e}")
|
| 102 |
+
print("🔴 الرد الكامل من Gemini:")
|
| 103 |
+
print(response.text)
|
gemini_requestV1.py
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import base64
|
| 2 |
+
import json
|
| 3 |
+
import re
|
| 4 |
+
import requests
|
| 5 |
+
import os
|
| 6 |
+
|
| 7 |
+
# Your Gemini API key
|
| 8 |
+
API_KEY = "your_gemini_api_key_here"
|
| 9 |
+
|
| 10 |
+
# Path to the document image you want to extract data from
|
| 11 |
+
image_path = r"C:\Users\ASUS\Downloads\CR_OCR_Cls.v4-original_images.folder\train\CR4\CS000130_CR_jpg.rf.b2528e60546ec399c3088ac69c6a66e2.jpg"
|
| 12 |
+
|
| 13 |
+
# قراءة الصورة وتحويلها إلى base64
|
| 14 |
+
with open(image_path, "rb") as f:
|
| 15 |
+
image_b64 = base64.b64encode(f.read()).decode()
|
| 16 |
+
|
| 17 |
+
prompt = """
|
| 18 |
+
Please extract the following fields in Arabic and English from the tax registration document image:
|
| 19 |
+
Taxpayer Name
|
| 20 |
+
VAT Registration Number
|
| 21 |
+
Effective Registration Date
|
| 22 |
+
Taxpayer Address
|
| 23 |
+
|
| 24 |
+
Return the result in a JSON format with these keys:
|
| 25 |
+
en_taxpayer_name, en_vat_registration_number, en_effective_registration_date, en_taxpayer_address,
|
| 26 |
+
ar_taxpayer_name, ar_vat_registration_number, ar_effective_registration_date, ar_taxpayer_address
|
| 27 |
+
|
| 28 |
+
If a field is missing, return null.
|
| 29 |
+
"""
|
| 30 |
+
|
| 31 |
+
url = f"https://generativelanguage.googleapis.com/v1/models/gemini-1.5-flash:generateContent?key={API_KEY}"
|
| 32 |
+
|
| 33 |
+
headers = {
|
| 34 |
+
"Content-Type": "application/json"
|
| 35 |
+
}
|
| 36 |
+
|
| 37 |
+
data = {
|
| 38 |
+
"contents": [
|
| 39 |
+
{
|
| 40 |
+
"role": "user",
|
| 41 |
+
"parts": [
|
| 42 |
+
{"text": prompt},
|
| 43 |
+
{
|
| 44 |
+
"inline_data": {
|
| 45 |
+
"mime_type": "image/jpeg",
|
| 46 |
+
"data": image_b64
|
| 47 |
+
}
|
| 48 |
+
}
|
| 49 |
+
]
|
| 50 |
+
}
|
| 51 |
+
]
|
| 52 |
+
}
|
| 53 |
+
|
| 54 |
+
response = requests.post(url, headers=headers, json=data)
|
| 55 |
+
response_text = response.json()['candidates'][0]['content']['parts'][0]['text']
|
| 56 |
+
|
| 57 |
+
# تنظيف النص من علامات ```json ... ```
|
| 58 |
+
match = re.search(r"```json\s*(\{.*\})\s*```", response_text, re.DOTALL)
|
| 59 |
+
if match:
|
| 60 |
+
json_text = match.group(1)
|
| 61 |
+
result = json.loads(json_text)
|
| 62 |
+
|
| 63 |
+
# استخراج اسم الصورة بدون الامتداد
|
| 64 |
+
image_name = os.path.splitext(os.path.basename(image_path))[0]
|
| 65 |
+
# استخراج مسار المجلد
|
| 66 |
+
image_dir = os.path.dirname(image_path)
|
| 67 |
+
# تحديد مسار ملف الجيسون
|
| 68 |
+
output_path = os.path.join(image_dir, f"{image_name}.json")
|
| 69 |
+
|
| 70 |
+
# حفظ الناتج في ملف بنفس اسم الصورة وبنفس المجلد
|
| 71 |
+
with open(output_path, "w", encoding="utf-8") as f:
|
| 72 |
+
json.dump(result, f, ensure_ascii=False, indent=2)
|
| 73 |
+
|
| 74 |
+
print(f"✅ تم حفظ النتيجة في: {output_path}")
|
| 75 |
+
else:
|
| 76 |
+
print("❌ لم أتمكن من استخراج JSON نظيف من الرد:")
|
| 77 |
+
print(response_text)
|
gemini_requestV2.py
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import base64
|
| 2 |
+
import json
|
| 3 |
+
import re
|
| 4 |
+
import requests
|
| 5 |
+
import os
|
| 6 |
+
|
| 7 |
+
# Your Gemini API key
|
| 8 |
+
API_KEY = "your_gemini_api_key_here"
|
| 9 |
+
|
| 10 |
+
# Path to the document image you want to extract data from
|
| 11 |
+
image_path = r"C:\Users\ASUS\Downloads\CR_OCR_Cls.v4-original_images.folder\train\CR4\CS000130_CR_jpg.rf.b2528e60546ec399c3088ac69c6a66e2.jpg"# قراءة الصورة وتحويلها إلى base64
|
| 12 |
+
with open(image_path, "rb") as f:
|
| 13 |
+
image_b64 = base64.b64encode(f.read()).decode()
|
| 14 |
+
|
| 15 |
+
prompt = """
|
| 16 |
+
Please extract the following fields in Arabic and English from the tax document image:
|
| 17 |
+
Taxpayer Name
|
| 18 |
+
VAT Registration Number
|
| 19 |
+
Effective Registration Date
|
| 20 |
+
Taxpayer Address
|
| 21 |
+
CR/License
|
| 22 |
+
Contract/ID No
|
| 23 |
+
Tax period
|
| 24 |
+
First Filing due date
|
| 25 |
+
|
| 26 |
+
Return the result in a JSON format with these keys:
|
| 27 |
+
en_taxpayer_name, en_vat_registration_number, en_effective_registration_date, en_taxpayer_address,
|
| 28 |
+
en_cr_license, en_contract_id_no, en_tax_period, en_first_filing_due_date,
|
| 29 |
+
ar_taxpayer_name, ar_vat_registration_number, ar_effective_registration_date, ar_taxpayer_address,
|
| 30 |
+
ar_cr_license, ar_contract_id_no, ar_tax_period, ar_first_filing_due_date
|
| 31 |
+
|
| 32 |
+
If a field is missing, return null.
|
| 33 |
+
"""
|
| 34 |
+
|
| 35 |
+
url = f"https://generativelanguage.googleapis.com/v1/models/gemini-1.5-flash:generateContent?key={API_KEY}"
|
| 36 |
+
|
| 37 |
+
headers = {
|
| 38 |
+
"Content-Type": "application/json"
|
| 39 |
+
}
|
| 40 |
+
|
| 41 |
+
data = {
|
| 42 |
+
"contents": [
|
| 43 |
+
{
|
| 44 |
+
"role": "user",
|
| 45 |
+
"parts": [
|
| 46 |
+
{"text": prompt},
|
| 47 |
+
{
|
| 48 |
+
"inline_data": {
|
| 49 |
+
"mime_type": "image/jpeg",
|
| 50 |
+
"data": image_b64
|
| 51 |
+
}
|
| 52 |
+
}
|
| 53 |
+
]
|
| 54 |
+
}
|
| 55 |
+
]
|
| 56 |
+
}
|
| 57 |
+
|
| 58 |
+
response = requests.post(url, headers=headers, json=data)
|
| 59 |
+
response_text = response.json()['candidates'][0]['content']['parts'][0]['text']
|
| 60 |
+
|
| 61 |
+
# تنظيف النص من علامات ```json ... ```
|
| 62 |
+
match = re.search(r"```json\s*(\{.*\})\s*```", response_text, re.DOTALL)
|
| 63 |
+
if match:
|
| 64 |
+
json_text = match.group(1)
|
| 65 |
+
result = json.loads(json_text)
|
| 66 |
+
|
| 67 |
+
# احصل على اسم الصورة بدون امتداد
|
| 68 |
+
image_name = os.path.splitext(os.path.basename(image_path))[0]
|
| 69 |
+
# احصل على مجلد الصورة
|
| 70 |
+
image_dir = os.path.dirname(image_path)
|
| 71 |
+
# مسار ملف JSON الجديد
|
| 72 |
+
output_path = os.path.join(image_dir, f"{image_name}.json")
|
| 73 |
+
|
| 74 |
+
# احفظ الناتج في ملف JSON بنفس اسم الصورة ونفس المجلد
|
| 75 |
+
with open(output_path, "w", encoding="utf-8") as f:
|
| 76 |
+
json.dump(result, f, ensure_ascii=False, indent=2)
|
| 77 |
+
|
| 78 |
+
print(f"✅ تم حفظ النتيجة في: {output_path}")
|
| 79 |
+
print(json.dumps(result, indent=2, ensure_ascii=False))
|
| 80 |
+
else:
|
| 81 |
+
print("❌ لم أتمكن من استخراج JSON نظيف من الرد:")
|
| 82 |
+
print(response_text)
|
gemini_requestV3.py
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import base64
|
| 2 |
+
import json
|
| 3 |
+
import re
|
| 4 |
+
import requests
|
| 5 |
+
import os
|
| 6 |
+
|
| 7 |
+
# Your Gemini API key
|
| 8 |
+
API_KEY = "your_gemini_api_key_here"
|
| 9 |
+
|
| 10 |
+
# Path to the document image you want to extract data from
|
| 11 |
+
image_path = r"C:\Users\ASUS\Downloads\CR_OCR_Cls.v4-original_images.folder\train\CR4\CS000130_CR_jpg.rf.b2528e60546ec399c3088ac69c6a66e2.jpg"
|
| 12 |
+
|
| 13 |
+
with open(image_path, "rb") as f:
|
| 14 |
+
image_b64 = base64.b64encode(f.read()).decode()
|
| 15 |
+
|
| 16 |
+
prompt = """
|
| 17 |
+
استخرج الحقول التالية من مستند باللغة العربية فقط، وأرجعها بصيغة JSON:
|
| 18 |
+
|
| 19 |
+
1. اسم المكلف
|
| 20 |
+
2. عنوان المركز الرئيسي
|
| 21 |
+
3. المدينة
|
| 22 |
+
4. الحي
|
| 23 |
+
5. صندوق البريد
|
| 24 |
+
6. الرمز البريدي
|
| 25 |
+
7. الهاتف
|
| 26 |
+
|
| 27 |
+
الصيغة المطلوبة:
|
| 28 |
+
|
| 29 |
+
{
|
| 30 |
+
"اسم المكلف": "...",
|
| 31 |
+
"عنوان المركز الرئيسي": "...",
|
| 32 |
+
"المدينة": "...",
|
| 33 |
+
"الحي": "...",
|
| 34 |
+
"صندوق البريد": "...",
|
| 35 |
+
"الرمز البريدي": "...",
|
| 36 |
+
"الهاتف": "..."
|
| 37 |
+
}
|
| 38 |
+
|
| 39 |
+
إذا لم يوجد حقل، أرجعه كـ null.
|
| 40 |
+
"""
|
| 41 |
+
|
| 42 |
+
url = f"https://generativelanguage.googleapis.com/v1/models/gemini-1.5-flash:generateContent?key={API_KEY}"
|
| 43 |
+
|
| 44 |
+
headers = {
|
| 45 |
+
"Content-Type": "application/json"
|
| 46 |
+
}
|
| 47 |
+
|
| 48 |
+
data = {
|
| 49 |
+
"contents": [
|
| 50 |
+
{
|
| 51 |
+
"role": "user",
|
| 52 |
+
"parts": [
|
| 53 |
+
{"text": prompt},
|
| 54 |
+
{
|
| 55 |
+
"inline_data": {
|
| 56 |
+
"mime_type": "image/jpeg",
|
| 57 |
+
"data": image_b64
|
| 58 |
+
}
|
| 59 |
+
}
|
| 60 |
+
]
|
| 61 |
+
}
|
| 62 |
+
]
|
| 63 |
+
}
|
| 64 |
+
|
| 65 |
+
response = requests.post(url, headers=headers, json=data)
|
| 66 |
+
|
| 67 |
+
try:
|
| 68 |
+
response_text = response.json()['candidates'][0]['content']['parts'][0]['text']
|
| 69 |
+
|
| 70 |
+
match = re.search(r"```json\s*(\{.*\})\s*```", response_text, re.DOTALL)
|
| 71 |
+
if match:
|
| 72 |
+
json_text = match.group(1)
|
| 73 |
+
else:
|
| 74 |
+
json_text = response_text
|
| 75 |
+
|
| 76 |
+
result = json.loads(json_text)
|
| 77 |
+
|
| 78 |
+
# استخراج اسم الصورة بدون امتداد ومسار المجلد
|
| 79 |
+
image_name = os.path.splitext(os.path.basename(image_path))[0]
|
| 80 |
+
image_dir = os.path.dirname(image_path)
|
| 81 |
+
|
| 82 |
+
# تحديد مسار ملف JSON بنفس اسم الصورة ونفس المجلد
|
| 83 |
+
output_file = os.path.join(image_dir, f"{image_name}.json")
|
| 84 |
+
|
| 85 |
+
# حفظ النتيجة في ملف JSON
|
| 86 |
+
with open(output_file, "w", encoding="utf-8") as f:
|
| 87 |
+
json.dump(result, f, ensure_ascii=False, indent=2)
|
| 88 |
+
|
| 89 |
+
print(f"✅ تم حفظ النتيجة في ملف {output_file}")
|
| 90 |
+
print(json.dumps(result, indent=2, ensure_ascii=False))
|
| 91 |
+
|
| 92 |
+
except Exception as e:
|
| 93 |
+
print("❌ حدث خطأ أثناء معالجة الرد:")
|
| 94 |
+
print(response.text)
|
| 95 |
+
print(e)
|
gemini_requestcr4.py
ADDED
|
@@ -0,0 +1,135 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import base64
|
| 2 |
+
import json
|
| 3 |
+
import re
|
| 4 |
+
import requests
|
| 5 |
+
import os
|
| 6 |
+
|
| 7 |
+
# Your Gemini API key
|
| 8 |
+
API_KEY = "your_gemini_api_key_here"
|
| 9 |
+
|
| 10 |
+
|
| 11 |
+
#Path to the document image you want to extract data from
|
| 12 |
+
image_path = r"C:\Users\ASUS\Downloads\CR_OCR_Cls.v4-original_images.folder\train\CR4\CS000130_CR_jpg.rf.b2528e60546ec399c3088ac69c6a66e2.jpg"
|
| 13 |
+
|
| 14 |
+
with open(image_path, "rb") as f:
|
| 15 |
+
image_b64 = base64.b64encode(f.read()).decode()
|
| 16 |
+
|
| 17 |
+
prompt = """
|
| 18 |
+
Extract the following fields from the CR4 document image. Return both Arabic and English text where available:
|
| 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 |
+
Return as JSON with keys:
|
| 45 |
+
{
|
| 46 |
+
"رقم_موحد": ...,
|
| 47 |
+
"رقم_المنشأة": ...,
|
| 48 |
+
"التاريخ": ...,
|
| 49 |
+
"الاسم_التجاري": ...,
|
| 50 |
+
"نوعها": ...,
|
| 51 |
+
"جنسيتها": ...,
|
| 52 |
+
"مدة_الشركة": ...,
|
| 53 |
+
"تبدأ_من": ...,
|
| 54 |
+
"تنتهي_في": ...,
|
| 55 |
+
"مركزها_الرئيسي": ...,
|
| 56 |
+
"هاتف": ...,
|
| 57 |
+
"الرمز_البريدي": ...,
|
| 58 |
+
"النشاط": ...,
|
| 59 |
+
"رأس_المال": ...,
|
| 60 |
+
"المديرون": ...,
|
| 61 |
+
"سلطات_المدير": ...,
|
| 62 |
+
"يشهد_مكتب_السجل": ...,
|
| 63 |
+
"تم_تسجيل_المؤسسة": ...,
|
| 64 |
+
"تنتهي_صلاحية_الشهادة": ...,
|
| 65 |
+
"الإيصال_رقم": ...,
|
| 66 |
+
"الإيصال_تاريخ": ...
|
| 67 |
+
}
|
| 68 |
+
If a field is missing, set it to null.
|
| 69 |
+
"""
|
| 70 |
+
|
| 71 |
+
url = f"https://generativelanguage.googleapis.com/v1/models/gemini-1.5-flash:generateContent?key={API_KEY}"
|
| 72 |
+
|
| 73 |
+
headers = {
|
| 74 |
+
"Content-Type": "application/json"
|
| 75 |
+
}
|
| 76 |
+
|
| 77 |
+
data = {
|
| 78 |
+
"contents": [
|
| 79 |
+
{
|
| 80 |
+
"role": "user",
|
| 81 |
+
"parts": [
|
| 82 |
+
{"text": prompt},
|
| 83 |
+
{
|
| 84 |
+
"inline_data": {
|
| 85 |
+
"mime_type": "image/jpeg",
|
| 86 |
+
"data": image_b64
|
| 87 |
+
}
|
| 88 |
+
}
|
| 89 |
+
]
|
| 90 |
+
}
|
| 91 |
+
]
|
| 92 |
+
}
|
| 93 |
+
|
| 94 |
+
response = requests.post(url, headers=headers, json=data)
|
| 95 |
+
|
| 96 |
+
try:
|
| 97 |
+
response_text = response.json()['candidates'][0]['content']['parts'][0]['text']
|
| 98 |
+
|
| 99 |
+
# استخراج JSON من النص
|
| 100 |
+
match = re.search(r"```json\s*(\{.*?\})\s*```", response_text, re.DOTALL)
|
| 101 |
+
if match:
|
| 102 |
+
json_text = match.group(1)
|
| 103 |
+
result = json.loads(json_text)
|
| 104 |
+
|
| 105 |
+
base_name = os.path.splitext(os.path.basename(image_path))[0]
|
| 106 |
+
folder = os.path.dirname(image_path)
|
| 107 |
+
json_path = os.path.join(folder, f"{base_name}.json")
|
| 108 |
+
|
| 109 |
+
# إذا الملف موجود نقرأه ونضيف عليه
|
| 110 |
+
if os.path.exists(json_path):
|
| 111 |
+
with open(json_path, "r", encoding="utf-8") as f:
|
| 112 |
+
try:
|
| 113 |
+
existing_data = json.load(f)
|
| 114 |
+
if not isinstance(existing_data, list):
|
| 115 |
+
existing_data = [existing_data]
|
| 116 |
+
except json.JSONDecodeError:
|
| 117 |
+
existing_data = []
|
| 118 |
+
else:
|
| 119 |
+
existing_data = []
|
| 120 |
+
|
| 121 |
+
existing_data.append(result)
|
| 122 |
+
|
| 123 |
+
with open(json_path, "w", encoding="utf-8") as f:
|
| 124 |
+
json.dump(existing_data, f, ensure_ascii=False, indent=2)
|
| 125 |
+
|
| 126 |
+
print(f"✅ تم حفظ النتيجة في الملف: {json_path}")
|
| 127 |
+
print(json.dumps(result, indent=2, ensure_ascii=False))
|
| 128 |
+
else:
|
| 129 |
+
print("❌ لم أتمكن من استخراج JSON نظيف من الرد:")
|
| 130 |
+
print(response_text)
|
| 131 |
+
|
| 132 |
+
except Exception as e:
|
| 133 |
+
print(f"❌ حدث خطأ أثناء المعالجة: {e}")
|
| 134 |
+
print("الرد الكامل من Gemini:")
|
| 135 |
+
print(response.text)
|
gemini_requestcr5.py
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import base64
|
| 2 |
+
import json
|
| 3 |
+
import re
|
| 4 |
+
import requests
|
| 5 |
+
import os
|
| 6 |
+
|
| 7 |
+
# Your Gemini API key
|
| 8 |
+
API_KEY = "your_gemini_api_key_here"
|
| 9 |
+
|
| 10 |
+
# Path to the document image you want to extract data from
|
| 11 |
+
image_path = r"C:\Users\ASUS\Downloads\CR_OCR_Cls.v4-original_images.folder\train\CR4\CS000130_CR_jpg.rf.b2528e60546ec399c3088ac69c6a66e2.jpg"
|
| 12 |
+
|
| 13 |
+
|
| 14 |
+
with open(image_path, "rb") as f:
|
| 15 |
+
image_b64 = base64.b64encode(f.read()).decode()
|
| 16 |
+
|
| 17 |
+
prompt = """
|
| 18 |
+
Extract the following fields from the CR5 document image. Return both Arabic and English text where available:
|
| 19 |
+
|
| 20 |
+
الرقم
|
| 21 |
+
التاريخ
|
| 22 |
+
الرقم الموحد للمنشأة
|
| 23 |
+
الاسم التجاري للشركة
|
| 24 |
+
نوعها
|
| 25 |
+
جنسيتها
|
| 26 |
+
مدة الشركة
|
| 27 |
+
تبدا من
|
| 28 |
+
تنتهي في
|
| 29 |
+
مركزها الرئيسي
|
| 30 |
+
هاتف
|
| 31 |
+
الرمز البريدي
|
| 32 |
+
النشاط
|
| 33 |
+
رأس المال
|
| 34 |
+
المديرون
|
| 35 |
+
سلطات المدير/المديرون
|
| 36 |
+
يشهد مكتب السجل التجاري بمدينة
|
| 37 |
+
بأنه تم تسجيل المؤسسة المذكورة أعلاة بمدينة
|
| 38 |
+
وتنتهي صلاحية الشهادات في
|
| 39 |
+
بموجب الإيصال رقم
|
| 40 |
+
وتاريخ
|
| 41 |
+
|
| 42 |
+
Return as JSON with keys:
|
| 43 |
+
{
|
| 44 |
+
"رقم": ...,
|
| 45 |
+
"التاريخ": ...,
|
| 46 |
+
"الرقم_الموحد_للمنشأة": ...,
|
| 47 |
+
"الاسم_التجاري_للشركة": ...,
|
| 48 |
+
"نوعها": ...,
|
| 49 |
+
"جنسيتها": ...,
|
| 50 |
+
"مدة_الشركة": ...,
|
| 51 |
+
"تبدا_من": ...,
|
| 52 |
+
"تنتهي_في": ...,
|
| 53 |
+
"مركزها_الرئيسي": ...,
|
| 54 |
+
"هاتف": ...,
|
| 55 |
+
"الرمز_البريدي": ...,
|
| 56 |
+
"النشاط": ...,
|
| 57 |
+
"رأس_المال": ...,
|
| 58 |
+
"المديرون": ...,
|
| 59 |
+
"سلطات_المدير": ...,
|
| 60 |
+
"يشهد_مكتب_السجل": ...,
|
| 61 |
+
"تم_تسجيل_المؤسسة": ...,
|
| 62 |
+
"تنتهي_صلاحية_الشهادة": ...,
|
| 63 |
+
"الإيصال_رقم": ...,
|
| 64 |
+
"الإيصال_تاريخ": ...
|
| 65 |
+
}
|
| 66 |
+
If a field is missing, set it to null.
|
| 67 |
+
"""
|
| 68 |
+
|
| 69 |
+
url = f"https://generativelanguage.googleapis.com/v1/models/gemini-1.5-flash:generateContent?key={API_KEY}"
|
| 70 |
+
|
| 71 |
+
headers = {
|
| 72 |
+
"Content-Type": "application/json"
|
| 73 |
+
}
|
| 74 |
+
|
| 75 |
+
data = {
|
| 76 |
+
"contents": [
|
| 77 |
+
{
|
| 78 |
+
"role": "user",
|
| 79 |
+
"parts": [
|
| 80 |
+
{"text": prompt},
|
| 81 |
+
{
|
| 82 |
+
"inline_data": {
|
| 83 |
+
"mime_type": "image/jpeg",
|
| 84 |
+
"data": image_b64
|
| 85 |
+
}
|
| 86 |
+
}
|
| 87 |
+
]
|
| 88 |
+
}
|
| 89 |
+
]
|
| 90 |
+
}
|
| 91 |
+
|
| 92 |
+
response = requests.post(url, headers=headers, json=data)
|
| 93 |
+
|
| 94 |
+
try:
|
| 95 |
+
response_text = response.json()['candidates'][0]['content']['parts'][0]['text']
|
| 96 |
+
|
| 97 |
+
match = re.search(r"```json\s*(\{.*?\})\s*```", response_text, re.DOTALL)
|
| 98 |
+
if match:
|
| 99 |
+
json_text = match.group(1)
|
| 100 |
+
result = json.loads(json_text)
|
| 101 |
+
|
| 102 |
+
base_name = os.path.splitext(os.path.basename(image_path))[0]
|
| 103 |
+
folder = os.path.dirname(image_path)
|
| 104 |
+
json_path = os.path.join(folder, f"{base_name}.json")
|
| 105 |
+
|
| 106 |
+
with open(json_path, "w", encoding="utf-8") as f:
|
| 107 |
+
json.dump(result, f, ensure_ascii=False, indent=2)
|
| 108 |
+
|
| 109 |
+
print(f"✅ تم حفظ النتيجة في الملف: {json_path}")
|
| 110 |
+
print(json.dumps(result, indent=2, ensure_ascii=False))
|
| 111 |
+
else:
|
| 112 |
+
print("❌ لم أتمكن من استخراج JSON نظيف من الرد:")
|
| 113 |
+
print(response_text)
|
| 114 |
+
|
| 115 |
+
except Exception as e:
|
| 116 |
+
print(f"❌ حدث خطأ أثناء المعالجة: {e}")
|
| 117 |
+
print("الرد الكامل من Gemini:")
|
| 118 |
+
print(response.text)
|