Obsługa AcroForm

Omówienie

Od HotPDF v2.5.0 biblioteka może emitować formularze interaktywne (AcroForm) zgodnie z PDF 1.7 ISO 32000-1 section 12.7. Każde pole formularza jest tworzone jako adnotacja Widget połączona ze słownikiem pola i automatycznie rejestrowane w dokumencie, dzięki czemu globalny wpis /AcroForm jest dodawany do Catalog podczas finalizacji dokumentu w EndDoc.

Obsługiwane typy pól

  • Pola tekstowe (/FT /Tx) przez THPDFPage.AddTextField. Obsługują opcje jednowierszowe, wielowierszowe, hasła, comb, wybór pliku, rich-text, przewijanie i sprawdzanie pisowni przez THPDFFormFieldFlags.
  • Pola wyboru (/FT /Btn, bez bitów Pushbutton/Radio) przez THPDFPage.AddCheckBox z konfigurowalną nazwą wartości eksportu i początkowym stanem zaznaczenia.
  • Przyciski opcji (/FT /Btn /Ff Radio) przez THPDFPage.AddRadioButton. Wielokrotne wywołania z tą samą nazwą grupy są łączone pod wspólnym polem nadrzędnym z tablicą /Kids, dokładnie tak, jak wymaga 12.7.4.2.
  • Pola combo (/FT /Ch /Ff Combo) przez THPDFPage.AddComboBox. Przekaż otwartą tablicę opcji.
  • Listy (/FT /Ch) przez THPDFPage.AddListBox. ffMultiSelect włącza wybór wielu pozycji.
  • Przyciski (/FT /Btn /Ff Pushbutton) przez THPDFPage.AddPushButton z opcjonalnym podpisem (/MK /CA). Od HotPDF v2.31.0 THPDFPage.AddPushButtonWithAction dołącza słownik akcji PDF do widgetu, aby kliknięcie przycisku uruchamiało /SubmitForm (wysłanie wartości pól do URL, PDF 1.2 12.7.5.2), /ResetForm (PDF 1.2 12.7.5.3), /JavaScript (uruchomienie fragmentu JS, PDF 1.3 12.6.4.16) albo /URI (otwarcie URL w przeglądarce systemowej, PDF 1.1 12.6.4.7).
  • Pola zastępcze podpisu (/FT /Sig) przez THPDFPage.AddSignatureField od HotPDF v2.12.0. Słownik AcroForm automatycznie otrzymuje /SigFlags 3 (SignaturesExist + AppendOnly), gdy obecne jest co najmniej jedno pole podpisu. Pole pozostaje niepodpisane, aby narzędzia zewnętrzne (Adobe Acrobat, Foxit, dedykowane biblioteki podpisywania CMS / PKCS#7) mogły dołączyć rzeczywisty podpis kryptograficzny po zapisaniu pliku.
  • Przepływ podpisywania w miejscu przez THPDFPage.AddSignedSignatureField + THotPDF.PreparePDFForSigning + THotPDF.InsertSignatureHex od HotPDF v2.23.0. Pierwsze wywołanie rezerwuje słownik podpisu /V z placeholderami /ByteRange i /Contents. Po zapisaniu dokumentu aplikacja hosta wywołuje PreparePDFForSigning, aby załatać /ByteRange i poznać zakresy pliku do haszowania. Po zewnętrznym utworzeniu podpisu odłączonego CMS / PKCS#7 (Windows CryptoAPI, OpenSSL, dedykowane biblioteki podpisujące) wywołuje InsertSignatureHex, aby wstawić hex podpisu do placeholdera bez naruszania żadnego innego bajtu w pliku.

Inspekcja i aktualizacje wczytanych pól formularza

Od HotPDF v2.121.9 aplikacje mogą wczytać istniejący PDF AcroForm przez THotPDF.LoadFromFile, wyliczyć jego pola, odczytać ich nazwy, typy i wartości, zmienić wartości pól, przełączyć flagę tylko do odczytu oraz zapisać wczytany graf obiektów przez THotPDF.SaveLoadedDocument. Ta ścieżka jest przeznaczona do trwałych edycji dokumentu już wczytanego; nie wywołuj BeginDoc / EndDoc tylko po to, aby zapisać zmiany wartości wczytanych pól.

Pomocnikami pól są GetFormFieldCount, GetFormFieldName, GetFormFieldType, GetFormFieldValue, SetFormFieldValue oraz SetFormFieldReadOnly. Wyszukiwanie pola przyjmuje indeks pola liczony od zera albo w pełni kwalifikowaną nazwę pola. Zwracane wartości THPDFLoadedFormFieldType to lfftText, lfftButton, lfftChoice, lfftSignature albo lfftUnknown.

Przykład Pascal dla wczytanego pola

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');

Dodatkowe akcje pól

AttachFieldKeyStrokeAction, AttachFieldFormatAction, AttachFieldValidateAction i AttachFieldCalculateAction dołączają JavaScript do słownika /AA pola dla wyzwalaczy PDF /K, /F, /V i /C. Używaj ich po utworzeniu lub wczytaniu pola, gdy filtrowanie, format, walidacja albo obliczenia mają należeć do pola.

Generowanie wyglądu

Domyślnie emitowany słownik /AcroForm ustawia /NeedAppearances true i przekazuje renderowanie strumieni wyglądu do czytnika odbiorcy (Adobe Reader, Foxit, Chrome, przeglądarki, Apple Preview). Ustaw THotPDF.AutoFormAppearances na true przed dodaniem pól, a HotPDF zbuduje wcześniej obiekty Form XObject /AP /N (PDF 1.7 8.10) dla każdego pola tekstowego, przycisku, wyboru (combo / lista) oraz stanów Yes / Off każdego checkboxa / dziecka radio. Słownik AcroForm zawiera wtedy /NeedAppearances false i domyślny wpis zasobów /DR odwołujący się do standardowych 14 fontów bazowych (Helv Helvetica, ZaDb ZapfDingbats), więc renderery ignorujące /NeedAppearances nadal poprawnie rysują zawartość pola. Dostępne od HotPDF v2.28.0.

Referencja flag pól (THPDFFormFieldFlags)

  • ffReadOnly, ffRequired, ffNoExport — wspólne flagi Table 227 mające zastosowanie do każdego typu pola.
  • ffMultiline, ffPassword, ffFileSelect, ffDoNotSpellCheck, ffDoNotScroll, ffComb, ffRichText — specyficzne dla Tx (Table 228).
  • ffEdit, ffSort, ffMultiSelect, ffDoNotSpellCheck, ffCommitOnSelChange — specyficzne dla Ch (Table 230).

Przykład 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;

Ograniczenia

  • Generator AutoFormAppearances obecnie układa tylko wartości możliwe do zakodowania jako ASCII / WinAnsi; dla pól, których /V zawiera tekst wielobajtowy (UTF-8), zapisany /AP renderuje pusty prostokąt do czasu, aż czytnik hosta odtworzy wygląd.
  • Podstany down (/D) i rollover (/R) nie są generowane; tworzony jest tylko stan normalny (/N).
  • Unikalność nazw pól jest obowiązkiem kodu wywołującego; HotPDF jej nie wymusza.

Zobacz też