|
Métodos de campos de formulario cargados de THotPDF
Sintaxis
function GetLoadedAcroForm: THPDFDictionaryObject;
function HasFormFields: Boolean;
function FormFieldExists(const FieldName: AnsiString): Boolean;
function GetFormFieldCount: Integer;
function GetFormFieldName(FieldIndex: Integer): AnsiString;
function GetFormFieldValue(FieldIndex: Integer): AnsiString; overload;
function GetFormFieldValue(const FieldName: AnsiString): AnsiString; overload;
function GetFormFieldType(FieldIndex: Integer): THPDFLoadedFormFieldType; overload;
function GetFormFieldType(const FieldName: AnsiString): THPDFLoadedFormFieldType; overload;
function GetFormFieldDescription(FieldIndex: Integer): AnsiString; overload;
function GetFormFieldDescription(const FieldName: AnsiString): AnsiString; overload;
function GetFormFieldOptionCount(FieldIndex: Integer): Integer; overload;
function GetFormFieldOptionCount(const FieldName: AnsiString): Integer; overload;
function GetFormFieldOptionValue(FieldIndex, OptionIndex: Integer): AnsiString; overload;
function GetFormFieldOptionValue(const FieldName: AnsiString; OptionIndex: Integer): AnsiString; overload;
function GetLoadedFormFieldWidgetPageIndex(FieldIndex,
WidgetIndex: Integer): Integer;
function GetLoadedFormFieldIndexForAnnotation(PageIndex,
AnnotationIndex: Integer; out WidgetIndex: Integer): Integer;
procedure InvalidateLoadedFormRelationshipCache;
function GetLoadedFormRelationshipCacheStatistics(
out Statistics: THPDFFormRelationshipCacheStatistics): Boolean;
function IsFormFieldReadOnly(FieldIndex: Integer): Boolean; overload;
function IsFormFieldReadOnly(const FieldName: AnsiString): Boolean; overload;
procedure SetFormFieldValue(FieldIndex: Integer; const Value: AnsiString); overload;
procedure SetFormFieldValue(const FieldName, Value: AnsiString); overload;
procedure SetFormFieldReadOnly(FieldIndex: Integer; ReadOnly: Boolean); overload;
procedure SetFormFieldReadOnly(const FieldName: AnsiString; ReadOnly: Boolean); overload;
procedure RenameFormField(FieldIndex: Integer; const NewName: AnsiString); overload;
procedure RenameFormField(const FieldName, NewName: AnsiString); overload;
procedure RemoveFormField(FieldIndex: Integer); overload;
procedure RemoveFormField(const FieldName: AnsiString); overload;
function RecalculateLoadedFormFields: Integer;
function FlattenLoadedFormFields(const FieldNames: array of AnsiString;
EnforceSignaturePermissions: Boolean = True): Integer;
function FlattenFormFields: Integer;
procedure SaveLoadedDocument(const TargetFile: TFileName);
Descripción
Estos métodos inspeccionan y actualizan campos AcroForm que ya existen en un PDF cargado con LoadFromFile o BeginIncrementalUpdate. Soportan campos de texto (/FT /Tx), campos de botón (/FT /Btn), campos de elección (/FT /Ch), campos de firma (/FT /Sig) y tipos de campo desconocidos
GetLoadedAcroForm devuelve el diccionario /AcroForm cargado resuelto para los llamadores que necesitan inspección directa del diccionario antes de usar los métodos de campo de más alto nivel
HasFormFields informa de si el PDF cargado o el documento en curso tiene campos AcroForm. FormFieldExists comprueba un árbol de campos cargado o la lista de campos de autoría por nombre de campo sin lanzar excepción cuando el campo está ausente
GetFormFieldDescription lee el nombre de campo alternativo /TU del campo cargado, usado habitualmente por los visores PDF como tooltip del campo. Devuelve una cadena vacía cuando el campo no tiene descripción
GetFormFieldOptionCount y GetFormFieldOptionValue leen el array /Opt de los campos de elección cargados. Las entradas de cadena simples se devuelven directamente; los arrays de opciones de dos elementos devuelven el primer valor de exportación
IsFormFieldReadOnly lee el bit 1 del flag /Ff del campo cargado. RenameFormField actualiza el nombre /T local del campo cargado y rechaza nombres completos duplicados en el mismo árbol de formulario cargado
La caché de relaciones de formularios cargados mapea campos, nombres cualificados, widgets, anotaciones y páginas en ambas direcciones tras una única construcción lineal perezosa. Los métodos de mutación de alto nivel la mantienen o invalidan automáticamente. Llame a InvalidateLoadedFormRelationshipCache tras ediciones que cambien relaciones hechas mediante APIs de objetos en bruto
RecalculateLoadedFormFields recorre el array /AcroForm /CO cargado en orden del documento y evalúa las operaciones AFSimple_Calculate acotadas SUM, AVG, PRD, MIN y MAX. Los valores actualizados reciben apariencias regeneradas
RemoveFormField elimina un campo de formulario cargado del árbol de campos AcroForm y quita las anotaciones widget coincidentes de sus páginas. FlattenLoadedFormFields pinta solo los campos nombrados como contenido estático en sus páginas propietarias, elimina sus anotaciones widget y preserva los campos y páginas intactos. Un array de nombres vacío selecciona todos los campos. La compuerta de permisos por defecto rechaza cualquier cambio estructural prohibido por firmas DocMDP o FieldMDP
FlattenFormFields conserva el contrato de conveniencia de todos los campos y delega los documentos cargados a la misma ruta consciente de firmas y local a página. Devuelve el número de campos aplanados, o cero cuando no había campos de formulario coincidentes
Use SaveLoadedDocument para escribir una copia completamente guardada del grafo de objetos cargado tras editar campos directamente. Para flujos append-only como los PDFs firmados, cargue con BeginIncrementalUpdate, edite los campos y después llame a SaveIncrementalUpdate
Ejemplo
PDF.LoadFromFile('InputForm.pdf');
for I := 0 to PDF.GetFormFieldCount - 1 do
Writeln(PDF.GetFormFieldName(I), ' = ', PDF.GetFormFieldValue(I));
for I := 0 to PDF.GetFormFieldOptionCount('Plan') - 1 do
Writeln('Plan option ', I, ': ', PDF.GetFormFieldOptionValue('Plan', I));
Writeln('Customer description: ', PDF.GetFormFieldDescription('CustomerName'));
PDF.SetFormFieldValue('CustomerName', 'Bob');
PDF.SetFormFieldReadOnly('CustomerName', True);
PDF.RenameFormField('CustomerName', 'ClientName');
PDF.RemoveFormField('Approved');
PDF.RecalculateLoadedFormFields;
PDF.SaveLoadedDocument('UpdatedForm.pdf');
PDF.LoadFromFile('UpdatedForm.pdf');
if PDF.HasFormFields then
Writeln('Plan exists: ', PDF.FormFieldExists('Plan'));
FlattenedCount := PDF.FlattenFormFields;
PDF.SaveLoadedDocument('FlattenedForm.pdf');
PDF.BeginIncrementalUpdate('SignedForm.pdf');
FlattenedCount := PDF.FlattenLoadedFormFields(['CalculatedTotal']);
PDF.SaveIncrementalUpdate('SignedForm-flattened.pdf');
Véase también
|