|
یک packet نامدار XFA (XML Forms Architecture) را برای صدور در ورودی /XFAِ AcroForm سند ثبت میکند. PDF 1.7 §12.7.6 + §12.7.8 به AcroForm اجازه میدهد یک آرایهٔ /XFA را در کنار آرایهٔ ایستا /Fields، یا بهجای آن، حمل کند و این کار گردشکارهای ترکیبی AcroForm + XFA یا فرمهای XFA کاملاً پویا را ممکن میسازد
سینتکس دلفی:
procedure AddXFAPacket(const PacketName: AnsiString; const XMLBytes: TBytes);
procedure ClearXFAPackets;
function XFAPacketCount: Integer;
توضیح
هر بار فراخوانی AddXFAPacket یک packet نامدار ثبت میکند. نامهای معمول (طبق XFA 3.3 specification و PDF 1.7 §12.7.8 Table 234):
template - چیدمان فرم + اسکریپتها (بزرگترین packet در بیشتر سندهای XFA)
datasets - پیوند داده (بار XMLی که template بر پایهٔ آن رندر میشود)
config - پیکربندی نمایشگر
connectionSet - اتصالهای دادهٔ بیرونی
localeSet - قواعد قالببندی وابسته به locale
stylesheet - سبکدهی XSLT یا CSS
xfdf - لایهٔ دادهٔ فرم XFDF
xmpmeta - فرادادهٔ XMP
signature - دادهٔ XFA مرتبط با امضا
sourceSet - تعریفهای دادهٔ سمت منبع
در EndDoc هر packet ثبتشده به یک شیء جریان غیرمستقیمِ فشردهشده با FlateDecode تبدیل میشود و آرایهٔ /XFAِ AcroForm در ترتیب ثبت، رشتههای نام packet را با ارجاعهای جریان یکیدرمیان میچیند، بنابراین چیدمان byte-deterministic است. ClearXFAPackets همهٔ packetهای ثبتشده را حذف میکند (برای استفادهٔ دوباره از یک نمونهٔ THotPDF در چند سند مفید است). XFAPacketCount شمار فعلی را برمیگرداند
فقط پشتیبانی در سطح ظرف
HotPDF XMLِ XFA را تجزیه نمیکند، موتور چیدمان پویای XFA را پیادهسازی نمیکند، FormCalc یا JavaScript داخل templateِ XFA را اجرا نمیکند و ساختار template را اعتبارسنجی نمیکند. خودِ فراخواننده XMLِ XFA را مینویسد (معمولاً با Adobe LiveCycle Designer یا با دستنویسی بر پایهٔ XFA 3.3 specification) و HotPDF bytes را همانطور که هستند صادر میکند
خوانندههای مصرفکنندهای که موتور XFA دارند (Acrobat / Reader قدیمی، FormsCentral، بعضی محصولات kiosk) فرم را رندر میکنند؛ خوانندههایی که موتور XFA ندارند (Adobe Reader DC از 2017 بهبعد، بیشتر خوانندههای متنباز) در صورت گردشکار ترکیبی AcroForm + XFA، فیلدهای fallbackِ AcroForm را نمایش میدهند
دروازههای انطباق PDF/A و PDF/X
ISO 19005-1 §6.4.2 / ISO 19005-2 §6.4.2 / ISO 19005-3 §6.4.2 همگی صراحتاً فرمهای XFA را ممنوع میکنند (موتور چیدمان پویا بهطور قطعی قابل بایگانی نیست). گردشکارهای prepress در ISO 15930 فرمهای تعاملی را بهطور کامل رد میکنند. AddXFAPacket با هر PDFACompliance یا PDFXCompliance غیرخالی و با ارجاع spec مربوطه فوراً خطا میدهد. نامهای packet تکراری خطا میدهند. PacketName خالی یا XMLBytes خالی خطا میدهد. RequirePDFVersion(pdf15) نسخهٔ سند را خودکار بالا میبرد
صدور دیکشنری AcroForm
دیکشنری AcroForm وقتی صادر میشود که یا /Fields حداقل یک ورودی داشته باشد یا دستکم یک packet XFA ثبت شده باشد. فراخوانندههای پیش از v2.119.51 که هیچ packetی ثبت نمیکنند، خروجی /AcroForm byte-identical را حفظ میکنند
گردشکار معمول (فرم پویا و صرفاً XFA)
PDF.BeginDoc;
TemplateBytes := TFile.ReadAllBytes('form-template.xml');
DataBytes := TFile.ReadAllBytes('form-data.xml');
PDF.AddXFAPacket('xdp:xdp', BytesOf('<xdp:xdp xmlns:xdp="http://ns.adobe.com/xdp/">'));
PDF.AddXFAPacket('template', TemplateBytes);
PDF.AddXFAPacket('datasets', DataBytes);
PDF.AddXFASignaturePacket(SigBytes); { caller-generated XAdES }
PDF.AddXFAPacket('/xdp:xdp', BytesOf('</xdp:xdp>'));
PDF.EndDoc;
XDP wrapper، XFA تکجریانی، پویا و امضاشده
فرم آرایهٔ /XFA باید با packetهای wrapperِ xdp:xdp آغاز و پایان یابد، همانطور که مثال اکنون نشان میدهد (ISO 32000-1 §12.7.8). APIهای مرتبط XFA: SetXFADocument کل سند XFA/XDP را بهصورت یک جریان /XFA واحد مینویسد و با AddXFAPacket ناسازگار است؛ XFANeedsRendering پرچم /NeedsRenderingِ Catalog را تنظیم میکند (ISO 32000-1 §7.7.2) تا خواننده در نخستین باز شدن، فرم XFA پویا را دوباره تولید کند؛ AddXFASignaturePacket یک امضای XAdES / XML-DSig تولیدشده توسط فراخواننده را بهصورت packet signature جاسازی میکند. HotPDF هرگز امضا را تولید یا تجزیه نمیکند - خودِ فراخواننده آن را با یک کتابخانهٔ رمزنگاری XML روی datasetsِ XFA تولید میکند
تختسازی XFA به AcroForm
ApplyXFAAsAcroForm bytesِ XDP/XFA ارائهشده توسط فراخواننده را روی صفحهٔ جاری بهصورت widgetهای بومی AcroForm و گرافیک سادهٔ صفحه نگاشت میکند. FlattenLoadedXFA همین تبدیل را برای یک PDF بارگذاریشده که از قبل یک packet تعبیهشدهٔ /XFA دارد انجام میدهد. برای read-only کردن widgetهای تولیدشده Editable=False را پاس کنید و عناصر قابل نگاشتننبودن را در XFAFlattenWarnings بررسی کنید
همچنین ببینید: پشتیبانی AcroForm, THotPDF.RegisterAcroFormFont, THPDFPage.AddTextField
|