كيفية استرجاع مبلغ في ملف PDF وموقعه في الصفحة

توضح هذه المقالة استخدام PyMuPDF لتحديد موقع نص الكمية المتكررة داخل مستطيل محدد. من خلال تحليل الحقول الخمسة الأولى من الكلمات الثماني والتحقق من عدد المرشحين، يمكن تجنب سوء التقدير في الربط الجزئي. يوفر أمثلة Python على مستوى الذاكرة، واستراتيجيات معالجة الحدود، وجداول القبول، ويقدم اقتراحات عملية للاتصال بسير عمل ترجمة مستندات OmniDoc.

كيفية تحديد المبالغ المكررة؟ استنتاج جملة واحدة

عندما يتم إصلاح التخطيط، حدد أولاً المنطقة المعروفة ثم تحقق من النص، واترك عدد المرشحين للمتصل للحكم عليه. من الأسهل تفسيرها بدلاً من الاستمرار في تكديس التعبيرات النمطية، كما أنها أقل عرضة لارتكاب الأخطاء الصامتة.

حالتكالممارسات الموصى بهاسبب
يظهر نفس المبلغ في أماكن متعددة بالصفحةقصر البحث على المنطقة المستطيلة التي يقع فيها مجال الأعمال ثم ابحثلا يمكن للبحث عن النص الكامل تحديد الحقل الذي يمثل مجال الأعمال
هناك العديد من المرشحين في منطقة الاستعلامقم بإرجاع كافة المرشحين، بالإضافة إلى التسميات أو التوضيح اليدويلا ينبغي للبرامج أن تحدد خيارات الأعمال
لا توجد نتائج في منطقة الاستعلامحدد السبب وتحقق من الصفحة الأصلية، بدون أي حشوةيمكن أن تؤدي المنطقة الخاطئة أو الكميات المقسمة أو طبقات النص المفقودة إلى عدم وجود نتائج
يبدو موضع الإطار معزولًاسلاسل تحويل صريحة للتدوير والاقتصاص وحجم العرضسيؤدي خلط إحداثيات العرض والإحداثيات المستخرجة إلى حدوث انحرافات

مبلغين متطابقين في كشف واحد

يظهر 1,200.00 مرتين في البيان: مرة في عمود المبلغ المستحق ومرة في نص الوصف. يمكن للبحث عن النص الكامل العثور عليها، لكنه لا يمكنه أن يقرر لك أي مجال هو مجال الأعمال.

إذا تم إصلاح تخطيط النموذج، عادةً ما يكون من الأسهل تفسيره عن طريق تحديد منطقة معروفة أولاً ثم البحث في النص بدلاً من الاستمرار في ضبط التعبير العادي. المفتاح ليس "العثور على مربع واحد فقط"، ولكن التعامل مع كل من النتائج الصفرية والزيارات المتعددة كنتائج واضحة، وعدم السماح للبرنامج باتخاذ خيارات غير مصرح بها.

اترك موضع الكلمة، وليس النص فقط

يقوم `page.get_text("words")` الخاص بـ PyMuPDF بإرجاع سجل كلمة مع الموضع، والحقل المشترك هو (x0, y0, x1, y1, text, block_no, line_no, word_no). يأخذ المثال التالي الحقول الخمسة الأولى فقط، ولا يتم تضمين الأرقام الثلاثة الأخيرة في التصفية الإقليمية في الوقت الحالي.

"والكلمة" هنا هي القطعة التي قدمها المستخرج، وهي لا تساوي بالضرورة كلمة بالمعنى اللغوي، ولا يضمن أن يكون المقدار دائما قطعة كاملة. قد يتم تفكيك 1,200.00 أو قد يكون لها علامات مجاورة. تتناول هذه المقالة فقط المطابقة الدقيقة للأجزاء الكاملة: أفضل تسليم السجلات التي لا تستوفي شروط المراجعة بدلاً من ربطها بهدوء بمبلغ يبدو قانونيًا.

تحقق باستخدام صفحتين اصطناعيتين بنفس المقدار

نقوم بإنشاء صفحة PDF جديدة في الذاكرة ونضع نفس المقدار بالقرب من الإحداثيات الرأسية 120 و420 على التوالي. منطقة الاستعلام تغطي فقط المبلغ أعلاه.

نقطة إدراج النص هي موضع الخط الأساسي، وليس الزاوية اليسرى العليا من مربع النص. سيتأثر ارتفاع وعرض الصندوق الحقيقي بالخط وحجم الخط، لذلك لا يمكن ترميز الإحداثيات في قيمة ثابتة.

يجب أن يستوفي الإخراج الصحيح شرطين:

  • يوجد مرشح واحد فقط في منطقة الاستعلام، ويتم تضمين مستطيل المرشح بالكامل في المنطقة.
  • بعد توسيع نطاق الاستعلام إلى الصفحة بأكملها، يجب الحصول على مرشحين اثنين، وبالتالي الدخول إلى فرع الغموض.

وأخيرًا، تحقق من عدم وجود نتائج بسلسلة غير موجودة في الصفحة. وهذا أقرب إلى العقد الذي تتطلبه الواجهة الحقيقية من مجرد إظهار عملية بحث ناجحة.

الكود القابل للتشغيل: قم بتسليم عدد المرشحين للمتصل

التبعية هي pymupdf، يرجى تثبيت الإصدار وقفله في بيئة الاختبار. التعليمة البرمجية التالية لا تصل إلى الشبكة، ولا تكتب الملفات، ولا تقوم بتعديل مستند العميل الأصلي. يقوم بإنشاء ملف PDF توضيحي فقط.

import pymupdf

def locate(page, target, query):
    query = pymupdf.Rect(query)
    candidates = []
    for word in page.get_text("words"):
        x0, y0, x1, y1, text = word[:5]
        box = pymupdf.Rect(x0, y0, x1, y1)
        if text == target and query.contains(box):
            candidates.append(tuple(box))
    return candidates

def decide(candidates):
    if len(candidates) == 0:
        return "missing"
    if len(candidates) > 1:
        return "ambiguous"
    return "unique"

with pymupdf.open() as doc:
    page = doc.new_page(width=595, height=842)
    page.insert_text((80, 120), "1,200.00", fontsize=11)
    page.insert_text((80, 420), "1,200.00", fontsize=11)
    query = pymupdf.Rect(72, 100, 300, 150)
    local = locate(page, "1,200.00", query)
    assert decide(local) == "unique"
    assert query.contains(pymupdf.Rect(local[0]))
    assert decide(locate(page, "1,200.00", page.rect)) == "ambiguous"
    assert decide(locate(page, "999.99", query)) == "missing"
    print("unique / ambiguous / missing cases passed")

يتطلب contains الشمول الكامل، بدلاً من مجرد لمس حافة المنطقة. إذا كان مربع الاستعلام ضيقًا جدًا، فقد تنخفض المبالغ الجانبية إلى صفر، وهذا ليس سببًا لتوسيعه تلقائيًا إلى الصفحة الكاملة. يجب عليك التحقق من نظام الإحداثيات المستخدم لقياس المنطقة قبل أن تقرر كيفية ضبط النطاق.

إذا سمحت الشركة بسقوط النقطة المركزية، فيجب كتابة قواعد إضافية وإجراء اختبارات إضافية لتداخل الحدود. ولا يغير سراً معنى الحكم في نفس الوظيفة.

يجب ألا يعتمد منطق الإنتاج فقط على assert لاعتراض الاستثناءات، حيث قد تؤدي أوضاع التحسين إلى إزالة التأكيدات. يتم استخدام التأكيدات الموجودة في المثال للتحقق من الانحدار. عند الوصول فعليًا إلى قائمة انتظار المهام، يجب استخدام الفروع الشرطية وحالات العمل الواضحة.

ثلاث نتائج، ثلاث طرق معالجة

يتم عادةً تقسيم نتائج الاستعلام إلى ثلاث فئات، تتطلب كل منها إجراءات معالجة مختلفة:

  • ضربة واحدة فقط: يوجد جزء مطابق كامل واحد فقط في المنطقة، ويتم حفظ رقم الصفحة والنص الأصلي والمستطيل وإصدار القاعدة.
  • صفر نتيجة: قد يكون هناك خطأ في المنطقة، أو أن الكمية مقسمة، أو أن طبقة النص مفقودة. حدد السبب المرشح، وتحقق من الصفحة الأصلية، ولا تضيف أصفارًا.
  • الزيارات المتعددة: توجد مبالغ مكررة في نفس المنطقة، أو تم تغيير القالب، قم بإرجاع جميع المرشحين، أو دمج التسميات أو توضيح الغموض يدويًا.

كما يجب التعامل مع الحالتين الأخريين بشكل منفصل:

  • صندوق لكن القيم غير صحيحة: قد تكون طبقة النص نفسها غير صحيحة أو الهدف المطابق غير صحيح؛ ارجع إلى الصفحة الأصلية للتحقق ولا يسمح بتأكيد الإحداثيات بواسطة قيم رقمية.
  • إزاحة الصندوق: قد تكون إحداثيات العرض والاستخراج مختلطة، مما يتطلب سلاسل انتقال واضحة للتكبير الدوراني، والقص، والتصيير.

📊 مقارنة النواة

طريقة الاستعلاممعايير الحكمبحاجة الى الاهتمام
الشمول الكامل (مثال مستخدم)يتم وضع المستطيل المرشح بالكامل داخل منطقة الاستعلامإذا كان صندوق الاستعلام ضيقا جدا، قد يكون المبلغ على الحافة صفر ضربة
نقطة المركز تسقط (يجب كتابة القواعد بشكل منفصل)تقع نقاط مركز المرشحين داخل المنطقةيتطلب التداخل بين الحدود اختبارات تكميلية منفصلة
البحث عن صفحات كاملةابحث عن جميع المرشحينمعظم النتائج غامضة وتتطلب وضع علامات أو حكم يدوي إضافي

هذا ليس مستخرجا للكميات الشاملة

الرمز لا يحلل العملات، أو آلاف الفواصل، أو القواعد العشرية، ولا يعترف بالمصطلحات مثل "الفترة الحالية المستحقة للدفع" و"رصيد الفترة السابقة". مجرد وجود مرشح واحد لا يعني أن العمل هو المعنى الصحيح.

يجب أن تكون النسخة الممسوحة ضوئيا أيضا متاحة للنص والموقع أولا. لا يمكن السماح بالصفحات التي تحتوي على طبقات نصية ولكن محتوى غير صحيح لمجرد إمكانية نسخها.

تستخدم هذه المقالة صفحة مقال غير معدلة. عندما تدور الصفحة الحقيقية، حدد أولا ما إذا كان صندوق الاستعلام يأتي من شاشة العرض أو يستخرج الإحداثيات، ولا يقوم بالتحويل إلا إذا لزم الأمر. لا تضرب في المصفوفة بغض النظر عن المصدر.

عند حفظ صفحات المصدر، اميز بين الفهارس من صفر إلى الصفر وأرقام الصفحات التي تواجه الأشخاص لتجنب الاعتقاد خطأ بعدم وجود أدلة عند التحقق من الصفحات المجاورة.

🎯 أي طريقة تناسبك؟

إذا كنت بحاجة لاستخراج البيانات من نموذج تخطيط ثابت

أولا، حدد المنطقة التي يقع فيها حقل الأعمال، ثم ابحث عن المبلغ، واحفظ رقم الصفحة والمستطيل ونسخة القاعدة.

إذا واجهت عدة مرشحين

لا تأخذ الخيار الأول مباشرة؛ أعد جميع المرشحين وحدد حقول الأعمال بناء على الوسوم أو الحكم اليدوي.

إذا كانت صفحتك غالبا ما تذهب إلى صفر الضربة

أولا، تحقق مما إذا كانت إحداثيات المنطقة والكمية وطبقة النص موجودة، ثم قرر ما إذا كنت ستعدل النطاق أو تنتقل إلى مسارات استخراج أخرى.

إذا أردت ترجمة المستندات

تتضمن المراجعة اليدوية تفاصيل رئيسية مثل الكمية والتاريخ والكمية مع تقسيم واضح للعمل بين الفحص الفني والمراجعة اليدوية.

اترك الأرقام الرئيسية للمراجعة

يجب ألا تعتمد ترجمة المستندات فقط على طلاقة الجملة، بل أيضا على عناصر رئيسية مثل الكمية والتاريخ والكمية. توفر أومني دوك (إدخال المنتج) عدة بوابات ترجمة وثائق، ويمكن أن تكون المقارنة ثنائية اللغة المقدمة على الموقع الرسمي نقطة دخول للمراجعة؛ نصوص تحديد المواقع المنسقة مناسبة للحفاظ على الأدلة الأصلية والمساعدة في تحديد مناطق المشكلة.

ينصح أولا بالتقييم باستخدام عينة إزالة التحسس التي أذنت بها للرفع. مع طول الترجمة، قد يتغير موقع المحتوى بشكل معقول، ولا ينبغي اعتبار "الإحداثيات الجديدة والقديمة متطابقة تماما" كشرط صارم للترجمة الصحيحة.

الشيكات الأكثر قيمة هي: ما إذا كان المبلغ محتفظا به، وما إذا كانت العملة محددة بوضوح، وما إذا كان الملصق المقابل لا يزال يشير إلى نفس معنى العمل.

❓ الأسئلة الشائعة (الأسئلة الشائعة)

1. لماذا لا تأخذ الضربة الأولى فقط؟

لأن البحث الكامل في النص يمكنه فقط أن يخبرك أين يظهر المبلغ، ولا يمكنه تحديد أي جزء هو حقل العمل. قد يبدو أخذ الضربة الأولى مباشرة صحيحا، لكن المصدر قد يكون خاطئا بالفعل.

2. لماذا يتطلب صندوق الاستعلام التضمين الكامل بدلا من مجرد لمس الحافة؟

يستخدم المثال طريقة تحديد كاملة لتجنب اعتبار المقاطع غير المكتملة ضربات صحيحة. إذا كان صندوق الاستعلام ضيقا جدا ويسبب صفر نزيارات، تحقق أولا من نظام الإحداثيات والمدى، بدلا من توسيع الصفحة بالكامل تلقائيا.

3. ماذا يجب أن تفعل عندما تكون نتيجة الاستعلام صفرية؟

حدد سبب المرشح وتحقق من الصفحة الأصلية؛ لا تضيف أصفار. المناطق غير الصحيحة، أو الكميات المقسمة، أو طبقات النص المفقودة كلها يمكن أن تؤدي إلى صفر زمات.

4. هل يمكن استخدام هذا الرمز مباشرة على الفواتير الحقيقية؟

لا يمكن استخدامه مباشرة. المثال لا يتناول العملة أو فاصل الآلاف أو دلالات الأعمال، وعينة التركيب في هذا المقال لا تمثل اختبار دقة للأوراق النقدية الحقيقية.

📝 ملخص

عند تحديد المبلغ، حدد المنطقة أولا، ثم أعط العدد الكامل للمرشحين للمتصل للحكم. يجب أن يكون لكل من الضربات الصفرية والمتعددة إجراءات تعامل واضحة. أولا، استخدم عينات مقلقة للتحقق من القواعد، ثم دمج المستندات الحقيقية تدريجيا.

اختبر الآن: ارفع مستندك لتبدأ الترجمة، مع الحفاظ على التنسيق الأصلي

تاريخ التحديث: 2026-11-14