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

Pro الإصدارالاستقرار: تجريبي

حالة قدرة معاينة C2PA

حالة قدرة معاينة. غير متوفّرة عامًا أبدًا. تذكر هذه الصفحة ما يفعله سطح ⁨C2PA⁩ اليوم بوصفه معاينة. وهي ليست ادّعاء مطابقة، ولا اعتمادًا، ولا عبارةً بأن ⁨NextPDF⁩ يُنتج ملفات موقَّعة بـ ⁨C2PA⁩. والسطح معاينة ولا يُوصَف أبدًا بأنه متوفّر عامًا.

يكشف ⁨NextPDF Pro⁩ عن سطح معاينة لاعتمادات المحتوى (⁨C2PA⁩) عبر C2paCapabilityStatus. وهذه الصفحة هي الحدّ الصادق لذلك السطح: ما هو متوفّر دائمًا، وما يبقى خلف عَلَم مسوّد اختياري، ولماذا لا يُقدَّم أي ادّعاء بالحالة النهائية.

طبقتان: وصلة مستقرّة مقابل توليف مُبوَّب

قسم بعنوان «طبقتان: وصلة مستقرّة مقابل توليف مُبوَّب»

للسطح طبقتان مفصولتان بوضوح، والتمييز بينهما هو كامل المقصد من الحدّ:

  • متوفّرة دائمًا — الوصلة المستقرّة. يشكّل ManifestStore وواجهة C2paManifestEmbedder وصلةً مُجمَّدة محايدة المورِّد. ويمكنهما حمل مخزن بيان في الاتجاهين: يكتب embed() بايتات مخزن قدّمه المُستدعي في ⁨PDF⁩، ويُحلِّل extract() مخزنًا خارجًا منه (مُعيدًا null عند عدم وجود أي منها). وهذه الوصلة لا تُولِّف أي ادّعاء — فهي لا تُجمِّع تأكيدات أو ادّعاءات بنفسها؛ بل تنقل ManifestStore معتمًا يملكه المُستدعي بالفعل.
  • خلف العَلَم الاختياري — توليف الادّعاء. أما بناء مخزن بيان فعليًّا (تجميع الادّعاء وتأكيد تجزئة المُكوِّن) فيقع فقط في ExperimentalC2paEmbedder، مُبوَّبًا خلف عَلَم بيئة مُعطَّل افتراضيًا. وهذا هو الجزء ذو الشكل المسوّد، الذي يتغيّر دون إشعار.

فالعبارة الدقيقة هي: الاستخراج وحمل البايتات قابلان للوصول دائمًا؛ وتوليف محتويات البيان قابل للوصول فقط عند تفعيل عَلَم المعاينة صراحةً.

القرار الحامل يفصل وصلة نقل مستقرّة عن مسار التوليف المتقلّب، لا مُضمِّنًا واحدًا يفعل كل شيء. فملف ⁨C2PA-PDF⁩ لا يزال تملكه مجموعة عمل خارجية وهو غير مُجمَّد. وصندوق توقيع الادّعاء فيه (c2cs، بنية ⁨COSE_Sign1⁩) هو الجزء الأكثر احتمالًا للانحراف. لذا يُغفِل التوليف ذلك الصندوق ويقع خلف عَلَم مُعطَّل افتراضيًا، بينما لا يعتمد الاستخراج والحمل على أي حقل غير مُجمَّد ويبقى قابلًا للوصول للجميع. ويكشف كائن الحالة النضج كبيانات، مع ترميز generallyAvailable وconformanceClaimed بصلابة على false، بحيث لا يخلط المُستدعون نيّة المُنتِج بنتيجة مُتحقَّق منها. ويتيح ذلك الفصل للفرق تبنّي الوصلة الدائمة الآن وإضافة محوِّل موقَّع لاحقًا، دون أي وعد بتنسيق سلكي لا يستطيع ⁨NextPDF⁩ الوفاء به بعد.

خلفية التصميم: المطابقة التي يمكنك تسليمها لمُدقِّق.

يُبلِغ C2paCapabilityStatus عن حالة السطح صراحةً كبيانات، لا نثرًا. وخاصّيتاه generallyAvailable وconformanceClaimed مُرمَّزتان بصلابة على false وتبقيان false بصرف النظر عن العَلَم؛ وتفعيل المعاينة يقلب فقط previewEnabled. ورمز maturity هو التسمية غير المُدَّعية preview-draft، ويُسجِّل specPin التزام المسودّة المُثبَّت. ويقرأ المُستدعي “معاينة”، لا “موقَّع ومُتحقَّق منه”.

use NextPDF\Pro\Compliance\C2pa\C2paCapabilityStatus;
// Reads the env flag live; performs no I/O.
$status = C2paCapabilityStatus::current();
$status->previewEnabled; // bool — true only if the opt-in env flag is set
$status->generallyAvailable; // false (always)
$status->conformanceClaimed; // false (always)
$status->maturity; // 'preview-draft'
$status->specPin; // '4e2afed8' (pinned draft commit, short)
$status->envGate; // 'NEXTPDF_FEATURE_PREVIEW_C2PA_DRAFT'
echo $status->summary();
// "C2PA preview-draft surface is present but switched off;
// the C2PA-PDF profile is not yet final."

تُديم مواصفة ⁨C2PA⁩ مجموعةُ عمل خارجية، والملف الذي سيستهدفه ⁨NextPDF⁩ غير مُجمَّد. ولأن الملف غير مُجمَّد، تمتنع المعاينة عمدًا عن أي ادّعاء بالحالة النهائية. وعندما يستقرّ ملف مجموعة العمل، فإن حالة السطح — لا تسويقه — هي ما سيتغيّر.

الخيار الاختياري متغيّر بيئة عملية واحد، NEXTPDF_FEATURE_PREVIEW_C2PA_DRAFT. يُقرَأ حيًّا ويُقارَن بصرامة بالسلسلة "1" — وأي قيمة أخرى (بما في ذلك 0 أو true أو yes أو السلسلة الفارغة أو الغياب) تُعامَل على أنها مُعطَّلة. ولا يُفعِّله ترخيص ⁨Pro⁩ وحده؛ بل يجب على المُشغِّل أن يختار الانضمام بوعي.

// Opt in for the current process BEFORE constructing the embedder.
putenv('NEXTPDF_FEATURE_PREVIEW_C2PA_DRAFT=1');
use NextPDF\Pro\Compliance\C2pa\Experimental\ExperimentalC2paEmbedder;
$embedder = new ExperimentalC2paEmbedder();
// Synthesise a draft-shaped Manifest Store binding the host PDF by SHA-256.
$pdfBytes = file_get_contents('input.pdf');
$store = $embedder->buildManifestStore($pdfBytes, 'my-app/1.0.0');
// The result is an opaque ManifestStore; $store->toBytes() is its serialisation.

في نشر حقيقي، اضبط العَلَم عند الإقلاع (لا عبر putenv() في وقت التشغيل)، وبوِّبه على انضمام بشري صريح، وتحقّق من حالة القدرة قبل لمس المُضمِّن التجريبي بحيث لا يُبلَغ مسار المسودّة إلا عن قصد.

use NextPDF\Pro\Compliance\C2pa\C2paCapabilityStatus;
use NextPDF\Pro\Compliance\C2pa\Experimental\ExperimentalC2paEmbedder;
// Set NEXTPDF_FEATURE_PREVIEW_C2PA_DRAFT=1 in the environment at process boot.
$status = C2paCapabilityStatus::current();
if (!$status->previewEnabled) {
// Flag off: do NOT instantiate the experimental embedder — its
// constructor would throw. Fall back to your non-preview path.
return;
}
// Surface the draft pin to the operator. The bytes are transient:
// re-embed once a stable adapter ships. Run `composer c2pa:draft-status`
// in CI to fail the build if the pinned snapshot goes stale.
$pinnedDraft = ExperimentalC2paEmbedder::SPEC_PIN_SHA; // 4e2afed8…
$pinnedDate = ExperimentalC2paEmbedder::SPEC_PIN_DATE; // 2026-04-26
$embedder = new ExperimentalC2paEmbedder();
$store = $embedder->buildManifestStore($pdfBytes, 'my-app/1.0.0');

الإغلاق الآمن عند إيقاف العَلَم

قسم بعنوان «الإغلاق الآمن عند إيقاف العَلَم»

لا يوجد ارتداد صامت. إذا أُنشئ ExperimentalC2paEmbedder بينما NEXTPDF_FEATURE_PREVIEW_C2PA_DRAFT ليس "1" بالضبط، يطرح المُنشئ LogicException تذكر رسالته العَلَم ومتغيّر البيئة و⁨SHA⁩/تاريخ المسودّة المُثبَّت. ولا يمكن لمُستدعٍ أن يُسلسِل بايتات ذات شكل مسوّد في ⁨PDF⁩ إنتاجي بمجرّد حيازته ترخيص ⁨Pro⁩.

ومسار الاستخراج المستقرّ مُغلَق بأمان أيضًا، لكن بصورة مختلفة: يُعيد extract() قيمة null عند عدم وجود مخزن بيان (الحالة الشائعة، تُبقى رخيصةً وخاليةً من الاستثناءات)، ويطرح صنفًا فرعيًا من C2paExceptionJumbfBombException أو JumbfCycleDetectedException أو JumbfDepthExceededException أو MalformedJumbfException — عندما يكون مخزن موجودًا لكنه ينتهك ثوابت التحصين العدائي في المُحلِّل (العمق، والدورة، والحجم، والعدد). وهذه لا تُبتلَع بصمت أبدًا.

اللغة التالية لا تُستخدم لهذا السطح، بحكم السياسة، وينبغي ألّا تظهر في أي وثائق أو واجهة مستخدم أو تسويق مُشتقّ منه:

  • ⁨“C2PA conformant”⁩ أو ⁨“C2PA compliant”⁩.
  • ⁨“C2PA certified”⁩.
  • ⁨“C2PA signed”⁩ كقدرة منجَزة ومُؤكَّدة.
  • ⁨“GA”⁩ / ⁨“generally available”⁩.

ما هو السطح بصدق: وصلة مستقرّة يمكنها تحليل (استخراج) وحمل (تضمين) مخزن بيان ⁨C2PA⁩، بالإضافة إلى مُضمِّن تجريبي مُعطَّل افتراضيًا يُولِّف محتويات بيان ذات شكل مسوّد، وكائن حالة يُبلِغ عن حالة معاينته الذاتية. وما هو ليس: مُنتِجًا لاعتمادات ⁨C2PA⁩ موثَّقة وقابلة للتحقّق. وتحديدًا، يُغفِل المُضمِّن التجريبي عمدًا صندوق توقيع الادّعاء (c2cs) — وهو جزء ⁨COSE_Sign1⁩ من المواصفة الأكثر احتمالًا للانحراف — فحتى مع تفعيل العَلَم، تكون المُخرجات بايتات غير موقَّعة ذات شكل مسوّد. وملف مجموعة العمل غير مُجمَّد؛ والحدّ هو المقصد.

التنسيق السلكي الذي يُصدره المُضمِّن التجريبي مُثبَّت على التزام مسودّة من c2pa-org/specifications (SPEC_PIN_SHA = 4e2afed8…، بتاريخ 2026-04-26)، مكشوف كثابت عام بحيث يمكن للمُستدعين تثبيت الـ ⁨SHA⁩ الذي يتوقّعونه.

الرمزالدور
C2paCapabilityStatusكائن قيمة حالة صادق وقابل للقراءة آليًا. current() يقرأ عَلَم البيئة حيًّا؛ وgenerallyAvailable / conformanceClaimed دائمًا false؛ وsummary() لا يحمل أي ادّعاء توفّر عام/مطابقة.
ManifestStoreكائن قيمة مخزن بيان غير قابل للتغيير. نوع الوصلة المستقرّة؛ يحمل البايتات في الاتجاهين. لا مُوصِّلات على مستوى الادّعاء. متوفّر دائمًا.
C2paManifestEmbedderSPI مُجمَّد محايد المورِّد: embed() / extract(). لا توليف ادّعاء. extract() يُعيد null عند عدم الوجود. متوفّر دائمًا.
ExperimentalC2paEmbedderتوليف مُعطَّل افتراضيًا. buildManifestStore() يُجمِّع بيانًا مسوّدًا؛ ويطرح المُنشئ LogicException ما لم يكن عَلَم البيئة "1" بالضبط.
Feature::PREVIEW_C2PA_DRAFTعَلَم اختياري محصور. ENV_PREVIEW_C2PA_DRAFT = NEXTPDF_FEATURE_PREVIEW_C2PA_DRAFT؛ وisEnabled() صارم === '1'.
  • مُعطَّل افتراضيًا، انضمام صارم. التوليف خلف NEXTPDF_FEATURE_PREVIEW_C2PA_DRAFT، يُقرَأ بصرامة كـ === '1'. وأي شيء آخر مُعطَّل؛ ولا يُفعِّله ترخيص ⁨Pro⁩ وحده.
  • إغلاق آمن وقت الإنشاء. new ExperimentalC2paEmbedder() يطرح LogicException عند إيقاف العَلَم — لا عمليةً صامتةً بلا أثر أبدًا.
  • المُخرجات غير موقَّعة وعابرة. حتى مع تفعيل العَلَم، يُغفَل صندوق توقيع الادّعاء؛ عامِل البايتات على أنها ذات شكل مسوّد وأعِد التضمين بمجرّد شحن محوِّل مستقرّ.
  • فحص قِدَم التثبيت. شغِّل composer c2pa:draft-status (خروج 0 طازج / 1 تحذير ليّن / 2 فشل صارم) في ⁨CI⁩ لاكتشاف متى تقادمت لقطة المسودّة المُثبَّتة.
  • لا حُكم مطابقة. يُبلِغ كائن الحالة عن حالة المعاينة، لا نتيجة مطابقة. ومُتحقِّق خارجي وملف مجموعة عمل مُجمَّد سيكونان شرطين مسبقين لأي نقاش مطابقة، ولا يُفترَض أيٌّ منهما.
  • انضباط اللغة. لا تصف المُخرجات بأنها ⁨“C2PA signed”⁩ أو ⁨“conformant”⁩ أو ⁨“compliant”⁩ أو ⁨“certified”⁩ أو ⁨“GA”⁩. استخدم “حالة قدرة معاينة”.

سطح المعاينة ليس ضابط أمان. وحمل أو توليف مخزن بيان مسوّد ليس كإنتاج أو التحقّق من توثيق — ويُغفِل المُضمِّن التجريبي صندوق توقيع الادّعاء كليًّا، فمُخرجاته غير موقَّعة بنية. لا تعتمد على هذه المعاينة لضمان المصدر في الإنتاج؛ فهي لا تُؤكِّد أن اعتمادًا صالح أو أن ملفًا موقَّع.

لا يقدّم هذا السطح أي ادّعاء مطابقة. تُديم ملف ⁨C2PA⁩ مجموعةُ عمل خارجية وهو غير مُجمَّد؛ ولذلك يذكر ⁨NextPDF⁩ حالة قدرة معاينة وحدّ مسودّة/مجموعة عمل، لا مطابقةً أو اعتمادًا. ولا يُعاد إنتاج أي نص معياري.

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