يمكن أن يحمل نموذجان نفس الحقول ولا يتصرفان بشكل متماثل على الإطلاق. يحتفظ AcroForm بحقوله ككائنات PDF عادية تجلس فوق محتوى الصفحة الحقيقي، لذا يرسمها أي قارئ متوافق. لا يحتفظ نموذج XFA الديناميكي تقريباً بأي شيء كـ PDF: الحقول، والتخطيط، وحتى هندسة الصفحة تعيش في حزمة XML، ويتم إنتاج الصفحات المرئية في وقت الفتح بواسطة محرك تخطيط لم تشحنه Adobe على نطاق واسع إلا هي. قم بتغذية هذا الملف إلى عارض ويب، أو عارض أرشيف، أو مستخرج نصوص ولن تحصل على النموذج. ستحصل على صفحة رمادية واحدة تقرأ "يرجى الانتظار... إذا لم يتم استبدال هذه الرسالة في النهاية بالمحتويات المناسبة للمستند، فقد لا يتمكن عارض PDF الخاص بك من عرض هذا النوع من المستندات." أي شخص قام بإدخال أوراق حكومية أو أوراق تأمين يعرف هذه الصفحة بمجرد رؤيتها
العنصر النائب ليس فساداً (corruption). هذا بالضبط ما يحدده التنسيق أنه يجب أن يحدث في حالة عدم وجود معالج XFA، واعتباراً من عام 2026، يصف هذا كل عارض تقريباً خارج Acrobat لسطح المكتب. لذا فإن الخطوة العملية هي تحويل النموذج الديناميكي إلى AcroForm عادي قبل أن يصل إلى أي شيء في المراحل النهائية (downstream). يقوم HotPDF، مكتبة losLab PDF لـ Delphi و C++Builder، بإجراء هذا التحويل في التعليمات البرمجية، وإعادة بناء نموذج XML كحقول أصلية على صفحات أصلية
لماذا لا يمكن للنموذجين التعايش
تم تعريف AcroForm في ISO 32000-1 §12.7. كل حقل هو كائن PDF مع تعليق توضيحي للأداة وتيار مظهر، والصفحة عبارة عن محتوى PDF حقيقي، والبيانات تركب فوقه. يعكس XFA ذلك: النموذج هو مستند XML، حزمة XDP مخزنة في إدخال /XFA لقاموس AcroForm، وتحتوي صفحات PDF الخاصة بالنموذج الديناميكي على العنصر النائب "يرجى الانتظار" ولا شيء غير ذلك، لأن المحتوى الحقيقي لم يتم تسلسله أبداً كـ PDF. يعالج القارئ الملف كنموذج أو آخر. تجاهل إدخال /XFA وسترى الغلاف الفارغ؛ احترمه بدون محرك XFA وسترى التحذير. أنهى ISO 32000-2 الجدل من خلال إسقاط XFA من PDF 2.0، وهو السبب الرئيسي وراء تحول "التحويل بينما لا يزال بإمكاننا" من حالة حافة (edge case) إلى سياسة استيعاب (intake policy) روتينية
قبل تحويل أي شيء، قم بتصنيفه، لأنه ليس كل ملف XFA يعرض العنصر النائب. تشحن نماذج XFA الثابتة صفحات PDF معروضة مسبقاً بجوار XML، لذا فهي تُعرض في كل مكان ولا تسيء التصرف إلا عند تعبئتها. تشحن النماذج الديناميكية العنصر النائب بمفرده وتكون غير قابلة للاستخدام حتى يتم تحويلها. الشيء الذي يجب الوثوق به هو المستند، وليس الامتداد أو المرسل أبداً. الملف الذي يعرض محتوى حقيقياً في عارض غير تابع لـ Adobe ومع ذلك لا يزال يحمل إدخال /XFA هو ملف ثابت أو هجين؛ الملف الذي يعرض صفحة التحذير هو ديناميكي. سجل الدلو الذي هبط فيه كل ملف إدخال (intake file). ينكسر النوعان بطرق مختلفة لاحقاً، ويتم إغلاق تذكرة حول نموذج مؤرشف فارغ في ثوانٍ عندما يقرأ سجل الإدخال بالفعل "dynamic XFA, converted, 47 fields mapped, 2 warnings" (XFA ديناميكي، تم التحويل، تم تعيين 47 حقلاً، تحذيران)
تحويل مستند XFA محمل إلى حقول أصلية
يعمل التحويل مقابل مستند موجود بالفعل في الذاكرة. يوزع FlattenLoadedXFA قالب XFA وحزم البيانات الخاصة به، ويخطط النموذج، ويعيد بناءه كحقول AcroForm على صفحات PDF حقيقية:
var
Pdf: THotPDF;
MappedCount, I: Integer;
Warnings: TStrings;
begin
Pdf := THotPDF.Create(nil);
try
Pdf.LoadFromFile('dynamic_xfa.pdf');
MappedCount := Pdf.FlattenLoadedXFA(True); // True = fields stay editable
Warnings := Pdf.XFAFlattenWarnings;
for I := 0 to Warnings.Count - 1 do
Log('XFA flatten warning: ' + Warnings[I]); // unmapped elements
Pdf.SaveLoadedDocument('native_acroform.pdf');
Log(Format('Mapped %d fields', [MappedCount]));
finally
Pdf.Free;
end;
end;
القيمة المرتجعة وقائمة التحذير هي مخرجات، وليست ضوضاء تصحيح (debug noise)، لذا احتفظ بكليهما. يفقد التحويل المعلومات بطبيعته: لا تحتوي البرمجة النصية لـ XFA، والحقول المحسوبة، وسلوك النموذج الفرعي (subform) الديناميكي على نظير لـ AcroForm، ويسمي XFAFlattenWarnings كل عنصر قالب لم يتم تعيينه. قم بأرشفة الملف المحول دون قائمة التحذير الخاصة به وفي يوم من الأيام سوف تحدق في مربع مجاميع فارغ في نسخة مؤرشفة مع عدم وجود سجل يوضح السبب. تتحكم علامة Editable فيما إذا كانت الحقول الجديدة تظل قابلة للتعبئة. مرر True عندما يستمر الأشخاص في العمل مع النموذج بعد ذلك، واقفل القيم عندما يكون الهدف سجلاً مجمداً
يعد التحقق من التحويل جزءاً مرئياً وجزءاً هيكلياً، وأنت بحاجة إلى كلا النصفين. النصف الهيكلي سهل: تأكد من تطابق عدد الحقول مع MappedCount. النصف المرئي هو الذي يكتشف الضرر الحقيقي. افتح النموذج المصدر في Acrobat لسطح المكتب، وهو لا يزال العارض الوحيد الذي يدير محرك XFA، بجانب الملف المحول في قارئ عادي، وقارن القيم والتخطيط في عينة واحدة مملوءة على الأقل لكل قالب. التاريخ الذي عرضه محرك XFA كـ 2026-06-11 يمكن أن يهبط في نسخة AcroForm كقيمة خام غير منسقة، وعيناك فقط هي التي ستلتقط ذلك
عندما يكون الإدخال حزمة XDP
لا تبدأ كل وظيفة من ملف PDF معبأ. في بعض الأحيان تتلقى حزمة XDP بمفردها، تم تصديرها من أداة تصميم النماذج أو تم تسليمها بواسطة نظام شريك. يسقط ApplyXFAAsAcroForm خطوة التحميل ويطبق الحزمة مباشرة على المستند الحالي:
XDPBytes := TFile.ReadAllBytes('benefit-claim.xdp');
MappedCount := Pdf.ApplyXFAAsAcroForm(XDPBytes, True);
نفس المجموعة من الاستدعاءات تعمل أيضاً في الاتجاه الآخر، للحالة الأكثر ندرة حيث يجب عليك إصدار (emit) XFA بدلاً من استهلاكه. يرفق AddXFAPacket الحزم الفردية المسماة مثل 'xdp' أو 'config'. يقوم SetXFADocument بتثبيت حمولة (payload) كاملة أحادية الدفق (single-stream) في استدعاء واحد. يمسح ClearXFAPackets التسجيل حتى تتمكن من البدء من جديد، ويضمن AddXFASignaturePacket مادة XAdES لسير العمل الذي يوقع بيانات نموذج XML مباشرة. يعد إنتاج XFA في عام 2026 حاجة متخصصة (niche need)، يفرضها دائماً تقريباً مستهلك قديم واحد يرفض أي شيء آخر، ولكن عندما يسميه العقد، فإن هذه الاستدعاءات تبقيه كخيار تكوين بدلاً من أداة منفصلة
المعنى الآخر لـ "تسوية" (flatten)
كلمة "تسوية" (flatten) تربك الكثير من المحادثات، لأنها تسمي عملية ثانية بالكامل: حرق مظاهر حقل AcroForm في تيار محتوى الصفحة حتى لا يتبقى أي كائنات تفاعلية. ليس لدى HotPDF واجهة برمجة تطبيقات لذلك اليوم، وتريد معرفة ذلك الآن بدلاً من منتصف المشروع. ما تمنحك إياه المكتبة بدلاً من ذلك هو القفل على مستوى الحقل عند إنشاء الحقل، مدعوماً بأذونات المستند:
// Lock the value at field creation: read-only text field
Pdf.CurrentPage.AddTextField('CaseNumber', 'BC-2026-0117',
Rect(50, 700, 220, 720), 0, [ffReadOnly]);
// Belt and suspenders: restrict form filling document-wide
Pdf.ActivateProtection := True;
Pdf.CryptKeyLength := aes256;
Pdf.OwnerPassword := 'records-owner';
Pdf.ProtectOptions := [prPrint, prInformationCopy, prExtractContent];
// fill permission withheld: prFillAnnotations is absent from the set
كن واضحاً بشأن ما يوفره لك ذلك وما لا يوفره. الحقل للقراءة فقط لا يزال كائن نموذج. يظهر في لوحة الحقل بالعارض، وقيمته قابلة للقراءة من خلال واجهة برمجة تطبيقات النموذج، ويمكن لأداة تعيد كتابة الملف أن تمسح علامة القراءة فقط مرة أخرى. ترفع علامات الأذونات (Permission flags) الشريط ولكنها تعتمد على اختيار العارض لاحترامها، وهو قيد ينص عليه ISO 32000-1 بوضوح. عندما يصر منظم (regulator) على ألا يحتوي السجل المؤرشف على كائنات نموذج على الإطلاق، فإن الإجابة الصادقة مع HotPDF اليوم هي إعادة بناء المستند: اقرأ القيم، ثم ارسمها كمحتوى TextOut عادي في صفحة جديدة، بدلاً من تزيين علامات القراءة فقط كتسوية. أحد الأشياء التي يجب تذكرها في مسار الأذونات هو أنه يجب تعيين CryptKeyLength قبل BeginDoc؛ الباقي موجود في مقالنا حول تشفير AES-256 والأذونات
ماذا يعني XFA لمطابقة الأرشيف
يرفض كل من PDF/A و PDF/X XFA صراحةً. وبالتالي، يجب أن يقوم خط الأنابيب الذي يغذي أرشيف ISO 19005 بالتحويل أولاً، والترتيب غير قابل للتفاوض: التحميل، و FlattenLoadedXFA، والحفظ، ثم تشغيل إنشاء الأرشيف أو التحقق على نتيجة AcroForm. لا تعامل التحويل كدليل على المطابقة (compliance). إنه يصلح نموذج النموذج (form model) ويترك الخطوط واللون والبيانات الوصفية كما كانت تماماً، لذا تحقق من صحة الإخراج باستخدام veraPDF قبل أن تثق به. بمجرد أن يصبح النموذج في جانب AcroForm، يحصل سلوكه على مجموعة الضوابط الخاصة به. تتم تغطية مشغلات JavaScript، وإجراءات الإرسال، والنصوص البرمجية للتحقق في مقال حقول وإجراءات AcroForm الخاص بـ HotPDF
يتم شحن واجهات برمجة تطبيقات تسجيل XFA، والتحويل، والنموذج الموضحة هنا مع مكون HotPDF لـ Delphi و C++Builder، والذي تتتبع وثائقه مجموعة ميزات XFA كما نمت عبر الإصدارات الحديثة