إخراج PDF عربي سليم: من الحروف المقطّعة إلى ملف مُتحقَّق منه

مجانًا
تم التنزيل 18 مرة

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

  • مجاني، ولا يتطلب أي دفع
  • تنزيل فوري بعد إتمام الطلب
  • مشترياتك محفوظة في حسابك

لماذا تخرج الحروف العربية مقطّعة في PDF، وما الحل في dompdf و TCPDF و mPDF؟

تتقطّع الحروف حين لا تصلها المكتبة بحسب موضعها في الكلمة، وتنعكس الكلمات حين لا ترتّبها من اليمين إلى اليسار. والحل يختلف باختلاف المكتبة:

  • dompdf: لا يصل الحروف ولا يرتّبها، وما زال كذلك في إصداره 3.1.6 الصادر في يوليو 2026، فتخرج مقطّعة ومعكوسة معًا. الترقيع أن تعالج النص قبل تمريره إليه بمكتبة تحوّله إلى أشكال موصولة بترتيب بصري، مثل الدالة utf8Glyphs في مكتبة ar-php. وانتبه فيها إلى أمرين: أنها تقطع النص افتراضيًا إلى أسطر لا يتجاوز الواحد منها 50 حرفًا، فاجعل معاملها الثاني بقدر ما يتسع له سطرك وحوّل فواصل الأسطر في ناتجها إلى وسم br، وإلا اختلّ ترتيب الفقرة الطويلة؛ وأنها تحوّل الأرقام 123 إلى ١٢٣ ما لم تمرّر false في معاملها الثالث. يُطبع الناتج بعدها سليمًا، لكن نسخ النص والبحث فيه يتضرّران، ولهذا أنصح بالانتقال إلى مكتبة تصل الحروف بنفسها، مثل mPDF، في كل فاتورة يراها عميلك.
  • TCPDF: يصل الحروف ويرتّبها بنفسه، فلا تعالج النص قبله وإلا انعكس مرتين. اختر خطًا يغطي العربية وفعّل setRTL. ومثاله الرسمي للكتابة من اليمين إلى اليسار في الإصدار 6 يكتب العربية بالخطين aefurat وaealarabiya، وقد أُزيلا من الإصدار 7 وصار طلبهما يوقف التوليد بخطأ، فاستعمل بدلهما dejavusans أو freeserif.
  • mPDF: يصل الحروف من جداول الخط نفسه، لكن للخط الذي يحمل useOTL في تعريفه فقط. فإن أضفت خطًا عربيًا في fontdata فأعطه useOTL بالقيمة 0xFF، واضبط الخاصية dir على rtl في عنصر html، ولا تعالج النص قبله.

ما الذي تضيفه المهارة

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

كيف تعمل

  • تصنيف العرَض: خمسة أعراض تغطي ما يُبلَّغ عنه في هذا المجال تقريبًا — مربعات فارغة، حروف منفصلة، كلمات معكوسة، أرقام وأقواس في المكان الخطأ، حركات مقصوصة. لكل عرَض سبب جذري واحد واختبار يؤكّده.
  • حكم المكتبة: جدول لخمس عشرة مكتبة يجيب عن سؤالين مستقلّين: هل تُشكّل الحروف (أي تصلها بحسب موضعها)؟ وهل تعيد ترتيبها؟ من هنا يُعرف هل تحتاج طبقة معالجة قبل الطباعة، أم أن إضافتها ستكسر ملفك بـ«الانعكاس المزدوج».
  • القرار بتكلفته: ترقيع، أو معالجة مسبقة، أو استبدال المكتبة — معروضة بثمنها الحقيقي لا بوصفها خيارات متساوية.
  • الإثبات: صفحة اختبار من اثني عشر سطرًا تغطي المقاطع المختلطة والعملة والحركات والجداول والالتفاف، ثم استخراج النص من الملف الناتج ومقارنته آليًا، ثم فحص بصري للصفحة. لا تُقال عبارة «تم الإصلاح» قبل ظهور نتيجة المقارنة.

بماذا تحصل

  • مهارة واحدة (SKILL.md) بثماني خطوات وبوابات توقّف وعقد إخراج محدَّد.
  • سبعة ملاحق: جدول الأعراض، جدول المكتبات، دليل الخطوط والتجزئة والتضمين، صفحة الاختبار وسكربت المقارنة، تخطيط الفاتورة من اليمين إلى اليسار، تصدير CSV وXLSX وDOCX والبريد، ونواة نظافة النص العربي.
  • دليل عربي كامل للتثبيت والاستخدام، وملف جاهز للرفع في Claude على الويب والتطبيق.

نموذج من مخرجات المهارة

هذا مثال تشغيل على بيانات تجريبية بالكامل: فاتورة لشركة وهمية في الرياض طُبعت بـ Playwright 1.60.0 وChromium 148.0.7778.96، فخرجت الحروف العربية منفصلة بعد خطوة بناء جزّأت ملف الخط لتصغير حجمه. أعطيتُ المهارة الفاتورة المعطوبة وقالبها وسكربت الطباعة وأمر تجزئة الخط، وهذا ما جاء في تقريرها:

  • العرَض والسبب: العرَض 2، حروف منفصلة بترتيب صحيح، وسببه واحد: الخط المجزَّأ احتفظ بجدول GSUB لكن بلا سمات، صفر في الملف المجزَّأ مقابل تسع في الأصلي. وأثبتت المهارة ذلك بتبديل ملف الخط وحده على الصفحة نفسها.
  • الحكم والقرار: Chromium يشكّل الحروف ويطبّق الاتجاه، فكان القرار ترقيعًا بلا أي مكتبة لتشكيل الحروف. وفحصت المهارة نقاط الترميز في اسم البائع واسم العميل وثلاثة من أسماء البنود قبل الطباعة، فلم تجد أي نقطة بين U+FB50 وU+FEFF.
  • التغيير: إعادة التجزئة بكل السمات ونطاقات أوسع رفعت الخط من 14,660 إلى 49,136 بايتًا، وصارت الشرطة الطويلة تُرسم بخط الوثيقة بعد أن كانت تسقط إلى SegoeUI.
  • التخطيط: أعمدة الأرقام كانت محاذاة يسار فصارت يمين، وأضافت المهارة قواعد تمنع انقسام الصف وكتلتي الإجماليات والتوقيعات بين صفحتين، ثم اختبرتها على فاتورة من 52 بندًا: خرجت في 3 صفحات، والترويسة مكررة على كلٍّ منها، والإجماليات والتوقيعان معًا في الثالثة.
  • التذييل: قالب التذييل رسم عبارة «صفحة س من ص» بخط ArialMT لا بخط الوثيقة، فجُرّب صندوق هامش في CSS فخرجت العبارة بخط الوثيقة، ولم يبقَ في الملف إلا Tajawal-Regular.
  • الأمانة في التحقق: سلامة الأسطر الاثني عشر ثبتت بالنظر، أما مقارنة الاستخراج فلم تثبت بالمستخرِج المتاح على الجهاز، فكتب التقرير «لم أتحقّق بعد؛ هذه الحالة لم يجرِ التحقّق منها» بدل «تم الإصلاح».

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

لمن هي

لمن يولّد فواتير أو تقارير أو شهادات أو كشوف حسابات بالعربية من كود — في PHP أو Python أو Node أو Java — وسواء كان يُصلح مشروعًا قائمًا أو يختار مكتبة لمشروع جديد.

التثبيت

ثلاث طرق مشروحة خطوة بخطوة في الملف README-AR.md داخل الحزمة: رفع الملف الجاهز في Claude على الويب والتطبيق، أو نسخ المجلد في Claude Code، أو وضعه في مجلد المهارات لأي أداة أخرى.

حدودها

  • ترفض الفوترة الإلكترونية النظامية بكل تفاصيلها: حقول الجهة المختصة، والهاش، ورمز QR، والتوقيع، والإرسال. تُصلح شكل الفاتورة لا محتواها النظامي.
  • لا تذكر نسبة ضريبة ولا مهلة قانونية من عندها، بل تجعلها حقولًا تأتي من إعداداتك.
  • لا تعالج اتجاه واجهة المستخدم، ولا تلمس تخزين النص في قاعدة بياناتك.
  • تعالج ما يولّده كودك من مستندات؛ أمّا تأليف ملف .docx أو .pptx أو .xlsx أو إصلاحه بذاته فله منتج مستقل في المكتبة.
  • لا تقترح خطًا غير حر الرخصة.
  • كل صف في جدول المكتبات يصف بنية المكتبة كما كانت معروفة حتى مايو 2026، وليس شهادة اختبار على نسختك أنت. المكتبات تتغيّر، ولهذا تنتهي المهارة باختبار يُجرى على إصدارك: إن خالف الصفُّ نتيجتك، فالنتيجة هي الصحيحة، والمهارة مأمورة بأن تقول لك ذلك صراحةً.