مقاله فنی

خروجی PDF/A، PDF/X و PDF/UA در دلفی: راهنمای HotPDF

استانداردهای PDF/A، PDF/X و PDF/UA سه استاندارد متفاوت هستند که سه مشکل متفاوت را حل می‌کنند: بایگانی بلندمدت، تبادل چاپ، و قابلیت دسترسی. آنها سه چک‌باکس در یک فرمِ انطباق نیستند، و رایج‌ترین اشتباه این است که با آنها طوری رفتار شود که گویی چنین هستند. یک فایل می‌تواند یک PDF/A بی‌نقص باشد اما برای یک چاپخانه بی‌فایده باشد؛ یک فایل مَستر چاپ کامل می‌تواند برای یک صفحه‌خوان (screen reader) غیرقابل خواندن باشد. بدتر از آن، هر سه مورد محدودیت‌هایی بر روی ساختار داخلی فایل هستند، نه بر روی ظاهر آن. سندی که در هر نمایشگری که دارید به تمیزی باز می‌شود، باز هم می‌تواند در اولین تلاش در اعتبارسنجی شکست بخورد، و معمولاً هم چنین می‌شود

ابزار HotPDF، کتابخانه بومی VCL PDF متعلق به losLab، انطباق را به عنوان چیزی در نظر می‌گیرد که پیش از وجود داشتن صفحه اول، آن را اعلام می‌کنید. شما یک ویژگی انطباق (compliance) را تنظیم می‌کنید، ساختارهایی را که استاندارد نیاز دارد ضمیمه می‌کنید، و کتابخانه در زمان ذخیره‌سازی از پیکربندی‌هایی که در تضاد با پروفایل هستند امتناع می‌ورزد. این مدل بهتری نسبت به تولید یک فایل و امیدواری به اینکه یک پردازشگر-پسین (post-processor) بتواند آن را اصلاح و مقاوم‌سازی کند است، زیرا بیشترِ آنچه که این استانداردها نیاز دارند را نمی‌توان پس از وقوع، اضافه کرد

سه استاندارد ISO، سه وعده متفاوت

استاندارد PDF/A (همان ISO 19005) در مورد زمان است. این استاندارد وعده می‌دهد که یک فایل دهه‌ها بعد نیز دقیقاً به همان شکل رندر خواهد شد، بنابراین خواهان استقلالِ کامل (self-containment) است: هر فونتی جاسازی (embed) شده باشد، به هر رنگ از طریق یک OutputIntent معنای مستقل از دستگاه (device-independent) داده شده باشد، متادیتا (فراداده) XMP کامل باشد، و ممنوعیت هر چیزی که رفتار آن به محیط وابسته است. رمزگذاری و جاوا اسکریپت حذف می‌شوند، زیرا هیچ‌کس نمی‌تواند تضمین کند که ابزار رمزگشا یا موتور اسکریپت در سال 2050 وجود خواهد داشت

استاندارد PDF/X (همان ISO 15930) در مورد رنگ روی کاغذ است. این استاندارد وجود دارد تا یک طراح بتواند فایلی را به یک چاپخانه تحویل دهد که هیچ‌کدام نیازی به بحث درباره آن نداشته باشند، که به معنای شرایط چاپِ توصیف‌شده، کلید اجباری /Trapped، هندسه تعریف‌شدهِ برش (trim) و حاشیه (bleed)، و در نسخه X-1a، عدم وجود شفافیت زنده (live transparency) است تا RIP نیازی به حدس زدن نداشته باشد. استاندارد PDF/UA (همان ISO 14289) در مورد این است که چه کسی می‌تواند نتیجه را بخواند. تکنولوژی‌های کمکی به یک درخت برچسبِ کامل (tag tree)، یک ترتیب خواندن منطقی، یک زبان سندِ اعلام‌شده، و جایگزین‌های متنی برای هر چیزی که متن نیست، نیاز دارند

از آنجایی که این سه به سمت مسیرهای متفاوتی می‌کشند، استاندارد حاکم را به ازای هر کانال خروجی انتخاب کنید، به جای آنکه به دنبال فایلی باشید که همه آنها را راضی کند. یک مستر چاپِ فقط-CMYK، دقیقاً چیز اشتباهی برای تحویل دادن به کاربر یک صفحه‌خوان (screen reader) است که هرگز رنگ را نمی‌بیند، و قفل شدن پروفایلِ بایگانی بر روی رفتارهای پویا، با هر چیز تعاملی (interactive) تضاد دارد. فایل‌ها را برای هر کانال از همان داده‌های منبع تولید کنید و به این ترتیب از کل این درگیری دور می‌مانید

خروجی PDF/A: کلید OutputIntent بخشی است که همه فراموش می‌کنند

اگر یک فایل PDF/A در اعتبارسنجی شکست می‌خورد، OutputIntent اولین چیزی است که باید بررسی شود. این همان ساختاری است که سازندگان اغلب از آن می‌گذرند، دقیقاً به این دلیل که هیچ چیزِ قابل مشاهده‌ای به آن وابسته نیست. استاندارد ISO 19005 یکی را می‌طلبد: یک پروفایل ICC جاسازی‌شده که معنای واقعی رنگ‌های دستگاهِ سند را مشخص می‌کند. ابزار HotPDF آن پروفایل را به جای اینکه به عنوان یک فکرِ پسین (afterthought) در نظر بگیرد، به یک ورودی صریح تبدیل می‌کند:

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 ترکیب نکنید؛ یک فایل بایگانی رمزگذاری‌شده تناقضی است که اعتبارسنج (validator) بلافاصله متوجه آن می‌شود. تعداد مؤلفه‌ها (component count) در AddPDFAOutputIntent باید با پروفایل مطابقت داشته باشد، که برای یک پروفایل RGB مانند sRGB IEC61966-2.1 عدد 3 و برای CMYK عدد 4 است. ابزار HotPDF همزمان با نوشتن، استفاده از DeviceRGB و DeviceCMYK را در برابر intent اعلام‌شده ردیابی می‌کند، بنابراین یک پُرکردگی (fill) سرگردان CMYK در سندی با intent بر پایه RGB، به جای اینکه یک مشکل پنهان باشد، به یک مشکلِ گزارش‌شده تبدیل می‌شود

نکته‌ای که ارزش گفتن درباره پروفایل ICC را دارد: با آن مانند یک آرتیفکت استقرار نسخه‌دار رفتار کنید، نه فایلی که شخصی زمانی در سرور ساخت (build server) رها کرده است. بایت‌های آن در هر سندی که تولید می‌کنید جاسازی می‌شود، بنابراین یک پروفایل ناقص یا خراب، بی‌سروصدا کل یک دسته را مسموم می‌کند، و شما فقط در زمان اعتبارسنجی متوجه می‌شوید. آن را با نصب‌کننده خود ارسال کنید، چِک‌سام (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;

تعداد مؤلفه‌ها در حال حاضر برای پروفایل ماشین چاپ CMYK عدد 4 است. پروفایل X-1a همچنین شفافیت زنده (live transparency) را ممنوع می‌کند، بنابراین هر کد رسم (drawing) که عناصر نیمه‌شفاف را لایه‌بندی می‌کند، بازرسی کنید؛ هر چیزی که یک نمایشگر روی صفحه ترکیب (composite) می‌کند، دقیقاً همان چیزی است که یک RIP از تفسیر آن خودداری خواهد کرد. هنگامی که چاپخانه شما مشخصات متفاوتی را ارسال می‌کند، بایت‌های پروفایل و رشته شناسه را تعویض کنید، اما ساختار اطراف را به حال خود رها کنید

استاندارد PDF/UA: ساختار تولید می‌شود، هرگز به صورت پسین اضافه نمی‌شود

قابلیت دسترسی (Accessibility) استانداردی است که تیم‌ها اغلب سعی می‌کنند در انتها آن را به زور وصله کنند، و این رویکرد را سخت‌تر از دو مورد دیگر مجازات می‌کند. درخت برچسب باید ترتیبی را که محتوا به صورت منطقی ایجاد شده است منعکس کند، که اطلاعاتی است که پس از نوشتن فایل، شما به سادگی دیگر ندارید. تنظیم PDFUACompliance خروجی برچسب‌گذاری شده (tagged output) را روشن می‌کند، و API ساختار، هر فراخوانیِ رسم (drawing call) را در حین پیشروی به نقش معناییِ آن پیوند می‌دهد:

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 رسم شده است. به طور کامل رندر می‌شود و برای صفحه‌خوان نامرئی می‌ماند، بنابراین هیچ تست‌کننده بینایی هرگز متوجه آن نمی‌شود؛ باگ همراه با نسخه نهایی ارسال می‌شود و تنها زمانی ظاهر می‌گردد که یک کاربر واقعی تکنولوژی‌های کمکی به این شکاف برخورد کند. زمانی که قالب‌های شما نام نقشِ ساختاریِ سفارشی (custom structure role names) را به همراه دارند، آنها را با متد AddStructRoleMap('MyHead', 'H1') روی مجموعه استاندارد نگاشت کنید تا خواننده‌های منطبق با استاندارد بدانند معنی آنها چیست. استاندارد ISO 14289 همچنین به یک زبانِ اعلام‌شده نیاز دارد. زمانی که Lang خالی است، ابزار HotPDF به صورت برگشت‌پذیر از 'en' استفاده می‌کند، اما این یک شبکه ایمنی است، نه دلیلی برای اینکه زبانِ واقعیِ سند را تنظیم‌نشده رها کنید

اعتبارسنجی: به اعتبارسنج اعتماد کنید، نه به نمایشگر

نمایشگری که فایل شما را باز می‌کند، هیچ چیز را در مورد انطباق ثابت نمی‌کند، بنابراین اعتبارسنجی به مسیر انتشار و در کنار ابزارهایی تعلق دارد که ساختار را بررسی می‌کنند نه رندر را. برای PDF/A و PDF/UA، ابزار veraPDF اعتبارسنج باز و مرجع (reference-grade) است؛ این ابزار شکست‌ها را بر اساس بندِ ISO گزارش می‌کند، که مستقیماً به پیکربندی بالا بازمی‌گردد. برای PDF/X، پروفایل‌های Preflight مربوط به Adobe Acrobat هنوز یک بررسی عملی هستند، زیرا انطباقِ مطبوعاتی به همان اندازه که در مورد سینتکس (نحو) است، در مورد هدف رنگ (color intent) نیز هست

تولیدکننده (generator) سهم خودش را از این موضوع انجام می‌دهد. در زمان ذخیره‌سازی، ابزار HotPDF فلگ‌های ویژگی (feature flags) را در برابر نسخه PDF پیکربندی شده تطبیق می‌دهد، و بدون سر و صدا آنچه را که نسخه نمی‌تواند بیان کند تنزل می‌دهد، مانند رمزگذاری AES-256 که برای نسخه‌های پایین‌تر از PDF 1.7 به AES-128 کاهش می‌یابد. دروازه‌های انطباق در EndDoc فراتر می‌روند و در تناقضات سخت، به طور مستقیم استثنا (raise) ایجاد می‌کنند، مانند درخواستِ PDFACompliance به همراه رمزگذاری. هیچکدام از اینها جایگزین اعتبارسنجِ خارجی نمی‌شوند. آنها فقط جلوی رسیدن پیکربندی‌های غیرممکن را به آن می‌گیرند

یک عادت به طور مکرر نتیجه می‌دهد: کل سیستمِ انطباق را به عنوان یک واحد نسخه‌گذاری کنید. نسخه منتشر شده HotPDF، ریویژنِ (revision) قالب، چِک‌سامِ پروفایل ICC، و بیلد (build) اعتبارسنجی که تأیید را انجام داد. به محض اینکه هر یک از آنها در زیر مجموعه سایرین تغییر کند، انطباق دچار انحراف می‌شود، و زشت‌ترین ممیزی‌ها آنهایی هستند که هیچ‌کس نمی‌تواند بازسازی کند که چه ترکیبی، یک فایل آرشیوِ پنج ساله را تولید کرده است. یک رکورد پیکربندی منفرد به ازای هر دسته (batch)، این مسئله را برای همیشه حل می‌کند

در نهایت، اعتبارسنج را بر روی خروجی‌های واقعیِ پروداکشن (production) اجرا کنید، نه هرگز بر روی یک نمونه مرتبِ دست‌ساز. شکست‌هایی که آزاردهنده هستند از داده‌هایی ناشی می‌شوند که هیچ‌کس پیش‌بینی نمی‌کرد: لوگوی مشتری که به صورت CMYK وارد می‌شود در حالی که intent می‌گوید RGB، تغییری در قالب که باعث عبورِ یک فونتِ جاسازی نشده می‌شود، مسیر کد جدیدی که متن را در خارج از درختِ برچسب (tag tree) رسم می‌کند. یک فایل که می‌دانید خراب (known-bad) است را از حوادث گذشته به عنوان یک ورودیِ رگرسیون نگه دارید تا دروازه انطباق در طول زمان صادق بماند. برای بخش رندر کردنِ این خطوط لوله، به مقاله ما در مورد خروجی گزارش، فونت‌ها، و تصاویر با HotPDF مراجعه کنید؛ و برای متصل کردنِ اعتبارسنج‌ها به یک سیستم ساخت (build)، یک مطلب تکمیلی در مورد خودکارسازی بررسی‌های پیش از پرواز (preflight) برای PDF وجود دارد

ویژگی‌های انطباق، اهداف خروجی (output intents) و API برچسب‌گذاری (tagging API) استفاده شده در این مثال‌ها به همراه کامپوننت HotPDF برای دلفی و C++Builder عرضه می‌شوند؛ صفحه محصول لینکِ مرجعِ کاملِ هر فراخوانی را که در اینجا نشان داده شده است در بر دارد