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

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 مميّز، مُجزَّأ أو غير مُجزَّأ، مؤشَّرًا بـisSubsetlist<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()لا شيءيستخرج الوسم المكوّن من ستّة أحرف من fontNamestringسلسلة فارغة عندما لا يكون مُجزَّأً أو عندما يقع + بعيدًا عن الموضع السادس
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): DesubsetPlan
public 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(): float
public 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/pro ⁨1.9.0⁩؛ والحالي في nextpdf/pro 3.1.0.
  • FontDesubsetter عديم الحالة. أنشئه مرة واحدة وأعِد استخدامه عبر المستندات ومسارات العمل.
  • زوّد analyzeSubsets() ببايتات مفكوكة الضغط عندما تهمّ تغطية التجزئة؛ وإلّا فإن قواميس الخطوط المحزومة في تدفّقات الكائنات تفوت.
  • تفرّع بناءً على SubsetInfo::isSubset قبل التصرّف؛ فقائمة النتائج تتضمّن عمدًا خطوطًا غير مُجزَّأة لأغراض الجرد.
  • استخدم DesubsetPlan::totalGlyphsNeeded() وestimatedSizeIncrease لتقرير ما إذا كان إلغاء التجزئة يستحقّ تكلفة حجم الملف قبل الحصول على برامج الخطوط الكاملة.
  • الفحص خطّي في طول المُدخَل مع عمليات بحث نافذة محدودة لكل خطّ. ولا تخزّن الوحدة شيئًا ولا تبثّ أي قياس عن بُعد.

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