|
AcroForm Support
Visão geral
Desde o HotPDF v2.5.0 a biblioteca pode emitir formulários interativos (AcroForm) conforme a seção 12.7 da ISO 32000-1 do PDF 1.7. Cada campo de formulário é criado como uma anotação Widget mesclada com o dicionário do campo e é registrado automaticamente no documento, de modo que a entrada global de /AcroForm é adicionada ao Catalog quando o documento é finalizado em EndDoc.
Tipos de campos suportados
- Text fields (
/FT /Tx) via THPDFPage.AddTextField. Suporta opções de linha única, multi-linha, senha, comb, file-select, rich text, scroll e verificação ortográfica por meio de THPDFFormFieldFlags.
- Check boxes (
/FT /Btn, sem bits Pushbutton/Radio) via THPDFPage.AddCheckBox, com nome de valor de export configurável e estado marcado inicial.
- Radio buttons (
/FT /Btn /Ff Radio) via THPDFPage.AddRadioButton. Múltiplas chamadas com o mesmo nome de grupo são fundidas sob um campo pai compartilhado com um array /Kids, exatamente como exigido pela 12.7.4.2.
- Combo boxes (
/FT /Ch /Ff Combo) via THPDFPage.AddComboBox. Passe um open array de opções.
- List boxes (
/FT /Ch) via THPDFPage.AddListBox. ffMultiSelect habilita multi-seleção.
- Push buttons (
/FT /Btn /Ff Pushbutton) via THPDFPage.AddPushButton com caption opcional (/MK /CA). Desde o HotPDF v2.31.0, THPDFPage.AddPushButtonWithAction anexa um dicionário de ação PDF ao widget, de modo que clicar no botão execute /SubmitForm (envia valores de campos a uma URL, PDF 1.2 12.7.5.2), /ResetForm (PDF 1.2 12.7.5.3), /JavaScript (roda um snippet JS, PDF 1.3 12.6.4.16) ou /URI (abre uma URL no browser do sistema, PDF 1.1 12.6.4.7).
- Signature placeholder fields (
/FT /Sig) via THPDFPage.AddSignatureField desde o HotPDF v2.12.0. O dicionário AcroForm ganha automaticamente /SigFlags 3 (SignaturesExist + AppendOnly) quando ao menos um campo de assinatura está presente. O campo fica sem assinar, para que ferramentas externas (Adobe Acrobat, Foxit, bibliotecas dedicadas de assinatura CMS / PKCS#7) possam anexar a assinatura criptográfica real depois que o arquivo for salvo.
- In-place signing workflow via
THPDFPage.AddSignedSignatureField + THotPDF.PreparePDFForSigning + THotPDF.InsertSignatureHex desde o HotPDF v2.23.0. A primeira chamada reserva um dicionário de assinatura /V com placeholders de /ByteRange e /Contents. Depois de salvar o documento, a aplicação hospedeira chama PreparePDFForSigning para aplicar patch em /ByteRange e saber quais faixas do arquivo fazer hash. Depois de produzir uma assinatura destacada CMS / PKCS#7 externamente (CryptoAPI do Windows, OpenSSL, bibliotecas dedicadas de assinatura), ela chama InsertSignatureHex para colocar o hex da assinatura no placeholder sem perturbar nenhum outro byte do arquivo.
Wrappers de campos na criação
Desde o HotPDF v2.292.12, os helpers THPDFPage.CreateTextField, CreateCheckBox, CreateRadioButton, CreateComboBox e CreateListBox criam os mesmos widgets AcroForm que os métodos existentes de Add... e retornam um wrapper leve de THPDFAcroFormField para configuração imediata
Desde o HotPDF v2.292.26, THotPDF.SetFormFieldTooltip atribui a dica de usuário PDF /TU por nome de campo para campos criados pelos métodos existentes de Add..., correspondendo ao fluxo no nível de wrapper de THPDFAcroFormField.SetTooltip
Desde o HotPDF v2.298.0, as APIs de criação de campos em tempo de criação e as APIs de criação de campos de documentos carregados rejeitam nomes de campos raiz duplicados com uma exceção de diagnóstico antes de qualquer widget ser registrado. Chamadas repetidas de AddRadioButton com o mesmo nome de grupo permanecem válidas, porque compartilham um campo pai e adicionam widgets filhos adicionais sob o array /Kids dele
O wrapper expõe setters encadeáveis para tooltips de /TU, flags comuns de campos (SetReadOnly, SetRequired, SetNoExport), strings de aparência padrão de /DA, additional actions no nível do campo como /AA /K, /AA /F, /AA /V, /AA /C, e ações de mouse ou foco de widget por meio de THPDFActionBuilder
Exemplo Pascal de wrappers na criação
Field := HPDF.CurrentPage.CreateTextField('Email', '', Rect(50, 80, 250, 104));
Action := THPDFActionBuilder.JavaScript('event.rc = event.value.indexOf("@") > 0;');
try
Field.SetTooltip('Email address');
Field.SetRequired(True);
Field.SetReadOnly(False);
Field.SetAdditionalAction(fatValidate, Action);
finally
Action.Free;
Field.Free;
end;
Inspeção e atualização de campos de formulários carregados
Desde o HotPDF v2.121.9, aplicações podem carregar um PDF AcroForm existente com THotPDF.LoadFromFile, enumerar seus campos, ler nomes, tipos e valores deles, mudar valores de campos, alternar a flag somente leitura e salvar o grafo de objetos carregado com THotPDF.SaveLoadedDocument Este caminho se destina a edições persistidas em um documento já carregado; não chame BeginDoc / EndDoc apenas para salvar mudanças de valores de campos carregados.
Os helpers de campos são GetFormFieldCount, GetFormFieldName, GetFormFieldType, GetFormFieldValue, SetFormFieldValue e SetFormFieldReadOnly. A consulta de campos aceita tanto um índice de campo de base zero quanto o nome de campo totalmente qualificado. Os valores THPDFLoadedFormFieldType retornados são lfftText, lfftButton, lfftChoice, lfftSignature ou lfftUnknown.
Exemplo Pascal de campos carregados
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');
Additional actions de campos
Os wrappers AttachFieldKeyStrokeAction, AttachFieldFormatAction, AttachFieldValidateAction e AttachFieldCalculateAction anexam JavaScript ao dicionário /AA de um campo para os gatilhos PDF /K, /F, /V e /C. Use SetFormFieldAdditionalAction ou os wrappers nomeados de THPDFActionBuilder dele quando o mesmo gatilho precisar rodar uma cadeia de ações reutilizável como JavaScript, ResetForm, SubmitForm, URI, Hide, ImportData ou uma ação encadeada de /Next. Gatilhos de mouse e foco no nível de widget também podem ser instalados por nome de campo por meio de SetFormFieldAnnotationAction e dos helpers nomeados de mouse / foco, enquanto os helpers de clear correspondentes removem um gatilho sem perturbar o restante do dicionário /AA
Geração de aparências
Por padrão, o dicionário /AcroForm emitido define /NeedAppearances true e delega a renderização de appearance streams ao viewer consumidor (Adobe Reader, Foxit, Chrome, browsers, Apple Preview). Defina THotPDF.AutoFormAppearances como true antes de adicionar campos e o HotPDF pré-construirá Form XObjects de /AP /N (PDF 1.7 8.10) para cada campo de texto, push button, choice (combo / list) e os estados Yes / Off de cada checkbox / filho de radio. O dicionário AcroForm então carrega /NeedAppearances false e uma entrada de recursos padrão de /DR referenciando as 14 fontes base padrão (Helv Helvetica, ZaDb ZapfDingbats), de modo que renderizadores que ignoram /NeedAppearances ainda desenhem o conteúdo do campo corretamente. Disponível desde o HotPDF v2.28.0.
Referência de flags de campos (THPDFFormFieldFlags)
ffReadOnly, ffRequired, ffNoExport — common Table 227 flags applicable to every field type.
ffMultiline, ffPassword, ffFileSelect, ffDoNotSpellCheck, ffDoNotScroll, ffComb, ffRichText — Tx-specific (Table 228).
ffEdit, ffSort, ffMultiSelect, ffDoNotSpellCheck, ffCommitOnSelChange — Ch-specific (Table 230).
Exemplo Pascal
HPDF.BeginDoc;
HPDF.AddPage;
HPDF.CurrentPage.AddTextField('Name', '', Rect(50, 100, 250, 120));
HPDF.SetFormFieldTooltip('Name', 'Customer name');
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;
Limitations
- O gerador de
AutoFormAppearances atualmente dispõe apenas valores codificáveis em ASCII / WinAnsi; para campos cujo /V contém texto multi-byte (UTF-8), o /AP armazenado renderiza um retângulo vazio até o viewer hospedeiro regenerar a aparência.
- Os subestados Down (
/D) e rollover (/R) não são gerados; apenas o estado normal (/N) é produzido.
- Os nomes de campos são checados quanto a entradas raiz duplicadas quando novos widgets AcroForm são criados; a construção hierárquica de nomes parciais além do padrão pai de radio / widget permanece responsabilidade do chamador.
See Also
|