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

ما يعرفه ملف PDF عن نفسه: البيانات الوصفية وحزمة XMP

Spec: ISO 16684-1:2019Spec: ISO 32000-2

افتح ملف ⁨PDF⁩ حديثاً وقد يخبرك عن نفسه مرتين. ثمة قائمة مفتاح/قيمة قديمة صغيرة تُسمّى قاموس معلومات المستند، وقد توجد كتلة من ⁨XML⁩ — حزمة ⁨XMP⁩ — تقول الشيء نفسه تقريباً في صورة أغنى ومنظَّمة. هذه الصفحة عن هذين النظامين المتوازيين، ولماذا ينجو كلاهما، ولماذا تصرّ خطوط أنابيب الأرشفة والبحث على اتفاقهما.

الإجابة المختصرة عن العنوان: يعرف ملف ⁨PDF⁩ عنوانه ومؤلفه وموضوعه وكلماته المفتاحية والأداة التي صنعته ومتى. ويخزّن تلك المعرفة في موضعين دفعة واحدة، والهندسة المثيرة في إبقائهما صادقين.

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

لذلك حين يختلف النظامان — يقول قاموس المعلومات مؤلفاً وتقول حزمة ⁨XMP⁩ مؤلفاً آخر — يلتقط شيء ما في مرحلة لاحقة واحداً منهما، ولا يحق لك اختيار أيهما. قد يُظهِر فهرس البحث العنوان الخاطئ. وقد يرفض مدقِّق أرشفة الملف تماماً. يظل الانحراف غير مرئي حتى يتعثر فيه خط أنابيب، وهو أسوأ وقت لاكتشافه.

  • يستطيع ملف ⁨PDF⁩ حمل البيانات الوصفية في نظامين متوازيين: قاموس معلومات المستند القديم وحزمة XMP الحديثة من RDF/⁨XML⁩.
  • تُلَفّ حزمة ⁨XMP⁩ في تعليمة معالجة xpacket — ترويسة begin وخاتمة end — كي تستطيع أداة العثور عليها، وفي مكانها، حتى إعادة كتابتها دون إعادة تحليل الملف كله.
  • تستقر الخصائص في مساحات أسمائية: dc (Dublin Core) للعنوان والمنشئ، وxmp لتاريخَي الإنشاء والتعديل، وpdf للمنتِج، وxmpMM لهوية المستند وسجله التاريخي.
  • يشترط ⁨PDF⁩/A بيانات XMP الوصفية، ويجب أن تطابقها مدخلات DocInfo التي لها مكافئ XMP — الاختلاف إخفاق تحقق.
  • يعامل ⁨NextPDF⁩ الاثنين عملاً واحداً: فهو يكتب كليهما، ويقرأ XMP مجدداً، ويحرس حجم الحزمة، فيفشل مغلقاً بدلاً من إصدار ملف مشوَّه التكوين.

التأطير الصادق هو أن هذه مشكلة مزامنة متنكّرة في صورة مشكلة تنسيق. قاموس معلومات المستند (Spec: ISO 32000-2, §14.3.3)، المُشار إليه من الخاتمة بمدخل /Info، قائمة سلاسل مسطَّحة: Title وAuthor وSubject وKeywords وCreator وProducer وتاريخان. بسيط، ويسبق ⁨XML⁩، ولا يزال يستقلّ في كل ملف تقريباً لأن أدوات كثيرة لا تزال تقرؤه أولاً.

حزمة ⁨XMP⁩ (Spec: ISO 16684-1:2019, §7) هي النصف الحديث. إنها مستند ⁨XML⁩ — RDF/⁨XML⁩ على وجه الدقة — يَنمذِج الملف بوصفه مجموعة خصائص مسماة مجمَّعة في مخطَّطات، كل مخطَّط مربوط بمساحة أسمائية (Spec: ISO 16684-1:2019, §6). تلك البنية هي ما لا يستطيعه القاموس المسطَّح: يمكن أن تكون القيمة قائمة مرتَّبة، أو بديلاً موسوماً بلغة (“عنوان بالإنجليزية، عنوان بالفرنسية”)، أو سجلاً منظَّماً. في ملف ⁨PDF⁩، يستقر ذلك الـ⁨XML⁩ في دفق بيانات وصفية مرفق بفهرس المستند (Spec: ISO 32000-2, §14.3.2)، وهو الموضع النموذجي الذي ينظر فيه القارئ الحالي.

ثلاث تفاصيل تستحق التشريح، لأنها حيث تُخطئ الأدوات الحزمة.

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

المساحات الأسمائية. تكون الخاصية ذات معنى فقط مقابل مساحتها الأسمائية، وحفنة منها شبه عالمية. يحمل Dublin Core (dc) العنوان والمنشئ. ويحمل مخطَّط ⁨XMP⁩ الأساسي (xmp) تاريخَي الإنشاء والتعديل وأداة التأليف. ويحمل مخطَّط ⁨PDF⁩ (pdf) سلسلة المنتِج والكلمات المفتاحية. ويحمل مخطَّط إدارة الوسائط (xmpMM) هوية المستند وسجل اشتقاقه — الأثر الذي يقول “جاء هذا الملف من ذاك”. الاتفاق على معرّفات المساحات الأسمائية تلك وأسماء الخصائص — التي تُعرَض عادةً ببادئات اصطلاحية — هو كل غرض المخطَّطات الأساسية (Spec: ISO 16684-1:2019, Annex B)؛ أداتان تتحدثان كلتاهما خاصية عنوان Dublin Core تتعاملان دون ترتيب مسبق.

قاعدة الاتساق. لأن النظامين يستطيعان تسمية الخاصية نفسها، يمكنهما أن يختلفا. ترفض ملفات الأرشفة السماح بذلك. يجب أن يحمل ملف ⁨PDF⁩/A دفق بيانات وصفية XMP، وأي مدخل معلومات مستند له مكافئ XMP يجب أن يطابقه؛ والاختلاف إخفاق تحقق. والخلاصة العملية مباشرة: في خط أنابيب أرشفة، ليس الاثنان حقلين مستقلين بل حقيقة واحدة مكتوبة مرتين، وعليهما البقاء متناسقين.

يتولّى ⁨NextPDF⁩ الثلاثة جميعاً همّاً واحداً. تدفق البيانات الوصفية مسار واحد، لا مساران متنافسان.

  1. Collect the values onceTitle, author, subject, keywords, creator, producer and dates are set on the document a single time, so there is one source of truth, not two.
  2. Write the Info dictionaryThe DocInfo writer emits the legacy Title, Author, Subject, Keywords, Creator, Producer and date entries that older tools read first.
  3. Build the XMP packetThe XMP builder serializes the same values as RDF/XML under dc, xmp, pdf and xmpMM, wrapped in the xpacket header and trailer with writable padding.
  4. Guard the packet sizeBefore serialization is accepted, the engine checks the packet against a size bound and fails closed with a typed exception rather than emit a malformed or oversized stream.
  5. Read XMP back to verifyThe XMP reader parses the packet so a pipeline can confirm the engine wrote the metadata it was given — the kind of check an archival validator builds on.
كيف يبقي NextPDF نظامَي البيانات الوصفية لمستند متناسقين: تُكتَب مجموعة قيم واحدة إلى كلٍّ من قاموس المعلومات وحزمة XMP، وتُحرَس الحزمة بقيد حجم قبل تسلسلها، ويمكن قراءة الحزمة نفسها مجدداً كي يؤكد خط أنابيب أن البيانات الوصفية تسلسلت كما قُصِد.

الشكل أدناه يضبط البيانات الوصفية مرة واحدة ويدع المحرك يوزّعها على النظامين، ثم يقرأ عنوان ⁨XMP⁩ مجدداً كي يستطيع خط أنابيب فحصه. حارس الحجم هو السطر الذي يحوّل “على الأرجح بخير” إلى “مرفوض على نحو مُثبَت إذا لم يكن كذلك”.

<?php
declare(strict_types=1);
use NextPDF\Core\Document;
use NextPDF\Metadata\Exception\XmpPacketTooLargeException;
$document = Document::createStandalone();
// Set the values ONCE. The engine writes them to both the Info dictionary
// and the XMP packet, so the two systems cannot drift apart at the source.
$document->setTitle('Annual Report 2026');
$document->setAuthor('Records Office');
$document->setSubject('Statutory annual filing');
$document->setKeywords('annual report, statutory, 2026');
try {
// Building the document serializes the XMP packet. The engine guards the
// packet size and fails closed: a packet that exceeds the bound is a
// typed exception, never a silently truncated or malformed stream.
$bytes = $document->getPdfData();
} catch (XmpPacketTooLargeException $e) {
// Decide deliberately: trim the metadata, not the guarantees.
error_log('XMP packet exceeded the size bound: ' . $e->getMessage());
throw $e;
}
// Read the packet back. This confirms the XMP the engine serialized carries the
// value you set — the kind of integrity check an archival pipeline runs before
// it trusts the file. (Both systems are written from one source, so they agree
// by construction; reading the XMP back proves it serialized as intended.)
$xmp = $document->readXmpMetadata($bytes);
$xmpTitle = $xmp->get('dc', 'title'); // 'Annual Report 2026'
if ($xmpTitle !== $document->getTitle()) {
throw new \RuntimeException('XMP title does not match the value that was set.');
}

لا يوجد هنا مسار يتباعد فيه النظامان بهدوء: تدخل القيم مرة واحدة، ويستهلك كلا الكاتبين المصدر نفسه، ويتيح القارئ لخط أنابيب فحص النتيجة.

الاعتقاد المتكرر هو أن قاموس المعلومات بائد ويمكنك تجاهله. لا تستطيع — ليس بعد. لا يزال قدر كبير من البرمجيات المثبَّتة، بما فيها بعض معاينات ملفات أنظمة التشغيل وأدوات الأرشفة الأقدم، يقرأ قاموس المعلومات أولاً أو حصراً. إسقاطه لا يحدّث ملفاً؛ بل يجعل الملف يبدو بلا عنوان لأي شيء لم يتبنَّ ⁨XMP⁩.

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

  • يكتب ⁨NextPDF⁩ كلا النظامين ويقرأ XMP مجدداً. نطاقه هو باني بيانات XMP الوصفية، وكاتب DocInfo، وقارئ XMP. لا يَعِد بأن يكون محرك استعلام RDF/⁨XML⁩ عام الغرض.
  • حزمة XMP محروسة بقيد حجم وتفشل مغلقة. الحزمة التي تتجاوز قيد المحرك تثير استثناءً مصنَّفاً. لن يصدر المحرك حزمة مبتورة أو مُحشّاة فوق الحد أو مشوَّهة التكوين على نحو آخر كي “يُلائم” طلباً مفرط الحجم.
  • يُفرَض الاتساق وقت الكتابة من مصدر واحد؛ وليس مصالحةً سحرية لملف لم تنتجه. إن استوردت مستنداً يختلف نظاماه أصلاً، فحلّ ذلك قرارك، لا إعادة كتابة ضمنية.
  • متطلبات البيانات الوصفية لـ⁨PDF⁩/A جزء من ملف الأرشفة. تشرح هذه الصفحة القاعدة؛ أما حكم المطابقة فيعود إلى مدقِّق، كما هو الحال دائماً في عمل الأرشفة. راجع صفحة الأرشفة لذلك الحدّ.

باني البيانات الوصفية، وكاتب DocInfo، وقارئ XMP قدرات أساسية. المؤهِّل الصادق يكمن مع حارس الحجم، أدناه.

Metadata: Info dictionary and XMP packet — edition availability
EditionAvailability
Core

يُشحَن باني بيانات ⁨XMP⁩ الوصفية، وكاتب قاموس معلومات المستند، وقارئ ⁨XMP⁩ في ⁨Core⁩، مع حارس الحجم الذي يفشل مغلقاً على حزمة مفرطة الحجم — بما في ذلك مُخرَج مطابقة ⁨PDF/A⁩ والتحقق اللذان يجعلان دفق بيانات ⁨XMP⁩ الوصفية إلزامياً ويشترطان تطابق ⁨DocInfo⁩ معه.

Pro

يضيف سير عمل بيانات وصفية دفعياً وبالقوالب فوق كاتب ⁨Core⁩ وقارئه نفسيهما.

Enterprise

يضيف سياسة المطابقة الأوسع وسطح التقارير عبر منظومة مستندات.

  • قاموس معلومات المستند — البيانات الوصفية القديمة المسطَّحة بمفتاح/قيمة المُشار إليها من الخاتمة بمدخل /Info: Title وAuthor وSubject وKeywords وCreator وProducer وتواريخ. يسبق ⁨XMP⁩؛ ولا يزال يُقرَأ على نطاق واسع.
  • XMP — منصة البيانات الوصفية القابلة للتوسيع، تنسيق ⁨XML⁩ (RDF/⁨XML⁩) لوصف مورد بخصائص مسماة مجمَّعة في مخطَّطات. مُعيَّر بوصفه ISO 16684-1.
  • xpacket — تعليمة المعالجة التي تلفّ حزمة ⁨XMP⁩، بترويسة begin (علامة ترميز) وخاتمة end (عَلَم للقراءة فقط أو قابل للكتابة)، كي تستطيع أداة تحديد موضع الحزمة وتحريرها دون تحليل كامل.
  • المساحة الأسمائية / المخطَّط — مفردات خصائص مسماة مربوطة بمعرّف. بادئات شائعة: dc (Dublin Core)، وxmp (XMP أساسي)، وpdf (خاص بـ⁨PDF⁩)، وxmpMM (إدارة وسائط / هوية مستند).
  • دفق البيانات الوصفية — كائن ⁨PDF⁩، المرفق بفهرس المستند، الذي يحمل حزمة ⁨XMP⁩. الموضع النموذجي الذي يفحصه القارئ الحديث أولاً.
  • ⁨PDF⁩/A — عائلة ملفات أرشفة ⁨PDF⁩ (ISO 19005). تشترط دفق بيانات وصفية XMP وتُطالب بأن يطابقه أي مدخل معلومات مستند له مكافئ XMP، وإلا فشل التحقق.