Pregunta

Tengo un formulario PDF con varios campos de texto. Los valores ingresados ??en estos campos se usan para calcular valores en otros campos (los campos calculados son de solo lectura).

Cuando abro el formulario en Adobe Reader y completo un campo, los campos calculados se vuelven a calcular automáticamente.

Sin embargo, estoy usando iTextSharp para completar los campos, aplanar el formulario resultante y luego transmitir el formulario aplanado de nuevo al usuario a través de la web.

Esa parte funciona bien, excepto que los campos calculados nunca se calculan. Supongo que dado que no se activan eventos activados por el usuario (como keydowns o focus o blur), los cálculos no ocurren.

Obviamente, podría eliminar los cálculos del formulario que se puede rellenar y hacerlos todos en el servidor a medida que lleno los campos, pero me gustaría que los humanos y el servidor puedan utilizar el formulario rellenable.

¿Alguien sabe cómo forzar los cálculos?

EDITAR: No siento demasiado amor iText / iTextSharp aquí ...

Aquí hay algunos detalles más. Establecer stamper.AcroFields.GenerateAppearances en verdadero no ayuda.

Creo creo que la respuesta se encuentra en algún lugar de las acciones de la página, pero no sé cómo activarla ...

¿Fue útil?

Solución

Paulo Soares (uno de los principales desarrolladores de iText y actual mantenedor de iTextSharp) dice :

  

iText no hace ningún esfuerzo para arreglar   campos calculados porque la mayoría de los   veces eso es imposible. PdfCopyFields   tiene algo de apoyo que a veces   funciona y a veces no.

Otros consejos

He descubierto cómo hacer esto. Consulte mi respuesta para la pregunta de stackoverflow:

Cómo actualizar el formateo en Campo no calculado y actualización Campos calculados en formato PDF rellenable

He actualizado todos los campos calculados de mis archivos PDF llamando al método javascript CalculateNow en el objeto Doc.

De acuerdo con la documentación de adobe javascript this.calculateNow();

  

Fuerza el cálculo de todos los campos de cálculo en el documento actual.

     

Cuando un formulario contiene muchos cálculos, puede haber un retraso significativo después de que el usuario ingrese datos en un campo, incluso si no es un campo de cálculo. Una estrategia es desactivar los cálculos en algún momento y volver a activarlos más tarde (ver ejemplo).

Para incluir la llamada de JavaScript con iTextSharp:

using (PdfReader pdfReader = new PdfReader(pdfTemplate))
using (PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileStream(newFile, FileMode.Create)))
{
    // fill f1 field and more...
    AcroFields pdfFormFields = pdfStamper.AcroFields;
    pdfFormFields.SetField("f1", "100");
    //...

    // add javascript on load event of the pdf
    pdfStamper.JavaScript = "this.calculateNow();";
    pdfStamper.Close();
}

En el lado del servidor, vea si hay una respuesta en los campos calculados. Si no, calcule.

Como dice Greg Hurlman, debe hacer los cálculos usted mismo en el servidor. Esto es más que solo conveniencia, en realidad hay una buena razón para ello.

Cualquier archivo que tenga el cliente, tiene el potencial de fastidiarlo. No sé para qué son los formularios PDF, pero es probable que esté relacionado con el dinero de alguna manera, por lo que existe la posibilidad de que las personas hagan trampa haciendo que los cálculos muestren el resultado incorrecto. Si confía en los cálculos realizados en el lado del cliente, no tiene forma de detectarlo.

Cuando reciba el formulario PDF del cliente, debe rehacer todos los cálculos para saber que son correctos. Luego, si también tiene las versiones del cliente para comparar, debe verificar si se han atornillado.

¿No crees que tus clientes son tan poco confiables? Bien por ti, pero la evidencia no está de acuerdo. Una de mis primeras introducciones a la programación fue abrir los juegos guardados para SimCity para darme más dinero. Si existe la oportunidad de hacer trampa de alguna manera, entonces en algún momento la gente lo intentará.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top