مقال تقني

مخرجات PDF/A و PDF/X و PDF/UA في Delphi: دليل HotPDF

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

يتعامل HotPDF، مكتبة PDF VCL الأصلية من losLab، مع الامتثال كشيء تعلن عنه قبل وجود الصفحة الأولى. تقوم بتعيين خاصية الامتثال، وإرفاق الهياكل التي يتطلبها المعيار، وترفض المكتبة التكوينات التي تتعارض مع ملف التعريف وقت الحفظ. هذا نموذج أفضل من إنشاء ملف والأمل في أن يتمكن معالج لاحق من تعديله، لأن معظم ما تتطلبه هذه المعايير لا يمكن إضافته بعد وقوع الأمر

ثلاثة معايير ISO، ثلاثة وعود مختلفة

يتعلق PDF/A (ISO 19005) بالوقت. إنه يعد بأن الملف سيظل معروضاً بشكل متطابق بعد عقود من الآن، لذلك يتطلب احتواءً ذاتياً كاملاً: كل خط مضمن، وكل لون يُعطى معنى مستقلاً عن الجهاز من خلال OutputIntent، وبيانات وصفية XMP كاملة، وحظر أي شيء يعتمد سلوكه على البيئة. تم استبعاد التشفير و JavaScript، لأنه لا يمكن لأحد ضمان وجود مفكك التشفير أو محرك البرنامج النصي في عام 2050

يتعلق PDF/X (ISO 15930) باللون على الورق. إنه موجود حتى يتمكن المصمم من تسليم ملف إلى مطبعة دون أن يضطرا للمناقشة، مما يعني ظروف طباعة مميزة، ومفتاح /Trapped إلزامي، وهندسة قص وتجاوز (trim and bleed) محددة، وفي إصدار X-1a، لا يوجد شفافية حية (live transparency) لكي يخمنها RIP. يتعلق PDF/UA (ISO 14289) بمن يمكنه قراءة النتيجة. تحتاج التكنولوجيا المساعدة إلى شجرة وسوم كاملة (tag tree)، وترتيب قراءة منطقي، ولغة مستند معلنة، وبدائل نصية لأي شيء ليس نصاً

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

PDF/A: OutputIntent هو الجزء الذي ينساه الجميع

إذا فشل ملف PDF/A في التحقق من الصحة، فإن OutputIntent هو أول شيء يجب التحقق منه. إنها البنية التي يتخطاها المولدون غالباً، على وجه التحديد لأنه لا يوجد شيء مرئي يعتمد عليها. يتطلب معيار ISO 19005 واحداً: ملف تعريف ICC مضمن يحدد بدقة ما تعنيه ألوان جهاز المستند في الواقع. يجعل HotPDF ملف التعريف هذا مدخلاً صريحاً بدلاً من كونه فكرة لاحقة:

var
  Pdf: THotPDF;
  ICC: TFileStream;
begin
  Pdf := THotPDF.Create(nil);
  try
    Pdf.FileName := 'invoice-archival.pdf';
    Pdf.PDFACompliance := 'B';            // level B: visual fidelity
    Pdf.Lang := 'en-US';
    Pdf.StandardFontEmulation := False;   // embed real fonts, no Base-14 emulation
    ICC := TFileStream.Create('sRGB.icc', fmOpenRead);
    try
      Pdf.AddPDFAOutputIntent('sRGB IEC61966-2.1', '', ICC, 3, 'DeviceRGB');
    finally
      ICC.Free;
    end;
    Pdf.BeginDoc;
    Pdf.CurrentPage.SetFont('Arial', [], 11);
    Pdf.CurrentPage.TextOut(50, 760, 0, 'Archival invoice body');
    Pdf.EndDoc;
  finally
    Pdf.Free;
  end;
end;

بعض التفاصيل تقرر النجاح أو الفشل هنا. يجب إيقاف تشغيل StandardFontEmulation: لا يتم تضمين خطوط Base-14 المُحاكاة، والتضمين غير قابل للتفاوض بموجب معيار ISO 19005. يجب أن يظل التشفير معطلاً، لذلك لا تجمع أبداً بين PDFACompliance و ActivateProtection؛ فملف الأرشيف المشفر هو تناقض يكتشفه المدقق على الفور. يجب أن يتطابق عدد المكونات في AddPDFAOutputIntent مع ملف التعريف، وهو 3 لملف تعريف RGB مثل sRGB IEC61966-2.1 و 4 لـ CMYK. يتتبع HotPDF استخدام DeviceRGB و DeviceCMYK مقابل النية المعلنة أثناء الكتابة، وبالتالي فإن تعبئة CMYK الشاردة في مستند بنية RGB تتحول إلى مشكلة مُبلغ عنها بدلاً من مشكلة صامتة

هناك شيء واحد يستحق القول عن ملف تعريف ICC: تعامل معه كقطعة نشر ذات إصدار، وليس كملف أسقطه شخص ما ذات مرة على خادم البناء. يتم تضمين وحدات البايت الخاصة به في كل مستند تقوم بإنشائه، لذا فإن ملف التعريف المقتطع أو التالف يسمم مجموعة بأكملها بهدوء، ولا تكتشف ذلك إلا في وقت التحقق من الصحة. قم بشحنه مع مثبتك، وسجل المجموع الاختباري الخاص به (checksum) في سجل التشغيل، وقم بتحميله من خلال نمط TFileStream الموضح أعلاه بحيث يفشل الملف المفقود بصوت عالٍ أثناء الإنشاء بدلاً من أن يفشل بصمت عند بوابة الأرشيف

PDF/X للطباعة: Trapped، و CMYK، وملف تعريف المطبعة

تعكس النسخ الرئيسية للطباعة قصة الألوان. تريد المطبعة CMYK مميزاً، ويجعلك المعيار تذكر ما إذا كان قد تم تطبيق التراكب (trapping) حتى عندما تكون الإجابة الصادقة هي أنه ليس لديك أي فكرة. مفتاح /Trapped إلزامي بغض النظر عن ذلك:

Pdf.PDFXCompliance := 'X-1a';
Pdf.Trapped := 'Unknown';        // mandatory key under ISO 15930
ICC := TFileStream.Create('FOGRA39.icc', fmOpenRead);
try
  Pdf.AddPDFXOutputIntent('FOGRA39 (ISO 12647-2:2004)', '', ICC, 4, 'DeviceCMYK');
finally
  ICC.Free;
end;
Pdf.BeginDoc;
// draw with CMYK-safe colors, no transparency, no encryption
Pdf.EndDoc;

عدد المكونات الآن 4 لملف تعريف المطبعة CMYK. يمنع X-1a أيضاً الشفافية الحية (live transparency)، لذا راجع أي كود رسم يضع طبقات من العناصر شبه الشفافة؛ فإن أي شيء يركبه العارض على الشاشة هو بالضبط ما سيرفض RIP تفسيره. عندما ترسل مطبعتك توصيفاً مختلفاً، قم بتبديل بايتات ملف التعريف وسلسلة المعرف ولكن اترك البنية المحيطة كما هي

PDF/UA: يتم إنشاء البنية، ولا يتم تعديلها أبداً

إمكانية الوصول هي المعيار الذي تحاول الفرق في الغالب إضافته في النهاية، وهو يعاقب هذا النهج بقوة أكبر من المعيارين الآخرين. يجب أن تعكس شجرة الوسوم (tag tree) الترتيب الذي تم به إنشاء المحتوى منطقياً، وهي معلومات لم تعد تمتلكها ببساطة بمجرد كتابة الملف. يؤدي تعيين PDFUACompliance إلى تشغيل الإخراج الموسوم (tagged output)، ويربط API البنية كل استدعاء رسم بدوره الدلالي أثناء تقدمك:

Pdf.PDFUACompliance := True;     // auto-enables tagged PDF
Pdf.Lang := 'en-US';             // set explicitly; empty falls back to 'en'
Pdf.BeginDoc;

Root := Pdf.AddStructureElement(sstDocument, nil);
H1 := Pdf.EmitTaggedHeading(1, Root, 50, 700, 'Quarterly Report');
Para := Pdf.BeginTaggedContent('P', Root);
Pdf.CurrentPage.TextOut(50, 650, 0, 'Revenue grew in all regions.');
Pdf.EndTaggedContent;

Pdf.EndDoc;

الفشل الذي يجب الانتباه إليه هو النص المرسوم خارج أي زوج BeginTaggedContent/EndTaggedContent. يتم عرضه بشكل مثالي ويظل غير مرئي لقارئ الشاشة، لذلك لا يكتشفه أي مختبر مبصر أبداً؛ يتم شحن الخطأ ويظهر فقط عندما يصطدم مستخدم فعلي للتكنولوجيا المساعدة بالفجوة. عندما تحمل قوالبك أسماء أدوار بنية مخصصة، قم بتعيينها على المجموعة القياسية باستخدام AddStructRoleMap('MyHead', 'H1') حتى يعرف القراء المتوافقون ما تعنيه. يتطلب معيار ISO 14289 أيضاً لغة معلنة. يتراجع HotPDF إلى 'en' عندما يكون Lang فارغاً، ولكن هذه شبكة أمان، وليست سبباً لترك لغة المستند الحقيقية غير معينة

التحقق من الصحة: ثق في المدقق، وليس العارض

إن العارض الذي يفتح ملفك لا يثبت أي شيء حول الامتثال، لذلك ينتمي التحقق من الصحة إلى مسار الإصدار باستخدام الأدوات التي تتحقق من البنية بدلاً من العرض. بالنسبة لـ PDF/A و PDF/UA، يعد veraPDF المدقق المفتوح المرجعي؛ فهو يبلغ عن الإخفاقات حسب شرط ISO، والذي يعود مباشرة إلى التكوين أعلاه. بالنسبة لـ PDF/X، لا تزال ملفات تعريف Preflight الخاصة بـ Adobe Acrobat هي الفحص العملي، لأن امتثال المطبعة يتعلق بنوايا الألوان بقدر ما يتعلق ببناء الجملة

يقوم المولد بدوره في هذا. في وقت الحفظ، يوفق HotPDF بين علامات الميزات (feature flags) وإصدار PDF الذي تم تكوينه، ويخفض بصمت ما لا يمكن للإصدار التعبير عنه، مثل تراجع AES-256 إلى AES-128 أقل من PDF 1.7. تذهب بوابات الامتثال في EndDoc إلى أبعد من ذلك وتثير أخطاء صريحة عند التناقضات الصعبة، مثل طلب PDFACompliance مع التشفير. لا يحل أي من هذين محل المدقق الخارجي. إنها تمنع فقط التكوينات المستحيلة من الوصول إليه أبداً

تؤتي عادة واحدة ثمارها بشكل متكرر: قم بتعيين إصدار لإعداد الامتثال بأكمله كوحدة واحدة. إصدار HotPDF، ومراجعة القالب، والمجموع الاختباري لملف تعريف ICC، وبناء المدقق الذي تمت الموافقة عليه. ينحرف الامتثال في اللحظة التي يتغير فيها أي منها دون غيره، وأبشع عمليات التدقيق هي تلك التي لا يستطيع فيها أحد إعادة بناء المجموعة التي أنتجت ملف أرشيف عمره خمس سنوات. سجل تكوين واحد لكل دفعة يحسم ذلك إلى الأبد

أخيراً، قم بتشغيل المدقق على مخرجات الإنتاج الحقيقية، وليس على عينة مرتبة مبنية يدوياً. حالات الفشل التي تؤذي تأتي من بيانات لم يتوقعها أحد: شعار عميل يصل كـ CMYK بينما تشير النية إلى RGB، وتعديل في القالب يتسلل في خط غير مضمن، ومسار كود جديد يرسم نصاً خارج شجرة الوسوم. احتفظ بملف واحد معروف بأنه سيئ من كل حادث سابق كمدخل تراجع (regression input) وتظل بوابة الامتثال صادقة بمرور الوقت. للحصول على جانب العرض لخطوط الأنابيب هذه، راجع مقالنا حول مخرجات التقارير والخطوط والصور باستخدام HotPDF؛ لربط المدققين في بناء، يوجد مقال مصاحب حول أتمتة فحوصات PDF preflight

تُشحن خصائص الامتثال، ونوايا الإخراج، و API الوسم المستخدمة في هذه الأمثلة مع مكون HotPDF لكل من Delphi و C++Builder؛ تربط صفحة المنتج المرجع الكامل لكل استدعاء معروض هنا