Pro الإصدار
Font Tools — مرجع متعمّق
لمحة سريعة
قسم بعنوان «لمحة سريعة»هذه الصفحة هي المرجع على مستوى العقد لأدوات الخطوط في NextPDF Pro. يتكوّن السطح من ماسح واحد، NextPDF\Pro\FontTools\FontDesubsetter، وكائنَي قيمة غير قابلَين للتغيير، SubsetInfo وDesubsetPlan. يقرأ الماسح بايتات PDF الخام، ويبلّغ عن كل مدخل /BaseFont مميّز، ويؤشّر المدخلات التي تتبع اصطلاح تسمية التجزئة في ISO 32000-2:2020 §9.9.2. تجمّع الخطّة التجزئات المؤشَّرة وتُقدِّر تكلفة البايت لاستعادة برامج الخطوط الكاملة. تحلّل الوحدة وتُقدِّر فقط؛ ولا تُعيد كتابة برنامج خطّ مُضمَّن أبدًا. تعرض هذه الصفحة واجهة برمجة التطبيقات العامة، وعقد السلوك القابل للرصد، وأنماط الإخفاق.
التوفّر والترخيص
قسم بعنوان «التوفّر والترخيص»تُشحن هذه القدرة في NextPDF Pro (nextpdf/pro) وتُفعَّل بمظروف ترخيص من فئة Pro. ولا يُحمِّل أي نشر يفتقر إلى ذلك الاستحقاق أصنافَ هذه القدرة. قارِن الإصدارات واحصل على ترخيص.
لا توجد علامة ترخيص لكل ميزة تحجب هذه الوحدة. وتتوفّر أصناف Font Tools كلما كان nextpdf/pro مُثبَّتًا.
سطح واجهة برمجة التطبيقات العامة
قسم بعنوان «سطح واجهة برمجة التطبيقات العامة»| الرمز | المعامِلات | السلوك الافتراضي | يُرجِع | يرمي أو يُخفق بـ | ملاحظات |
|---|---|---|---|---|---|
FontDesubsetter | لا شيء | ماسح عديم الحالة على بايتات PDF الخام | — | — | final؛ آمن لإعادة الاستخدام عبر المستندات |
FontDesubsetter::analyzeSubsets() | string $pdfData | يبلّغ عن كل مدخل /BaseFont مميّز، مُجزَّأ أو غير مُجزَّأ، مؤشَّرًا بـisSubset | list<SubsetInfo> | InvalidArgumentException عندما يتجاوز تقدير التجزئة المشتقّ من العرض تقديرَ العدد الكامل المشتقّ من الاسم | فحص على مستوى البايت؛ لا تُفَكّ شفرة تدفّقات الكائنات المضغوطة |
FontDesubsetter::isSubsetFont() | string $baseFontName | يطابق اصطلاح البادئة: ستّة أحرف كبيرة زائد + | bool | — | مُثبَّت عند بداية الاسم |
FontDesubsetter::extractSubsetPrefix() | string $baseFontName | يُرجِع وسم التجزئة المكوّن من ستّة أحرف | string | — | سلسلة فارغة للأسماء غير المُجزَّأة |
FontDesubsetter::generateDesubsetPlan() | list<SubsetInfo> $subsets | يجمع المدخلات التي isSubset فيها true ويجمع تقدير الحجم | DesubsetPlan | لا يرمي | تُتَجاوز المدخلات غير المُجزَّأة بصمت |
SubsetInfo | المُنشئ: $fontName، $baseFont، $subsetGlyphCount، $fullGlyphCount، $isSubset، $encoding | وصف غير قابل للتغيير لمدخل /BaseFont واحد | — | InvalidArgumentException عند عدد محارف سالب، أو عدد تجزئة يفوق العدد الكامل | final readonly؛ جميع الخصائص عامة |
SubsetInfo::subsetPrefix() | لا شيء | يستخرج الوسم المكوّن من ستّة أحرف من fontName | string | — | سلسلة فارغة عندما لا يكون مُجزَّأً أو عندما يقع + بعيدًا عن الموضع السادس |
SubsetInfo::coveragePercent() | لا شيء | نصيب التجزئة من مجموعة المحارف الكاملة | float في [0.0, 100.0] | — | يُرجِع 0.0 عندما يكون fullGlyphCount مساويًا 0 |
DesubsetPlan | المُنشئ: list<SubsetInfo> $targets، int $estimatedSizeIncrease | خطّة إلغاء تجزئة غير قابلة للتغيير | — | — | final readonly؛ جميع الخصائص عامة |
DesubsetPlan::count() | لا شيء | عدد الخطوط المستهدَفة | int | — | يساوي طول targets |
DesubsetPlan::totalGlyphsNeeded() | لا شيء | مجموع المحارف الناقصة عبر جميع الأهداف | int | — | مجموع fullGlyphCount - subsetGlyphCount لكل هدف |
تواقيع نقاط الدخول
قسم بعنوان «تواقيع نقاط الدخول»public function analyzeSubsets(string $pdfData): array
public function isSubsetFont(string $baseFontName): bool
public function extractSubsetPrefix(string $baseFontName): string
public function generateDesubsetPlan(array $subsets): DesubsetPlanpublic function __construct( public string $fontName, public string $baseFont, public int $subsetGlyphCount, public int $fullGlyphCount, public bool $isSubset, public string $encoding,)
public function subsetPrefix(): string
public function coveragePercent(): floatpublic function __construct( public array $targets, public int $estimatedSizeIncrease,) {}
public function count(): int
public function totalGlyphsNeeded(): intعقد السلوك
قسم بعنوان «عقد السلوك»الفحص وكشف التجزئة
قسم بعنوان «الفحص وكشف التجزئة»يستخرج analyzeSubsets() رموز اسم /BaseFont من البايتات الخام بمطابقة نمط على مستوى البايت. وتنطوي الأسماء المكرّرة في مدخل واحد؛ ويتبع الترتيب أول ظهور. ويُنتِج كل اسم مميّز SubsetInfo، سواء أكان تجزئة أم لا. ويكون الاسم تجزئة عندما يبدأ بستّة أحرف لاتينية كبيرة تمامًا متبوعةً بـ+، وهو اصطلاح §9.9.2. وللأسماء المُجزَّأة، يكون baseFont هو الاسم بعد إزالة البادئة المكوّنة من سبعة محارف. وللأسماء العادية، يساوي baseFont قيمةَ fontName. ويُبلَّغ عن كل اسم تجزئة مميّز كمدخل مستقل، بما يوافق إرشاد §9.9.2 بمعاملة التجزئات ككيانات مستقلة.
كشف الترميز
قسم بعنوان «كشف الترميز»لكل خطّ، يبحث الماسح في نافذة بايت محدودة بعد ورود /BaseFont. ويفوز مدخل اسم /Encoding في النافذة. وإذا تعذّر ذلك، يُبلَّغ عن سلسلة فرعية Identity-H أو Identity-V في النافذة. وإذا تعذّر كلاهما، يُبلِّغ المدخل عن Unknown. أما قيم الترميز المحفوظة في قواميس أو المُبلَّغ إليها عبر مراجع غير مباشرة فتُبلِّغ عن Unknown.
إحصاء المحارف
قسم بعنوان «إحصاء المحارف»كلا عددَي المحارف تقديران. يُشتقّ subsetGlyphCount من مصفوفات العرض الظاهرة قرب مدخل الخطّ: تُنتِج مصفوفة /W لخطّ CIDFont محرفًا واحدًا تقريبًا لكل ثلاثية عرض، وتُنتِج مصفوفة /Widths لخطّ بسيط محرفًا واحدًا لكل مدخل رقمي. وعندما لا تظهر أي من المصفوفتين في النافذة، يُطبَّق افتراضي ثابت صغير. وعندما يتعذّر تحديد موضع ورود /BaseFont لبحث النافذة، يكون العدد 0. ويُشتقّ fullGlyphCount من إرشادات اسم العائلة: جدول للعائلات اللاتينية المعروفة، ومجموعة من مؤشّرات أسماء عائلات CJK، وحدّ أدنى عام خلاف ذلك. ولا يُحلَّل برنامج الخطّ المُضمَّن أبدًا. أما الجداول ومقاسات النوافذ والثوابت المحدّدة فهي تفصيل تنفيذي، وغير منشورة، وقد تتغيّر بين الإصدارات.
توليد الخطّة
قسم بعنوان «توليد الخطّة»يُرشِّح generateDesubsetPlan() المُدخَل إلى المدخلات التي isSubset فيها true. ويُسهِم كل هدف بعدد محارفه الناقصة، مضروبًا في ثابت متوسط البايتات لكل محرف، في estimatedSizeIncrease. والخطّة إسقاط لقرارات السعة، لا فرقًا مقيسًا. وتنفيذ الخطّة — أي إعادة كتابة برامج الخطوط — خارج نطاق هذه الوحدة.
الحتمية
قسم بعنوان «الحتمية»السطح بأكمله دالة صرفة لمُدخَله. وتُنتِج البايتات المتطابقة نتائج متطابقة. ولا توجد عشوائية، ولا استدعاء شبكة، ولا وصول إلى نظام الملفات.
الحالات الحدّية وأنماط الإخفاق
قسم بعنوان «الحالات الحدّية وأنماط الإخفاق»- يرفض إنشاء
SubsetInfoالحالات غير الصالحة: فعدد محارف سالب، أو عدد تجزئة يفوق العدد الكامل، يرميInvalidArgumentException. - يمكن أن يُمرِّر
analyzeSubsets()ذلك الاستثناء في حالة ركنية واحدة: خطّ يطابق اسمه عائلة معروفة لكن مصفوفة عرضه الظاهرة تُنتِج تقدير تجزئة أكبر من رقم العدد الكامل للعائلة. - يعمل الكشف على التمثيل البايتي. فمدخلات
/BaseFontالمُسلسَلة داخل تدفّقات كائنات مضغوطة غير مرئية؛ فَكَّ ضغط تلك التدفّقات قبل الفحص. - المدخلات التي يفصل بين مفتاح
/BaseFontوقيمته فيها فراغ غير المسافة الواحدة تُكتَشف رغم ذلك، لكن بحث النافذة لكل خطّ يُخفق في تحديد موضعها. وتُبلِّغ هذه المدخلات عن ترميزUnknownوعدد محارف تجزئة يساوي0. - تُبلَّغ أسماء PDF التي تستخدم بايتات مهرَّبة بـ
#في صورتها المهرَّبة الخام؛ ولا تُفَكّ شفرة المهرَّبات. - تنطوي أسماء
/BaseFontالمكرّرة في مدخل واحد. وكائنا خطّ متمايزان يتشاركان اسمًا واحدًا غير قابلَين للتمييز لدى هذا الماسح. - لا يُخفق
generateDesubsetPlan()أبدًا على مُدخَل غير مُجزَّأ؛ فالمدخلات التيisSubsetفيها مضبوط علىfalseتُستبعَد ببساطة منtargets. - جميع الأعداد و
estimatedSizeIncreaseإرشادية. لا تعاملها كقيم مقيسة؛ استخدمها للفرز وتخطيط السعة فقط. - لا تجري أي عملية تشفير في هذه الوحدة، ومن ثمّ لا يوجد سلوك خاص بوضع FIPS.
المطابقة
قسم بعنوان «المطابقة»| الادّعاء | المعيار | البند |
|---|---|---|
يطابق كشف التجزئة اصطلاح تسمية التجزئة: وسم من ستّة أحرف كبيرة متبوع بـ+ مُلحَق كبادئة بقيمة BaseFont. | ISO 32000-2:2020 | §9.9.2 |
| يُبلَّغ عن كل اسم تجزئة مميّز باستقلالية، اتّباعًا للتوصية بمعاملة التجزئات المتعدّدة ككيانات منفصلة. | ISO 32000-2:2020 | §9.9.2 |
جميع البنود مُعاد صياغتها؛ ولا يُعيد NextPDF إنتاج النص المعياري. وهذه بيانات قدرات، لا شهادات اعتماد. ولا يحمل NextPDF أي اعتماد ولا يمنح أيًّا منه. وتؤكّد الوحدة كشف اصطلاح التسمية والإبلاغ الحتمي؛ ولا تؤكّد دقّة تقديرات عدد المحارف أو الحجم.
ملاحظات التطوير
قسم بعنوان «ملاحظات التطوير»- ثبِّت عبر
composer require nextpdf/pro:^3. متوفّر منذnextpdf/pro1.9.0؛ والحالي فيnextpdf/pro3.1.0. FontDesubsetterعديم الحالة. أنشئه مرة واحدة وأعِد استخدامه عبر المستندات ومسارات العمل.- زوّد
analyzeSubsets()ببايتات مفكوكة الضغط عندما تهمّ تغطية التجزئة؛ وإلّا فإن قواميس الخطوط المحزومة في تدفّقات الكائنات تفوت. - تفرّع بناءً على
SubsetInfo::isSubsetقبل التصرّف؛ فقائمة النتائج تتضمّن عمدًا خطوطًا غير مُجزَّأة لأغراض الجرد. - استخدم
DesubsetPlan::totalGlyphsNeeded()وestimatedSizeIncreaseلتقرير ما إذا كان إلغاء التجزئة يستحقّ تكلفة حجم الملف قبل الحصول على برامج الخطوط الكاملة. - الفحص خطّي في طول المُدخَل مع عمليات بحث نافذة محدودة لكل خطّ. ولا تخزّن الوحدة شيئًا ولا تبثّ أي قياس عن بُعد.
حدود النشر
قسم بعنوان «حدود النشر»توثّق هذه الصفحة السلوك القابل للرصد خارجيًا وسطح واجهة برمجة التطبيقات العامة المدعوم فقط. أما مسارات مساحات الأسماء الداخلية، وأصناف المساعِدة، وجداول الآليات، وأسماء ملفات كتيّبات التشغيل، وبادئات التذاكر، فخارجة عن النطاق.
انظر أيضًا
قسم بعنوان «انظر أيضًا»- Font Tools (القدرة) — التثبيت، والبدء السريع، وعيّنات سير عمل التخطيط.
- Optimizer — مرجع متعمّق — سطح تقليص الحجم الشقيق، بما في ذلك التحسين المتعلّق بالخطوط.
- وحدة الخطوط في Core — تضمين الخطوط والتجزئة أثناء إنشاء المستند في NextPDF Core.