Trabajando con Formularios XFA usando C++

XFA Forms es la Arquitectura de Formularios XML, una familia de especificaciones XML propietarias que fueron propuestas y desarrolladas por JetForm para mejorar el manejo de formularios web. También se puede usar en archivos PDF a partir de la especificación PDF 1.5.

Rellena campos XFA con la clase Form de Aspose.Pdf.Facades.

Rellenar campos XFA

El siguiente fragmento de código muestra cómo rellenar campos en un formulario XFA.

using namespace System;
using namespace System::Collections::Generic;

using namespace Aspose::Pdf;
using namespace Aspose::Pdf::Text;

void FillXFA() {
    String _dataDir("C:\\Samples\\");

    // Cargar formulario XFA
    auto document = MakeObject<Document>(_dataDir + u"FillXFAFields.pdf");

    // Obtener nombres de los campos del formulario XFA
    auto names = document->get_Form()->get_XFA()->get_FieldNames();

    // Establecer valores de los campos

    document->get_Form()->get_XFA()->idx_set(names->idx_get(0),u"Field 0");
    document->get_Form()->get_XFA()->idx_set(names->idx_get(1),u"Field 1");

    // Guardar el documento actualizado
    document->Save(_dataDir + u"Filled_XFA_out.pdf");
}

Convertir XFA a AcroForm

Los formularios dinámicos se basan en una especificación XML conocida como XFA, la “Arquitectura de Formularios XML”. La información sobre el formulario (en lo que respecta a un PDF) es muy vaga: especifica que existen campos, con propiedades y eventos JavaScript, pero no especifica ningún renderizado.

Actualmente, PDF admite dos métodos diferentes para integrar datos y formularios PDF:

  • AcroForms (también conocidos como formularios Acrobat), introducidos e incluidos en la especificación de formato PDF 1.2.
  • Formularios de Arquitectura de Formularios XML de Adobe (XFA), introducidos en la especificación de formato PDF 1.5 como una característica opcional (La especificación XFA no está incluida en la especificación PDF, solo se hace referencia a ella.)

No podemos extraer o manipular páginas de Formularios XFA, porque el contenido del formulario se genera en tiempo de ejecución (durante la visualización del formulario XFA) dentro de la aplicación que intenta mostrar o renderizar el formulario XFA. Aspose.PDF tiene una característica que permite a los desarrolladores convertir formularios XFA a AcroForms estándar.

void ConvertXFAtoAcroForms() {

    String _dataDir("C:\\Samples\\");

    // Load XFA form
    auto document = MakeObject<Document>(_dataDir + u"DynamicXFAToAcroForm.pdf");

    // Set the form fields type as standard AcroForm
    document->get_Form()->set_Type(Aspose::Pdf::Forms::FormType::Standard);

    // Save the resultant PDF
    document->Save(_dataDir + u"Standard_AcroForm_out.pdf");
}

Obtener propiedades del campo XFA

Para acceder a las propiedades del campo, primero use Document.Form.XFA.Teamplate para acceder a la plantilla del campo. El siguiente fragmento de código muestra los pasos para obtener las coordenadas X e Y de un campo de formulario XFA.

void GetXFAProprties() {

    String _dataDir("C:\\Samples\\");
    // Load XFA form
    auto document = MakeObject<Document>(_dataDir + u"GetXFAProperties.pdf");

    auto names = document->get_Form()->get_XFA()->get_FieldNames();

    // Set field values
    document->get_Form()->get_XFA()->idx_set(names->idx_get(0), u"Field 0");
    document->get_Form()->get_XFA()->idx_set(names->idx_get(0), u"Field 1");

    // Get field position
    Console::WriteLine(document->get_Form()->get_XFA()->GetFieldTemplate(names[0])->get_Attributes()->idx_get(u"x")->get_Value());

    // Get field position
    Console::WriteLine(document->get_Form()->get_XFA()->GetFieldTemplate(names[0])->get_Attributes()->idx_get(u"y")->get_Value());

    // Save the updated document
    document->Save(_dataDir + u"Filled_XFA_out.pdf");
}