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

Pro الإصدار

‏⁨Writer⁩ — مرجع متعمّق

تكتب وحدة ⁨Writer⁩ مراجعات التحديث التزايدي لملفات ⁨PDF⁩ وتحزم الكائنات الصغيرة في ⁨Object Streams⁩. ويفرض الكاتب التزايدي قاعدة إلحاق-فقط فاشلة-الإغلاق: كل بايت احتفظ به المخزن المؤقت قبل مراجعةٍ ما يجب أن يبقى دون تغيير بعدها. ويجمّع باني ⁨Object Stream⁩ الكائنات المؤهَّلة في كائن /Type /ObjStm واحد مضغوط بـ⁨FlateDecode⁩ ضمن حجم محدود.

تُشحَن هذه القدرة في ‏⁨NextPDF Pro⁩ (nextpdf/pro) وتُفعَّل بمظروف ترخيص من فئة ⁨Pro⁩. والنشر دون ذلك الاستحقاق لا يحمّل أصناف هذه القدرة. قارن الإصدارات واحصل على ترخيص. لا توجد علامة ترخيص لكل ميزة؛ فالشيفرة تُشحَن مع إصدار ⁨Pro⁩.

سطح واجهة برمجة التطبيقات العامة

قسم بعنوان «سطح واجهة برمجة التطبيقات العامة»

تقع الوحدة ضمن مساحة الأسماء NextPDF\Pro\Writer. وجميع الرموز العامة مدرَجة أدناه. وكائنات القيمة أصنافٌ ثابتة من نوع final readonly.

الرمزالمعاملاتالسلوك الافتراضيالقيمة المُرجَعةيرفع أو يفشل بـملاحظات
IncrementalUpdateWriter::writeRevisionBinaryBuffer $buffer, ObjectRegistry $registry, int $prevXrefOffset, int $catalogObject, array $catalogEntries, array $catalogUpdates, array $newObjectNumbers, string $fileIdثابت. يعيد كتابة الفهرس بمُدخَلات مدموجة، ويُلحِق جدول إحالة مرجعية تقليديًا للكائنات الجديدة والمعدَّلة، ويكتب مُذيَّلًا بـ/Size و/Root و/Prev و/ID. ويتحقّق بعدها من أن بادئة ما-قبل-المراجعة متساوية بايتيًا.int — إزاحة بايت جدول الإحالة المرجعية الجديد\NextPDF\Exception\WriterException عند فشل فحص بادئة الإلحاق-فقط؛ ويُرجِع getWriterState() القيمة dss-append-only-invariantنقطة دخول ثابتة. لا مخرَج قابل للاستخدام عند الانتهاك.
ObjectStreamWriter::addObjectint $objectNumber, string $contentيُلحِق كائنًا واحدًا بالتدفّق المعلَّق بعد فحص حجم.voidOverflowException عندما يتجاوز الفهرس مع الجسم مجتمعَين 65,536 بايتًايستثني $content غلافَي N 0 obj / endobj.
ObjectStreamWriter::canAcceptstring $contentيقدّر عبء الفهرس ويختبر المجموع الجاري مقابل الحدّ الأقصى.boolلا يرفع استثناءًمُسنِد صرف؛ دون تغيير حالة.
ObjectStreamWriter::buildلا شيءيبني الفهرس، ويسلسل الأجسام، ويضغط بـ⁨FlateDecode⁩، ويلفّ قاموس /Type /ObjStm.string — محتوى ⁨Object Stream⁩ الخامObjectStreamWriteException عند عدم إضافة أي كائنات، أو عند فشل ضغط ⁨zlib⁩يُسنِد المُستدعي رقم الكائن ويلفّ العلامات.
ObjectStreamWriter::getEntriesلا شيءيعيد حساب الإزاحات النسبية للجسم للكائنات المتراكمة.list<ObjectStreamEntry>لا يرفع استثناءًالإزاحات نسبية إلى قسم الجسم.
ObjectStreamWriter::countلا شيءيُبلِغ عن عدد الكائنات المتراكمة.intلا يرفع استثناءً
ObjStmCompressor::__constructint $maxStreamSize = 65536, int $maxObjectsPerStream = 200يخزّن حدَّي الحجم وعدد الكائنات المستخدَمَين في التجميع.لا يرفع استثناءًتطابق القيم الافتراضية ضبط ⁨Object Stream⁩ في الوحدة.
ObjStmCompressor::groupObjectslist<array{number: int, generation?: int, content: string}> $objectsيرشّح الكائنات غير المؤهَّلة، ثم يحزم الباقي في كتّاب ضمن حدَّي الحجم والعدد.list<ObjectStreamWriter>لا يرفع استثناءً؛ وتُتخطّى الكائنات غير المؤهَّلةتسقط الكائنات ذات الجيل غير الصفري إلى التسلسل العادي.
ObjStmCompressor::isEligiblestring $content, int $generation = 0يرفض كائنات التدفّق و/Encrypt و/XRef و/Catalog وأي جيل غير صفري.boolلا يرفع استثناءًمطابقة /Type متسامحة مع المسافات البيضاء وهروب #xx.
ObjStmCompressor::writeToBufferlist<ObjectStreamWriter> $streams, BinaryBuffer $buffer, ObjectRegistry $registryيخصّص كائن حامل لكل تدفّق، ويسجّل مُدخَلات مضغوطة من النوع-2، ويكتب كل كتلة ⁨ObjStm⁩.list<int> — أرقام الكائنات الحاملةينشر ObjectStreamWriteException من build() عند فشل ضغط نادريُشغَّل بعد كتابة الكائنات غير المؤهَّلة وقبل إصدار الإحالة المرجعية.
ObjStmCompressor::estimateSavingslist<ObjectStreamWriter> $streams, int $originalSizeيبني كل تدفّق لقياس الحجم المضغوط مقابل الأصلي.ObjStmCompressionResultينشر ObjectStreamWriteException من build() عند فشل ضغط نادرمساعد قياس للقراءة فقط.
ObjectStreamEntry::__constructint $objectNumber, string $content, int $offsetسجلّ ثابت لكائن محزوم واحد وإزاحة جسمه.لا يرفع استثناءًfinal readonly؛ خصائص عامة.
ObjStmCompressionResult::__constructint $originalObjectCount, int $streamCount, int $estimatedOriginalSize, int $estimatedCompressedSizeحاوية مقاييس ثابتة.لا يرفع استثناءًfinal readonly؛ خصائص عامة.
ObjStmCompressionResult::savedBytesلا شيءيُرجِع الحجم الأصلي ناقص المضغوط.intلا يرفع استثناءًقد يكون سالبًا عندما يوسّع الحزم البيانات.
ObjStmCompressionResult::savedPercentلا شيءيُرجِع نسبة التخفيض المئوية.floatلا يرفع استثناءًيُرجِع 0.0 عندما يكون الحجم الأصلي صفرًا.
ObjStmCompressionResult::compressionRatioلا شيءيُرجِع الحجم المضغوط على الأصلي.floatلا يرفع استثناءًيُرجِع 1.0 عندما يكون الحجم الأصلي صفرًا.
ObjectStreamWriteExceptionيشير إلى فشل بناء ⁨Object Stream⁩.يمدّد RuntimeExceptionيُرفَع من build()؛ ويمكن التقاطه عبر RuntimeException للتوافق الخلفي.
final class IncrementalUpdateWriter
{
public static function writeRevision(
BinaryBuffer $buffer,
ObjectRegistry $registry,
int $prevXrefOffset,
int $catalogObject,
array $catalogEntries,
array $catalogUpdates,
array $newObjectNumbers,
string $fileId,
): int;
}
final class ObjectStreamWriter
{
public function addObject(int $objectNumber, string $content): void;
public function canAccept(string $content): bool;
public function build(): string;
/** @return list<ObjectStreamEntry> */
public function getEntries(): array;
public function count(): int;
}
final class ObjStmCompressor
{
public function __construct(
int $maxStreamSize = 65536,
int $maxObjectsPerStream = 200,
);
/**
* @param list<array{number: int, generation?: int, content: string}> $objects
* @return list<ObjectStreamWriter>
*/
public function groupObjects(array $objects): array;
public function isEligible(string $content, int $generation = 0): bool;
/**
* @param list<ObjectStreamWriter> $streams
* @return list<int>
*/
public function writeToBuffer(array $streams, BinaryBuffer $buffer, ObjectRegistry $registry): array;
/** @param list<ObjectStreamWriter> $streams */
public function estimateSavings(array $streams, int $originalSize): ObjStmCompressionResult;
}

يكتب writeRevision مراجعة تحديث تزايدي واحدة. ويلتقط لقطة لبادئة المخزن المؤقت القائمة قبل الكتابة. ويعيد كتابة الفهرس بمُدخَلات مدموجة، ويسجّل إزاحات الكائنات الجديدة، ويكتب جدول إحالة مرجعية تقليديًا مجمَّعًا في أقسام فرعية متجاورة، ويكتب مُذيَّلًا بـ/Size و/Root و/Prev و/ID. وبعد الكتابة، يقارن البادئة مرّة أخرى. وإن تغيّر أي بايت سابق، يرفع WriterException حاملًا حالة انتهاك الإلحاق-فقط ولا يُرجِع مخرَجًا قابلًا للاستخدام. وعند النجاح يُرجِع إزاحة بايت جدول الإحالة المرجعية الجديد لتسلسل مراجعات إضافية. ويُسمَح بخلط جداول الإحالة المرجعية وتدفّقاتها عبر المراجعات.

يراكِم ObjectStreamWriter الكائنات. ويرفع addObject خطأ تجاوز عندما يتجاوز الفهرس والجسم مجتمعَين الحدّ الأقصى البالغ 65,536 بايتًا غير مضغوطة. ويرفع build خطأً عند تدفّق فارغ؛ وإلّا فإنه يضغط الفهرس مع الجسم ويُرجِع محتوى ⁨Object Stream⁩ بمُدخَلات /Type /ObjStm و/N و/First و/Length و/Filter /FlateDecode. ويُسنِد المُستدعي رقم الكائن ويلفّ علامتَي N 0 obj / endobj.

يقرّر ObjStmCompressor أي الكائنات يُحزَم. وهو يستثني كائنات التدفّق، وقواميس التشفير، وتدفّقات الإحالة المرجعية، وفهرس المستند، وأي كائن يحمل رقم جيل غير صفري. ويخصّص writeToBuffer كائنًا حاملًا لكل تدفّق، ويسجّل كل كائن محزوم كمُدخَل إحالة مرجعية مضغوط من النوع-2، ويكتب كتلة ⁨ObjStm⁩ عند الإزاحة الحالية للمخزن المؤقت. ويبني estimateSavings كل تدفّق لحساب مقاييس الحجم دون تعديل المخزن المؤقت.

الحالات الحدّية وأوضاع الفشل

قسم بعنوان «الحالات الحدّية وأوضاع الفشل»
  • ينسخ فحص الإلحاق-فقط البادئة القائمة. وتنمو كلفته مع حجم المستند المكتوب بالفعل. وهذه الكلفة مقصودة وتحمي البايتات الموقَّعة.
  • يسري حدّ ⁨Object Stream⁩ على الفهرس غير المضغوط مع الجسم. ضَع قاموس التشفير وسائر أنواع الكائنات المستثناة كائناتٍ غير مباشرة مباشِرة.
  • استثناء /Type متسامح مع أي مسافات بيضاء بين الرموز ومع هروب #xx الست عشري. فالصيغ مثل /Type /Encrypt و/Type\n/Encrypt و/Type /#45ncrypt كلها مرفوضة، وليست الكتابة الحرفية القانونية وحدها.
  • أي كائن يحمل رقم جيل غير صفري يُعامَل بوصفه غير مؤهَّل ويسقط إلى التسلسل العادي N G obj … endobj، لأن جيل الكائن المضغوط صفرٌ ضمنًا.
  • يجب أن يُشغَّل writeToBuffer بعد كتابة جميع الكائنات غير المؤهَّلة وقبل إصدار الإحالة المرجعية. ويجب ألّا تُسلسَل الكائنات المحزومة على حدة أيضًا.

لا تؤدّي وحدة ⁨Writer⁩ أي عمليات تشفير. وهي تحمي البايتات الموقَّعة برفض الإصدار عندما يتغيّر بايت سابق، وهو اختبار تساوٍ بايتي لا اختبار تشفيري. ووحدة التوقيع هي ما يحكم اختيار خوارزمية ⁨FIPS⁩ للتوقيع والتجزئة، لا هذا الكاتب. ولا يغيّر تفعيل وضع ⁨FIPS⁩ أو تعطيله سلوك أي طريقة من طرائق ⁨Writer⁩.

تنفّذ ⁨NextPDF⁩ الوحدة وفق ⁨ISO 32000-2:2020⁩. ويتّبع الكاتب التزايدي قواعد التحديث التزايدي في §⁨7.5.6⁩: تُلحِق كل مراجعة قسم إحالة مرجعية يغطّي الكائنات الجديدة أو المتغيّرة أو المحذوفة فقط، ومُذيَّلًا يعطي مُدخَله /Prev إزاحة الإحالة المرجعية السابقة. ويتّبع باني ⁨Object Stream⁩ نموذج تدفّق الكائنات في §⁨7.5.7⁩: فهرسٌ من أزواج رقم-الكائن والإزاحة، بإزاحات تُقاس من مُدخَل /First بترتيب تصاعدي، يسبق أجسام الكائنات المحزومة. وقد جرى التحقّق من مرجعَي البندين كليهما مقابل متن ⁨ISO 32000-2:2020⁩. ويتّبع تسلسل المراجعات لسير عمل ⁨PAdES B-LT⁩ و⁨B-LTA⁩ المعيار ⁨ETSI EN 319 142-1⁩ §⁨5.4⁩، كما هو مُعلَّق في المصدر. ودعم بندٍ ما تصريحُ قدرة هندسية لا شهادة اعتماد؛ ولا تحمل ⁨NextPDF⁩ أي شهادة مطابقة رسمية.

  • ثبّت الحزمة بـcomposer require nextpdf/pro:^3. وتُحَل الأصناف ضمن NextPDF\Pro\Writer.
  • IncrementalUpdateWriter::writeRevision نقطة دخول ثابتة؛ ولا يحمل حالة نسخة بين المراجعات.
  • تشكّل ObjectStreamEntry وObjStmCompressionResult وIncrementalUpdateWriter والضاغط معًا السطح العام للوحدة؛ ولا يشحن المستودع أي مثال قابل للتشغيل لها.
  • يشير WriterException الصادر من writeRevision إلى انتهاك الإلحاق-فقط. عامِله بوصفه فشلًا صارمًا واطرح المخزن المؤقت.
  • الكائنات الحاملة لـ⁨Object Stream⁩ كائنات غير مباشرة؛ ويُسنِد المُستدعي أرقام كائناتها عبر السجلّ.

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