تخطَّ إلى المحتوى

ما الفرق بين pdfl compare و pdfl pixelcompare؟

أمران يأخذان ملفَّي PDF ويخبرانك بما تغيّر. يبدو ذلك تكرارًا، إلى أن يختلفا لأول مرة — عندها تكتشف أنهما لم يكونا يجيبان عن السؤال نفسه قط.

يسأل pdfl compare: ماذا يقول المستند. ويسأل pdfl pixelcompare: كيف يبدو المستند.

وقد ينجح ملف في أحدهما ويسقط في الآخر، في الاتجاهين معًا.

pdfl compare: ماذا يقول المستند

Section titled “pdfl compare: ماذا يقول المستند”

يقرأ النص والبنية والبيانات الوصفية:

Terminal window
pdfl compare approved_v1.pdf new_v2.pdf

وما يستحق معرفته هو كيف يوائم بين الصفحات: بالمحتوى لا بالرقم. أدرج صفحة في منتصف عقد، فتبلّغ مقارنةٌ ساذجة عن كل صفحة بعدها بوصفها متغيّرة؛ أما هذه فتنتبه إلى الإدراج وتواصل مقابلة النظير بالنظير. ويصمد ذلك في مستندات تتجاوز الألف صفحة.

ويحصل كل زوج مُوائَم على درجة تشابه وعيّنة من الأسطر التي تحرّكت، - للمحذوف و+ للمضاف:

page 4 → 4: similarity 97.8% | -original title | +revised title

تغيّر البيانات الوصفية تحذير. وتغيّر النص خطأ حين ينزل تحت الحد الذي تضعه، وتحذير حين يبقى فوقه.

Terminal window
# يتجاهل حالة الأحرف والمسافات والتواريخ — مفيد حين يُعاد توليد تاريخ
# الإصدار مع كل تصدير ولا يكون هو موضع المراجعة
pdfl compare approved_v1.pdf new_v2.pdf --normalize --ignore-dates
# يقبل فرقًا حتى ١٪، ويخرج شيئًا يقرأه إنسان
pdfl compare v1.pdf v2.pdf --similarity-threshold 99 \
--output html --output-file diff.html

pdfl pixelcompare: كيف يبدو المستند

Section titled “pdfl pixelcompare: كيف يبدو المستند”

يرسم الملفين ويقارن الصفحات بوصفها صورًا:

Terminal window
pdfl pixelcompare approved.pdf reprint.pdf

ملاحظة واحدة لكل صفحة تغيّرت، مع نسبة ما اختلف منها وعدد المواضع المنفصلة:

page 7: 0.51% of the pixels differ, in 29 area(s)

ويعوّض أولًا الإزاحة العامة، لأن الملف المُصدَّر من جديد من المصدر نفسه كثيرًا ما يستقر بفارق بكسل أو اثنين، ولولا ذلك لعُدّت حافة كل حرف فرقًا:

page 3: 2.10% of the pixels differ, in 44 area(s) (aligned by 2, -1 px)

ويستطيع أن يكتب مكانًا تنظر فيه:

Terminal window
pdfl pixelcompare approved.pdf reprint.pdf --viewer diff/

يضم ذلك المجلد الصفحات والفروق وملف index.html — بلا خادم وبلا شيء يُثبَّت. الأحمر حبر اختفى، والأخضر حبر جديد، والأزرق الثقل نفسه بلون مختلف.

النص متطابق والملف خطأ. شعار انتقل مليمترين. خط شعري اختفى. لون خاص استُبدل بتركيبه من CMYK. يبلّغ compare عن تطابق تام في الحالات الثلاث، لأن حرفًا واحدًا لم يتحرك. وpixelcompare يمسك الثلاث.

الملف يبدو متطابقًا والنص خطأ. استُبدل العنوان في البيانات الوصفية، أو أُعيدت كتابة حقل المؤلف. لا شيء على الصفحة يتزحزح بكسلًا واحدًا، فيرى pixelcompare مستندين متطابقين. أما compare فيبلّغ عن التغيير.

ولا واحد منهما يحتوي الآخر. وهذا هو بيت القصيد.

أربعة مواقف، وما تشغّله في كل منها

Section titled “أربعة مواقف، وما تشغّله في كل منها”

عاد عقد من الإدارة القانونية. تحتاج أن تعرف ماذا تقول الصياغة الآن مقارنةً بما كانت تقوله. التنضيد سيكون قد أُعيد تدفّقه، وهذا لا يعنيك.

Terminal window
pdfl compare contract_v3.pdf contract_v4.pdf --ignore-dates \
--output html --output-file review.html

وصلت إعادة طباعة من المورّد. يجب ألا يبدو أي شيء مختلفًا عن التجربة المعتمدة. وكون النص مطابقًا بايتًا ببايت ليس هو المسألة — المسألة ما يخرج على الورق.

Terminal window
pdfl pixelcompare approved.pdf reprint.pdf --viewer diff/

المستند نفسه، مُصدَّرًا بأداة أخرى. غيّر المورّد برنامجه. الكلمات يجب أن تبقى سليمة، والمظهر مرشّح لأن ينزاح قليلًا. هنا يلزم الاثنان، وكل منهما يتحقق من وعد مختلف:

Terminal window
pdfl compare old_export.pdf new_export.pdf --normalize
pdfl pixelcompare old_export.pdf new_export.pdf --max-diff 0.1 --viewer diff/

ملصق أو نشرة خاضعة للتنظيم. نص التحذير يفرضه القانون، والتنضيد اعتمده شخص وقّع عليه. كلاهما مُلزِم، فيُفحص كلاهما — ومجلد العارض هو ما ترفقه بالاعتماد.

Terminal window
pdfl compare approved.pdf press_file.pdf
pdfl pixelcompare approved.pdf press_file.pdf --viewer evidence/

الاثنان معًا، بوابةً واحدة

Section titled “الاثنان معًا، بوابةً واحدة”

كل أمر ينتهي برمز خروج، فيقرر النص البرمجي دون أن يقرأ شيئًا. يستعمل pixelcompare الرمز 0 حين لا تتجاوز أي صفحة حد التسامح، و2 حين تتجاوزه واحدة، و10 حين تتعذر قراءة ملف؛ ويتبع compare العُرف الذي تتبعه كل أوامر التحقق — 0 نجاح، 1 تحذيرات، 2 أخطاء، 10 غير مقروء.

#!/bin/sh
# وعدان وبوابة واحدة: الكلمات، والمظهر.
set -e
pdfl compare approved.pdf candidate.pdf --output-file text-diff.json || {
echo "تغيّرت الصياغة — انظر text-diff.json"
exit 1
}
pdfl pixelcompare approved.pdf candidate.pdf --max-diff 0.05 --viewer diff/ || {
echo "المظهر غير مطابق — افتح diff/index.html"
exit 1
}
echo "الكلمات نفسها، والمظهر نفسه"
السؤال الذي تطرحه الأمر
هل تغيّرت الصياغة؟ pdfl compare
هل تغيّرت البيانات الوصفية؟ pdfl compare
هل أُدرجت صفحة أو حُذفت؟ pdfl compare
هل تحرّك شيء أو اختفى أو تغيّر لونه؟ pdfl pixelcompare
هل ما يزال يُطبع كما كان؟ pdfl pixelcompare
هل هذا هو الملف المعتمد؟ كلاهما

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

DigitalOceanشكرًا لـ DigitalOcean على استضافة هذا الموقع.