Ðва ÑоÑмÑлÑÑа Ð¼Ð¾Ð³Ð°Ñ Ð´Ð° ÑÑдÑÑÐ¶Ð°Ñ ÐµÐ´Ð½Ð¸ и ÑÑÑи полеÑа и да Ñе дÑÑÐ¶Ð°Ñ Ð¿Ð¾ коÑенно ÑазлиÑен наÑин. AcroForm ÑÑÑ ÑанÑва ÑвоиÑе полеÑа каÑо обикновени PDF обекÑи, Ñазположени вÑÑÑ Ñ ÑеалноÑо ÑÑдÑÑжание на ÑÑÑаниÑаÑа, Ñака Ñе вÑеки ÑÑвмеÑÑим ÑеÑÐµÑ Ð¼Ð¾Ð¶Ðµ да го визÑализиÑа. ÐинамиÑниÑÑ XFA ÑоÑмÑлÑÑ Ð½Ðµ ÑÑÑ ÑанÑва поÑÑи ниÑо каÑо PDF: полеÑаÑа, оÑоÑмлениеÑо и доÑи геомеÑÑиÑÑа на ÑÑÑаниÑиÑе живеÑÑ Ð² XML пакеÑ, а видимиÑе ÑÑÑаниÑи Ñе генеÑиÑÐ°Ñ Ð² моменÑа на оÑваÑÑне Ð¾Ñ Ð³ÑаÑиÑен двигаÑел (layout engine), койÑо Ñамо Adobe е ÑазпÑоÑÑÑанÑвала маÑово. ÐзпÑаÑеÑе ÑакÑв Ñайл кÑм Ñеб ÑеÑеÑ, аÑÑ Ð¸Ð²Ð¸ÑаÑо пÑиложение или инÑÑÑÑÐ¼ÐµÐ½Ñ Ð·Ð° извлиÑане на ÑекÑÑ Ð¸ нÑма да полÑÑиÑе ÑоÑмÑлÑÑа. Ще полÑÑиÑе една Ñива ÑÑÑаниÑа ÑÑÑ ÑÑобÑениеÑо âÐолÑ? изÑакайÑе... Ðко Ñова ÑÑобÑение не бÑде заменено Ð¾Ñ Ð¿ÑавилноÑо ÑÑдÑÑжание на докÑменÑа, ваÑиÑÑ PDF ÑеÑÐµÑ Ð¼Ð¾Ð¶Ðµ да не е в ÑÑÑÑоÑние да покаже Ñози Ñип докÑменÑâ? ÐÑеки, койÑо е обÑабоÑвал дÑÑжавни или заÑÑÑÐ°Ñ Ð¾Ð²Ð°Ñелни докÑменÑи, познава Ñази ÑÑÑаниÑа веднага Ñом Ñ Ð²Ð¸Ð´Ð¸.
Това вÑеменно ÑÑдÑÑжание (placeholder) не ознаÑава повÑеден Ñайл. То е ÑоÑно Ñова, коеÑо ÑоÑмаÑÑÑ Ð¿Ñедвижда да Ñе ÑлÑÑи, когаÑо нÑма налиÑен XFA пÑоÑеÑоÑ. ÐÑм моменÑа Ñова опиÑва поÑÑи вÑеки ÑеÑÐµÑ Ð¸Ð·Ð²Ñн наÑÑÐ¾Ð»Ð½Ð¸Ñ Acrobat. ÐÑо заÑо пÑакÑиÑниÑÑ Ñ Ð¾Ð´ е динамиÑниÑÑ ÑоÑмÑлÑÑ Ð´Ð° Ñе конвеÑÑиÑа в обикновен AcroForm, пÑеди да доÑÑигне до ÑледваÑиÑе еÑапи по веÑигаÑа. HotPDF, PDF библиоÑекаÑа на losLab за Delphi и C++Builder, извÑÑÑва Ñова пÑеобÑазÑване пÑогÑамно, каÑо вÑзÑÑановÑва XML ÑоÑмÑлÑÑа каÑо вгÑадени полеÑа вÑÑÑ Ñ ÑÑандаÑÑни ÑÑÑаниÑи.
ÐаÑо дваÑа модела не Ð¼Ð¾Ð³Ð°Ñ Ð´Ð° ÑÑÑеÑÑвÑÐ²Ð°Ñ ÐµÐ´Ð½Ð¾Ð²Ñеменно
AcroForm е деÑиниÑан в ÑÑандаÑÑа ISO 32000-1 §12.7. ÐÑÑко поле е PDF Ð¾Ð±ÐµÐºÑ Ñ Ð°Ð½Ð¾ÑаÑÐ¸Ñ (widget annotation) и поÑок за визÑализаÑÐ¸Ñ (appearance stream), ÑÑÑаниÑаÑа е Ñеално PDF ÑÑдÑÑжание, а данниÑе Ñе ÑÐ°Ð·Ð¿Ð¾Ð»Ð°Ð³Ð°Ñ Ð²ÑÑÑ
Ñ Ð½ÐµÐ³Ð¾. XFA обÑÑÑа Ñози модел: ÑоÑмÑлÑÑÑÑ Ðµ XML докÑменÑ, XDP пакеÑ, ÑÑÑ
Ñанен в запиÑа /XFA на ÑеÑника на AcroForm. СÑÑаниÑиÑе на динамиÑÐ½Ð¸Ñ ÑоÑмÑлÑÑ ÑÑдÑÑÐ¶Ð°Ñ Ñамо ÑÑобÑениеÑо âÐолÑ? изÑакайÑеâ?и ниÑо дÑÑго, ÑÑй каÑо ÑеалноÑо ÑÑдÑÑжание никога не е било ÑеÑиализиÑано каÑо PDF. Ðаден ÑеÑÐµÑ Ð¾Ð±ÑабоÑва Ñайла по ÐµÐ´Ð¸Ð½Ð¸Ñ Ð¸Ð»Ð¸ по дÑÑÐ³Ð¸Ñ Ð¼Ð¾Ð´ÐµÐ». ÐгноÑиÑайÑе запиÑа /XFA и Ñе видиÑе пÑазнаÑа обвивка; поддÑÑжайÑе го без XFA двигаÑел и Ñе видиÑе пÑедÑпÑеждениеÑо. СÑандаÑÑÑÑ ISO 32000-2 Ñложи кÑай на ÑпоÑа, каÑо пÑемаÑ
на XFA Ð¾Ñ ÑпеÑиÑикаÑиÑÑа PDF 2.0, коеÑо е оÑновнаÑа пÑиÑина пÑеобÑазÑванеÑо да Ñе пÑевÑÑне Ð¾Ñ ÑаÑÑен ÑлÑÑай в ÑÑандаÑÑна пÑакÑика.
ÐÑеди да конвеÑÑиÑаÑе каквоÑо и да е, го клаÑиÑиÑиÑайÑе, ÑÑй каÑо не вÑеки XFA Ñайл показва ÑпоменаÑоÑо пÑедÑпÑеждение. СÑаÑиÑниÑе XFA ÑоÑмÑлÑÑи ÑÑдÑÑÐ¶Ð°Ñ Ð¿ÑедваÑиÑелно визÑализиÑани PDF ÑÑÑаниÑи до XML кода, Ñака Ñе Ñе Ñе Ð¿Ð¾ÐºÐ°Ð·Ð²Ð°Ñ Ð½Ð°Ð²ÑÑкÑде и Ð¿Ð¾ÐºÐ°Ð·Ð²Ð°Ñ Ð¿Ñоблеми едва пÑи попÑлване. ÐинамиÑниÑе ÑоÑмÑлÑÑи ÑÑдÑÑÐ¶Ð°Ñ Ñамо пÑедÑпÑеждениеÑо и Ñа неизползваеми до конвеÑÑиÑанеÑо им. ÐовеÑÑвайÑе Ñе на ÑÐ°Ð¼Ð¸Ñ Ð´Ð¾ÐºÑменÑ, а не на ÑазÑиÑениеÑо или изпÑаÑаÑа. Файл, койÑо показва Ñеално ÑÑдÑÑжание в ÑеÑеÑ, ÑазлиÑен Ð¾Ñ Adobe, но вÑе пак ÑÑдÑÑжа Ð·Ð°Ð¿Ð¸Ñ /XFA, е ÑÑаÑиÑен или Ñ
ибÑиден; Ñайл, койÑо показва пÑедÑпÑедиÑелнаÑа ÑÑÑаниÑа, е динамиÑен. ÐапиÑвайÑе Ñипа на вÑеки вÑ
одÑÑ Ñайл. ÐваÑа вида Ñе дÑÑÐ¶Ð°Ñ Ð¿Ð¾ ÑазлиÑен наÑин по-кÑÑно, а пÑоблем Ñ Ð¿Ñазен аÑÑ
ивиÑан ÑоÑмÑлÑÑ Ñе ÑазÑеÑава бÑÑзо, когаÑо в лога веÑе пиÑе: âдинамиÑеÐ?XFA, пÑеобÑазÑван, 47 ÑÑпоÑÑавени полеÑа, 2 пÑедÑпÑеждениÑâ?
ÐÑеобÑазÑване на заÑеден 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;
ÐÑÑнаÑаÑа ÑÑойноÑÑ Ð¸ ÑпиÑÑкÑÑ Ñ Ð¿ÑедÑпÑÐµÐ¶Ð´ÐµÐ½Ð¸Ñ Ñа важни изÑ
одни данни, а не ÑÑм пÑи оÑÑÑÑанÑване на гÑеÑки, Ñака Ñе ги запазвайÑе. ÐÑеобÑазÑванеÑо по ÑвоÑÑа ÑÑÑноÑÑ Ð²Ð¾Ð´Ð¸ до загÑба на инÑоÑмаÑиÑ: XFA ÑкÑипÑовеÑе, изÑиÑлÑемиÑе полеÑа и динамиÑниÑе подÑоÑми (subforms) нÑÐ¼Ð°Ñ ÐµÐºÐ²Ð¸Ð²Ð°Ð»ÐµÐ½Ñ Ð² 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);
СÑÑаÑа гÑÑпа Ð¸Ð·Ð²Ð¸ÐºÐ²Ð°Ð½Ð¸Ñ ÑабоÑи и в обÑаÑна поÑока, за по-ÑедкиÑе ÑлÑÑаи, когаÑо ÑÑÑбва да генеÑиÑаÑе XFA, а не да го обÑабоÑваÑе. AddXFAPacket пÑикаÑва оÑделни наименÑвани пакеÑи (каÑо 'xdp' или 'config'). SetXFADocument Ð´Ð¾Ð±Ð°Ð²Ñ ÑÑлоÑо ÑÑдÑÑжание на докÑменÑа в едно извикване. ClearXFAPackets изÑÑива ÑегиÑÑÑаÑиÑÑа, за да запоÑнеÑе оÑнаÑало, а AddXFASignaturePacket вгÑажда XAdES данни за пÑоÑеÑи, коиÑо подпиÑÐ²Ð°Ñ Ð´Ð¸ÑекÑно XML данниÑе на ÑоÑмÑлÑÑа. ÐенеÑиÑанеÑо на XFA в наÑи дни е ÑпеÑиÑиÑна нÑжда, поÑÑи винаги наложена Ð¾Ñ Ð½Ð°Ñледена ÑиÑÑема, коÑÑо не пÑиема ниÑо дÑÑго, но когаÑо Ñе изиÑква по договоÑ, Ñези Ð¸Ð·Ð²Ð¸ÐºÐ²Ð°Ð½Ð¸Ñ ÑлеÑнÑÐ²Ð°Ñ Ð·Ð°Ð´Ð°ÑаÑа.
ÐÑÑгоÑо знаÑение на ÑеÑмина âflattenâ?/h2>
ÐÑмаÑа âflattenâ?ÑеÑÑо пÑедизвиква обÑÑкване, ÑÑй каÑо назовава ÑÑвÑем дÑÑга опеÑаÑиÑ: вгÑаждане на визÑÐ°Ð»Ð½Ð¸Ñ Ð¾Ð±Ð»Ð¸Ðº на полеÑаÑа на AcroForm в поÑока Ð¾Ñ ÑÑдÑÑжание на ÑÑÑаниÑаÑа, докаÑо не оÑÑÐ°Ð½Ð°Ñ Ð¸Ð½ÑеÑакÑивни обекÑи. HotPDF не пÑедлага ÑакÑв пÑиложен пÑогÑамен инÑеÑÑÐµÐ¹Ñ (API) в моменÑа и е по-добÑе да знаеÑе Ñова Ñега, оÑколкоÑо по ÑÑедаÑа на пÑоекÑа. Това, коеÑо библиоÑекаÑа пÑедоÑÑÐ°Ð²Ñ Ð²Ð¼ÐµÑÑо Ñова, е заклÑÑване на ниво поле пÑи неговоÑо ÑÑздаване, подкÑепено Ð¾Ñ Ð¿ÑаваÑа за доÑÑÑп до докÑменÑа (document permissions):
// 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
ÐÑдеÑе наÑÑно какво ÑоÑно ви дава Ñова и какво не. ÐолеÑо, доÑÑÑпно Ñамо за ÑеÑене (read-only field), вÑе оÑе е Ð¾Ð±ÐµÐºÑ Ð½Ð° ÑоÑмÑлÑÑ. То Ñе показва в ÑÑоÑвеÑÐ½Ð¸Ñ Ð¿Ð°Ð½ÐµÐ» на ÑеÑеÑа, неговаÑа ÑÑойноÑÑ Ðµ ÑеÑима ÑÑез пÑÐ¸Ð»Ð¾Ð¶Ð½Ð¸Ñ Ð¸Ð½ÑеÑÑÐµÐ¹Ñ Ð½Ð° ÑоÑмаÑа, а инÑÑÑÑменÑ, койÑо пÑенапиÑва Ñайла, може да изклÑÑи Ñлага за доÑÑÑп Ñамо за ÑеÑене. ФлаговеÑе за пÑава повиÑÐ°Ð²Ð°Ñ Ð·Ð°ÑиÑаÑа, но завиÑÑÑ Ð¾Ñ Ñова дали ÑеÑеÑÑÑ Ñе ÑеÑи да ги Ñпазва â?огÑаниÑение, коеÑо ÑÑандаÑÑÑÑ ISO 32000-1 опиÑва ÑÑвÑем ÑÑно. ÐогаÑо ÑегÑлаÑÐ¾Ñ Ð¸Ð·Ð¸Ñква аÑÑ
ивниÑÑ Ð·Ð°Ð¿Ð¸Ñ Ð´Ð° не ÑÑдÑÑжа никакви обекÑи на ÑоÑмÑлÑÑи, пÑавилноÑо ÑеÑение Ñ HotPDF е докÑменÑÑÑ Ð´Ð° Ñе изгÑади наново: пÑоÑеÑеÑе ÑÑойноÑÑиÑе и Ñлед Ñова ги изÑеÑÑайÑе каÑо ÑÑандаÑÑно ÑÑдÑÑжание Ñ TextOut вÑÑÑ
Ñ Ð½Ð¾Ð²Ð° ÑÑÑаниÑа, вмеÑÑо да използваÑе ÑлаговеÑе за доÑÑÑп Ñамо за ÑеÑене. ÐеÑо, коеÑо ÑÑÑбва да помниÑе пÑи пÑаваÑа за доÑÑÑп, е, Ñе CryptKeyLength ÑÑÑбва да бÑде зададено пÑеди BeginDoc; оÑÑаналоÑо е опиÑано в ÑÑаÑиÑÑа за AES-256 ÑиÑÑиÑане и нива на доÑÑÑп.
Ðакво ознаÑава XFA за ÑÑоÑвеÑÑÑвиеÑо пÑи аÑÑ Ð¸Ð²Ð¸Ñане
СÑандаÑÑиÑе PDF/A и PDF/X оÑÑ
вÑÑлÑÑ Ð½Ð°Ð¿Ñлно XFA ÑÑÑÑкÑÑÑаÑа. ÐÑоÑеÑÑÑ, заÑ
ÑÐ°Ð½Ð²Ð°Ñ Ð°ÑÑ
ив по ISO 19005, ÑÑÑбва пÑÑво да извÑÑÑи пÑеобÑазÑване, каÑо ÑедÑÑ Ð½Ð° опеÑаÑииÑе е задÑлжиÑелен: заÑеждане, FlattenLoadedXFA, запиÑване и Ñлед Ñова ÑÑаÑÑиÑане на генеÑиÑанеÑо за аÑÑ
ивиÑане или валидиÑане вÑÑÑ
Ñ ÑезÑлÑаÑа Ð¾Ñ AcroForm. Ðо не ÑÑеÑиÑаÑе пÑеобÑазÑванеÑо каÑо доказаÑелÑÑво за ÑÑоÑвеÑÑÑвие. То коÑигиÑа модела на ÑоÑмÑлÑÑа, но оÑÑÐ°Ð²Ñ ÑÑиÑÑовеÑе, ÑвеÑовеÑе и меÑаданниÑе без пÑомÑна, Ñака Ñе валидиÑайÑе ÑезÑлÑаÑа Ñ veraPDF, пÑеди да го одобÑиÑе. След каÑо ÑоÑмÑлÑÑÑÑ Ð±Ñде пÑеобÑазÑван в AcroForm, неговоÑо поведение има Ñвои ÑобÑÑвени ÑÑедÑÑва за конÑÑол. JavaScript ÑÑигеÑиÑе, дейÑÑвиÑÑа за изпÑаÑане и ÑкÑипÑовеÑе за валидиÑане Ñа Ñазгледани в ÑÑаÑиÑÑа за полеÑа на AcroForm и дейÑÑÐ²Ð¸Ñ Ð² HotPDF.
ÐÑиложниÑе инÑеÑÑейÑи (API) за ÑегиÑÑÑаÑÐ¸Ñ Ð½Ð° XFA, пÑеобÑазÑване и ÑоÑмÑлÑÑи Ñе доÑÑавÑÑ Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñа HotPDF за Delphi и C++Builder, ÑиÑÑо докÑменÑаÑÐ¸Ñ Ð¿ÑоÑледÑва ÑазвиÑиеÑо на Ñ Ð°ÑакÑеÑиÑÑикиÑе на XFA в поÑледниÑе веÑÑии.