لماذا تختلف الصور المأخوذة من ملف PDF عن تلك التي تظهر على الصفحة؟
قد يتم تخزين الصور ذات الشفافية بشكل منفصل كصورة رئيسية وقناع ناعم. بعد ذلك، استخدم Pillow لإنشاء RGBA PNG، وأدخل ملف PDF الموجود في الذاكرة، وقم بتقييم الصورة الرئيسية وSMask. إن استخراج وحدات بايت الصورة الرئيسية لا يساوي الحصول على تأثير الشفافية الكامل، ولا يساوي إعادة بناء كافة مثيلات العرض على الصفحة.
غالبًا ما تبدو الصور التي تستخرجها من ملفات PDF مختلفة عما تراه على الصفحة: فهي إما سوداء تمامًا، أو بحجم خاطئ، أو خلفيات أو علامات مائية مفقودة. لا تكمن المشكلة عادةً في الكود نفسه، ولكن في حقيقة أنك تقرأ كائن الصورة الأصلي داخل ملف PDF وتفتقد تعليمات التكوين عند عرض الصفحة.
هذه المقالة مكتوبة للمطورين ومعالجي المستندات الذين يحتاجون إلى استخدام البرامج النصية لتحليل صور PDF. إنها مناسبة لسيناريوهات مثل المعالجة المسبقة للتعرف الضوئي على الحروف وإعادة تنظيم المحتوى. بعد القراءة، يمكنك فهم الفرق بين الكائن الأصلي وعرض الصفحة، ومعرفة سبب تسبب SMask (القناع الناعم) في فقدان المناطق الشفافة، وإتقان مجموعة من طرق الاختبار الذاتي باستخدام العينات الاصطناعية.
تستخدم هذه المقالة عينات اصطناعية لتوضيح طريقة المعالجة. تم فحص الكود بأمثلة في بيئة معزولة ولا يضمن جميع الملفات الحقيقية أو أداء المنتج. قبل معالجة المستندات المهمة، يرجى الاحتفاظ بالنسخ الأصلية ومراجعتها وفقًا للحدود وبنود القبول في النص.
نتائج استخراج الصور بصيغة PDF غير متوافقة مع الصفحة؟ استنتاج جملة واحدة
بايتات الصورة الرئيسية المستخرجة لا تساوي التأثير الكامل على الصفحة. يجب معالجة SMask في نفس الوقت، ويتم استخدام نتيجة العرض الفعلية للقارئ كمعيار للقبول.
| حالتك | الممارسات الموصى بها | سبب |
|---|---|---|
| نتيجة الاستخراج هي مستطيل بلون خالص، وتصبح المنطقة الشفافة سوداء أو بيضاء | تحقق مما إذا كانت smask_xref تساوي 0 وقم بدمج SMask كقناة ألفا في الصورة الرئيسية | قد يتم تخزين الصور ذات الشفافية بشكل منفصل كالصورة الرئيسية والقناع الناعم. سيؤدي استخراج الصورة الرئيسية فقط إلى فقدان معلومات الشفافية. |
| وما يتم استخراجه هو الصورة الكبيرة الكاملة، ولا يتم عرض سوى جزء منها على الصفحة. | اقرأ مصفوفة CTM و/BBox، وقم بالقص وفقًا لمنطقة العرض | يمكن إعادة استخدام نفس خريطة الأساس من خلال صفحات متعددة، وتعرض كل صفحة منطقتها الجزئية فقط. |
| اتجاه الصورة معكوس أو مشوه | قراءة معلمات المصفوفة للتصحيح الهندسي، والتحقق يدويًا من النص والوجوه | قد تحتوي مصفوفة التحويل على تحجيم سلبي أو تحويلات غير موحدة |
| تم الاستخراج بنجاح ولكن لا يمكن رؤية الصفحة | استعلم عن حالة OCG وقارنها مع CropBox | قد تكون الصورة مخفية بواسطة مجموعة محتوى اختيارية أو خارج منطقة الاقتصاص |
| الصورة ضبابية أو منخفضة الدقة | قم بتسجيل البيانات التعريفية لـ DPI ووضع علامة عليها على أنها منخفضة الجودة، وأعد فحص الملفات المصدر إذا لزم الأمر | قد تكون الصورة الأصلية المضمنة في حد ذاتها صورة مصغرة منخفضة الدقة |
الفرق بين الكائنات الأصلية وخطوط العرض
يتم تنظيم ملفات PDF مثل مستودع الموارد. `Document.extract_image(xref)` ما تفعله هذه الطريقة هو إخراج الأجزاء من المستودع كما هي. يحتاج العرض الموجود على الصفحة أيضًا إلى المرور عبر عمليات متعددة: قياس مصفوفة التحويل (CTM)، وقطع مسار القطع (مسار المقطع)، وخلط مجموعة الشفافية (مجموعة الشفافية)، وتراكب القناع الناعم (قناع ناعم).
الفرق الأكثر شيوعًا يأتي من SMask. يتم تقسيم العديد من ملفات PNG ذات قناة الشفافية إلى جزأين داخل ملف PDF: دفق صور RGB، ودفق قناع رمادي منفصل. إذا قمت فقط باستخراج الصورة الرئيسية وتجاهل كائن SMask المرتبط، فستحصل على مستطيل بدون شفافية، وستصبح المنطقة الشفافة في الأصل سوداء أو بيضاء.
بالإضافة إلى ذلك، من أجل توفير الحجم، يمكن إعادة استخدام نفس الخريطة الأساسية عالية الدقة بواسطة صفحات متعددة، وتعرض كل صفحة جزءًا منها فقط من خلال /BBox ومصفوفات مختلفة. سيؤدي الاستخراج المباشر إلى الحصول على الصورة الكبيرة الكاملة، بدلاً من الأجزاء المقصوصة التي يراها المستخدم. إن "ما تراه ليس ما تحصل عليه" هو سمة متأصلة في PDF كتنسيق تبادل وليس عيبًا في مكتبة التحليل.
ويقارن الجدول أدناه بين وجهتي النظر:
📊 المقارنة الأساسية
| أبعاد التباين | استخراج الكائن الأصلي مباشرة | نتائج عرض الصفحة |
|---|---|---|
| المحتوى الذي تحصل عليه | الأجزاء الأصلية في مستودع الموارد، مثل تدفق الصورة الرئيسي | التأثيرات البصرية التي تعالج بواسطة تعليمات التوليف |
| الشفافية | يمكن تخزين الصورة الرئيسية وSMask بشكل منفصل ويجب تعيينهما يدويا | تمت إضافة القناع الناعم، وتظهر المنطقة الشفافة بشكل طبيعي |
| الحجم والمدى | قد يكون الحجم الكامل لخريطة القاعدة | مقيد بواسطة CTM و/BBox ومسارات القص |
| حالة إعادة الاستخدام | قد تشارك نفس الخريطة الأساسية عبر عدة صفحات | كل صفحة تقدم أجزائها الخاصة فقط |
بيئة اختبار التوليف والتعامل مع وضع الحدود
للتحقق من منطق الاستخراج دون الاعتماد على ملفات خارجية، يجب بناء ملف PDF صناعي يحتوي على SMask. يستخدم الكود التالي PyMuPDF لإنشاء مستندات اختبار في الذاكرة، حيث تحتوي كائنات الصور على أقنعة ناعمة مستقلة، محاكاة سيناريو واقعي حيث "الأيقونات لها خلفيات شفافة لكنها مخزنة في تدفقات منفصلة في الأسفل."
from io import BytesIO
from PIL import Image
import pymupdf
im = Image.new("RGBA", (16, 16), (255, 0, 0, 128))
raw = BytesIO()
im.save(raw, format="PNG")
with pymupdf.open() as doc:
page = doc.new_page(width=100, height=100)
page.insert_image(pymupdf.Rect(10, 10, 70, 70), stream=raw.getvalue())
images = page.get_images(full=True)
assert len(images) == 1
xref, smask = images[0][:2]
assert xref > 0 and smask > 0
assert doc.extract_image(xref)["width"] == 16
assert doc.extract_image(smask)["image"]
الإخراج الصحيح للتوقعات: يجب أن يكون البرنامج قادرا على التعرف على أن الصورة مرتبطة ب SMask واستخراج بيانات الصورة الرئيسية بنجاح.
الكود مكتف بذاته بالكامل ولا يتطلب ملفات إدخال خارجية. يقوم بتوليف ملفات PDF مع SMask في الذاكرة ثم يتحقق مما إذا كان منطق الاستخراج يحدد ارتباطات القناع بشكل صحيح. يحتوي الكود على تأكيدين رئيسيين: أحدهما للتحقق من سلامة البيانات المستخرجة، والآخر للتحقق من إدراك حالات الارتباط ب SMask.
يركز هذا الكود على التحقق من السلامة على مستوى البيانات الوصفية. في الإنتاج الفعلي، إذا تم استخدام smask_xref != 0، تحتاج مكتبات مثل Pillow إلى لصق نتائج doc.extract_image(smask_xref) كقناة ألفا على الصورة الرئيسية. هاتان الادعاءان يغطيان على التوالي العقدين الأساسيين: "قابلية استخراج البيانات" و"الرؤية الترابطية بالقناع"، والتي يمكن أن تمنع النجاحات الكاذبة عند حدوث مستندات فارغة أو تغييرات في واجهة برمجة التطبيقات.
الحدود بين قبول نتائج الاستخراج والمراجعة اليدوية
لا يمكن للاستخراج الآلي أن يحل محل التأكيد البصري بالكامل. يلخص الجدول أدناه الظواهر غير الطبيعية الشائعة، واستراتيجيات التعامل، والمواقف التي يجب الحكم عليها يدويا.
| راقب الظاهرة | الأسباب المحتملة | قرارات المعالجة الآلية | مراجعة يدوية لظروف الزناد |
|---|---|---|---|
| الصورة سوداء بالكامل أو بيضاء بالكامل | يتم استخراج SMask كصورة مستقلة؛ فشل فك ترميز فضاء الألوان | تحقق من جمعيات SMask؛ حاول إعادة مساحة الألوان إلى الخلف | لا يزال المحتوى لا يمكن التعرف عليه بعد الاسترجاع؛ يتضمن الألوان الموضعية أو الألوان المتعلقة بالأجهزة |
| يتم عكس اتجاه الصورة أو تمديده | تحتوي مصفوفة CTM على تحويلات سلبية أو غير منتظمة | قراءة معلمات المصفوفة للتصحيح الهندسي | بعد التصحيح، تتشوه النصوص أو الوجوه بشكل ملحوظ؛ مسارات القص المتجهية المعقدة |
| عدة صور صغيرة مجتمعة في صورة كبيرة واحدة | ترميز الكتل (نمط التبليط) أو تخزين الشرائط | اقطع أو انضم حسب إحداثيات BBox | فواصل واضحة في المفاصل؛ منطقيا، يجب أن تكون وحدة دلالية مستقلة |
| تم الاستخلاص بنجاح، لكن الصفحة غير مرئية | مخفي بواسطة OCG (مجموعة المحتوى الاختياري)؛ تقع خارج منطقة القطع | استعلام تصفية حالة OCG; قارن مع CropBox | منطق الطبقة معقد، مثل OCMD المتداخل؛ حقول الشكل الديناميكية |
| الدقة منخفضة جدا أو ضبابية | التضمين الأصلي هو صورة مصغرة منخفضة الدقة | سجل بيانات وصفية DPI وصنفها على أنها منخفضة الجودة | الجداول أو النصوص الرئيسية تكون ضبابية وغير قابلة للقراءة؛ تحتاج إلى إعادة مسح ملف المصدر |
لاحظ أن "عرض الكود" يتحقق فقط من اتصال استدعاءات واجهة برمجة التطبيقات وتدفقات البيانات، ولا يضمن الأداء من طرف إلى طرف. عند مواجهة منطق OCG المتداخل، أو الشيدرات المخصصة، أو المستندات المشفرة، يكون مخرج السكريبت للرجوع إليه فقط ويجب قبوله بناء على العرض الفعلي لقارئ PDF.
🎯 أي طريقة تناسبك؟
إذا كنت بحاجة للحفاظ على تأثير الشفافية
أولا، تحقق مما إذا كان SMask موجودا، ودمجها في قناة ألفا، ثم قم بإجراء المعالجة التالية.
إذا كنت تحتاج فقط إلى صورة جزئية على الصفحة
اقرأ CTM و /BBox، وقص حسب منطقة العرض، بدلا من حفظ الصورة الأساسية مباشرة.
إذا كانت صورتك نسخة ممسوحة ضوئيا أو مدمجة في صور منخفضة الدقة
أولا، سجل بيانات وصفية DPI وحدد الجودة؛ إذا كان المحتوى الرئيسي غير واضح، عد إلى الملف المصدر لإعادة المسح.
إذا كان المستند يحتوي على طبقات أو تشفير أو قص معقد
عامل إخراج السكريبت كنتيجة أولية، وفي النهاية استخدم تأثير العرض الخاص بقارئ PDF كمرجع نهائي.
❓ الأسئلة الشائعة (الأسئلة الشائعة)
1. لماذا تحولت المناطق الشفافة من الصورة المستخرجة إلى اللون الأسود؟
سبب شائع هو أن المعلومات الشفافة تخزن في SMask، حيث يتم استخراج الصورة الرئيسية فقط دون دمج القناع.
2. الصورة المستخرجة أكبر بكثير مما تراه في الصفحة. ما الذي يحدث؟
يمكن إعادة استخدام نفس خريطة القاعدة من عدة صفحات، وتعرض كل صفحة جزءا جزئيا فقط عبر /BBox والمصفوفات. الاستخراج المباشر ينتج خريطة القاعدة الكاملة.
3. إذا كان الكود يعمل، هل يعني ذلك أن نتائج الاستخراج يمكن استخدامها مباشرة؟
لا. عروض الكود تتحقق فقط من استدعاءات واجهة برمجة التطبيقات واتصال تدفق البيانات، وفي النهاية تتطلب قبول نتائج العرض الفعلية للقارئ.
4. كان الاستخلاص ناجحا، لكن الصورة لم تكن مرئية على الصفحة. ما السبب؟
قد تكون الصور مخفية بواسطة مجموعات المحتوى الاختيارية (OCGs) أو تقع خارج منطقة الاقتصاص، مما يسمح باستعلامات حالة OCG والمقارنة مع CropBox.
📝 ملخص
كائن الصورة الأصلي وعرض الصفحة في PDF هما شيئان مختلفان، لذا قبل استخراجهما، عليك أن تفهم علاقتهما. معالجة معلومات SMask والمصفوفة والقص معا، والتحقق منها بنتائج العرض تضمن نتائج موثوقة.
اختبر الآن: ارفع مستندك لتبدأ الترجمة، مع الحفاظ على التنسيق الأصلي


