پشتیبانی AcroForm

نمای کلی

از HotPDF v2.5.0 به بعد، کتابخانه می‌تواند فرم‌های تعاملی (AcroForm) را بر اساس PDF 1.7 ISO 32000-1 بخش 12.7 صادر کند. هر فیلد فرم به‌صورت یک Widget annotation ساخته می‌شود که با دیکشنری فیلد ادغام شده و به‌طور خودکار با سند ثبت می‌شود تا وقتی سند در EndDoc نهایی می‌شود، ورودی سراسری /AcroForm به Catalog افزوده شود

نوع‌های پشتیبانی‌شده فیلد

  • فیلدهای متنی (/FT /Tx) از طریق THPDFPage.AddTextField. از گزینه‌های تک‌خطی، چندخطی، گذرواژه، comb، انتخاب فایل، rich-text، scroll و spell-check از طریق THPDFFormFieldFlags پشتیبانی می‌کند
  • چک‌باکس‌ها (/FT /Btn، بدون bitهای Pushbutton/Radio) از طریق THPDFPage.AddCheckBox با نام export قابل تنظیم و وضعیت اولیهٔ علامت‌خورده
  • دکمه‌های رادیویی (/FT /Btn /Ff Radio) از طریق THPDFPage.AddRadioButton. فراخوانی‌های متعدد با همان نام گروه زیر یک فیلد والد مشترک با آرایهٔ /Kids ادغام می‌شوند، دقیقاً مطابق 12.7.4.2
  • Combo boxes (/FT /Ch /Ff Combo) via THPDFPage.AddComboBox. Pass an open array of options
  • List boxes (/FT /Ch) via THPDFPage.AddListBox. ffMultiSelect enables multi-select
  • دکمه‌های فشاری (/FT /Btn /Ff Pushbutton) از طریق THPDFPage.AddPushButton با زیرنویس اختیاری (/MK /CA). از HotPDF v2.31.0، THPDFPage.AddPushButtonWithAction یک action dictionaryِ PDF را به widget وصل می‌کند تا کلیک روی دکمه /SubmitForm (ارسال مقادیر فیلد به URL، PDF 1.2 12.7.5.2)، /ResetForm (PDF 1.2 12.7.5.3)، /JavaScript (اجرای یک snippet جاوااسکریپت، PDF 1.3 12.6.4.16) یا /URI (بازکردن URL در مرورگر سیستم، PDF 1.1 12.6.4.7) را اجرا کند
  • فیلدهای جای‌نگهدار امضا (/FT /Sig) از طریق THPDFPage.AddSignatureField از HotPDF v2.12.0 به بعد. دیکشنری AcroForm به‌طور خودکار /SigFlags 3 (SignaturesExist + AppendOnly) را می‌گیرد وقتی دست‌کم یک فیلد امضا وجود داشته باشد. این فیلد بدون امضا باقی می‌ماند تا ابزارهای بیرونی (Adobe Acrobat، Foxit، کتابخانه‌های اختصاصی CMS / PKCS#7) بتوانند امضای رمزنگاری واقعی را بعد از ذخیره شدن فایل اضافه کنند
  • گردش‌کار امضای درجا از طریق THPDFPage.AddSignedSignatureField + THotPDF.PreparePDFForSigning + THotPDF.InsertSignatureHex از HotPDF v2.23.0 به بعد. نخستین فراخوانی یک signature dictionary در /V با جای‌نگهدارهای /ByteRange و /Contents رزرو می‌کند. بعد از ذخیرهٔ سند، برنامهٔ میزبان PreparePDFForSigning را صدا می‌زند تا /ByteRange را وصله کند و بفهمد کدام بازه‌های فایل باید هش شوند. پس از تولید یک امضای detached از نوع CMS / PKCS#7 به‌صورت بیرونی (Windows CryptoAPI، OpenSSL، کتابخانه‌های اختصاصی امضا)، InsertSignatureHex را صدا می‌زند تا hex امضا را در جای‌نگهدار قرار دهد بدون آن‌که هیچ byte دیگری در فایل را دست بزند

بازبینی و به‌روزرسانی فیلدهای بارگذاری‌شده

از HotPDF v2.121.9 به بعد، برنامه‌ها می‌توانند یک PDF موجودِ AcroForm را با THotPDF.LoadFromFile بارگذاری کنند، فیلدهای آن را enumerate کنند، نام‌ها، نوع‌ها و مقدارها را بخوانند، مقدار فیلدها را تغییر دهند، flag فقط‌خواندنی را toggle کنند و گراف شیء بارگذاری‌شده را با THotPDF.SaveLoadedDocument ذخیره کنند این مسیر برای ویرایش‌های پایدار روی سندی است که از قبل بارگذاری شده است؛ برای ذخیرهٔ تغییرات مقدار فیلد، فقط به‌خاطر آن BeginDoc / EndDoc را صدا نزنید

helperهای فیلد عبارت‌اند از GetFormFieldCount، GetFormFieldName، GetFormFieldType، GetFormFieldValue، SetFormFieldValue و SetFormFieldReadOnly. جست‌وجوی فیلد هم با اندیس صفرمبنایی فیلد و هم با نام کامل فیلد پذیرفته می‌شود. مقدارهای بازگشتی THPDFLoadedFormFieldType عبارت‌اند از lfftText، lfftButton، lfftChoice، lfftSignature یا lfftUnknown

نمونه Pascal برای فیلدهای بارگذاری‌شده

HPDF.LoadFromFile('InputForm.pdf');
for I := 0 to HPDF.GetFormFieldCount - 1 do
  Writeln(HPDF.GetFormFieldName(I), ' = ', HPDF.GetFormFieldValue(I));

HPDF.SetFormFieldValue('CustomerName', 'Bob');
HPDF.SetFormFieldValue('Plan', 'Premium');
HPDF.SetFormFieldReadOnly('CustomerName', True);
HPDF.SaveLoadedDocument('UpdatedForm.pdf');

اقدام‌های تکمیلی فیلد

wrapperهای AttachFieldKeyStrokeAction، AttachFieldFormatAction، AttachFieldValidateAction و AttachFieldCalculateAction جاوااسکریپت را به دیکشنری /AA فیلد برای triggerهای PDF /K، /F، /V و /C وصل می‌کنند. وقتی filtering در keystroke، قالب‌بندی نمایش، اعتبارسنجی یا به‌روزرسانی فیلد محاسباتی باید همراه خود فیلد بماند نه یک دکمه، پس از ساخت یا بارگذاری فیلد از آن‌ها استفاده کنید

تولید ظاهر

به‌طور پیش‌فرض دیکشنری صادرشده /AcroForm مقدار /NeedAppearances true را تنظیم می‌کند و رندر جریان ظاهر را به نمایشگر مصرف‌کننده (Adobe Reader، Foxit، Chrome، مرورگرها، Apple Preview) واگذار می‌کند. THotPDF.AutoFormAppearances را پیش از افزودن فیلدها روی true بگذارید تا HotPDF برای هر فیلد متنی، push button، choice (combo / list) و حالت‌های Yes / Off هر checkbox / radio kid، Form XObjectهای /AP /N (PDF 1.7 8.10) را از پیش بسازد. در این صورت دیکشنری AcroForm مقدار /NeedAppearances false و یک ورودی /DR برای منابع پیش‌فرض شامل فونت‌های پایه استاندارد 14‌گانه (Helv Helvetica، ZaDb ZapfDingbats) را حمل می‌کند، بنابراین رندرکننده‌هایی که /NeedAppearances را نادیده می‌گیرند هم محتوای فیلد را درست رسم می‌کنند. از HotPDF v2.28.0 در دسترس است

مرجع flagهای فیلد (THPDFFormFieldFlags)

  • ffReadOnly، ffRequired، ffNoExport — flagهای رایج Table 227 که برای همهٔ نوع‌های فیلد کاربرد دارند
  • ffMultiline، ffPassword، ffFileSelect، ffDoNotSpellCheck، ffDoNotScroll، ffComb، ffRichText — مخصوص Tx (Table 228)
  • ffEdit، ffSort، ffMultiSelect، ffDoNotSpellCheck، ffCommitOnSelChange — مخصوص Ch (Table 230)

نمونه Pascal

HPDF.BeginDoc;
HPDF.AddPage;
HPDF.CurrentPage.AddTextField('Name', '', Rect(50, 100, 250, 120));
HPDF.CurrentPage.AddCheckBox('Agree', 'Yes', Rect(50, 130, 70, 145), True);
HPDF.CurrentPage.AddRadioButton('Color', 'Red',   Rect(50, 160, 70, 175), True);
HPDF.CurrentPage.AddRadioButton('Color', 'Green', Rect(80, 160, 100, 175));
HPDF.CurrentPage.AddRadioButton('Color', 'Blue',  Rect(110, 160, 130, 175));
HPDF.CurrentPage.AddComboBox('Country', 'CN',
                             ['CN', 'US', 'JP'], Rect(50, 190, 250, 210));
HPDF.EndDoc;

محدودیت‌ها

  • generatorِ AutoFormAppearances فعلاً فقط مقدارهای قابل‌کدگذاری با ASCII / WinAnsi را layout می‌کند؛ برای فیلدهایی که /V آن‌ها متن چندبایتی (UTF-8) دارد، /AP ذخیره‌شده تا وقتی viewer میزبان appearance را دوباره تولید کند، به‌صورت یک مستطیل خالی رندر می‌شود
  • زیر-حالت‌های Down (/D) و rollover (/R) تولید نمی‌شوند؛ فقط حالت normal (/N) ساخته می‌شود
  • منحصر‌بودن نام فیلد مسئولیت فراخواننده است؛ HotPDF آن را enforce نمی‌کند

همچنین ببینید