2009-01-22 16 views
6

Tengo un formulario en PDF con una cantidad de campos de texto. Los valores ingresados ​​en estos campos se usan para calcular valores en otros campos (los campos calculados son de solo lectura).¿Cómo fuerzo el formateo y los cálculos en un PDF al completar otros campos usando iTextSharp?

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

Sin embargo, estoy usando iTextSharp para rellenar los campos, aplanar el formulario resultante, 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 ningún evento desencadenado por el usuario (como keydowns o focus o blur) se activan, los cálculos no se producen.

Obviamente, podría eliminar los cálculos de la forma rellenable y hacerlos todos en el servidor, ya que estoy rellenando los campos, pero me gustaría que la forma rellenable pueda ser utilizada por humanos y por el servidor.

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

EDIT: no siento demasiada iText/iTextSharp amor aquí ...

Éstos son algunos detalles más. Establecer stamper.AcroFields.GenerateAppearances en true no ayuda.

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

Respuesta

5

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

iText no hace ningún esfuerzo para corregir campos calculados porque la mayoría de las veces eso es imposible. PdfCopyFields tiene algún soporte para eso que a veces funciona y otras veces no.

+0

una respuesta feliz, pero esto es lo que estaba buscando - por lo menos es una prueba concluyente de que no va a funcionar y que puede moverse a otra cosa ... – CMPalmer

+0

Sí. iText debería admitir el modelo de objetos de JavaScript de Acrobat (completamente diferente del DOM de HTML). Eso es muy poco probable a menos que alguien venga y pague iTextSoftware (mucho) para que esto suceda. Ese es un GRAN trabajo. –

+0

¿Sigue siendo exacto? – Denis

1

En el lado del servidor, ver si hay una respuesta en los campos calculados. Si no, calcúlelos.

1

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

Cualquier archivo que el cliente tenga, tiene el potencial de arruinarse. No sé para qué sirven los formularios en PDF, pero es probable que esté relacionado con el dinero de alguna manera, por lo que existe la posibilidad de que la gente haga trampa al hacer que los cálculos muestren un resultado incorrecto. Si confía en los cálculos realizados en el lado del cliente, no tiene forma de detectarlo.

Cuando recibe el formulario PDF del cliente, debe volver a hacer todos los cálculos para que sepa que son correctos. Entonces, si también tiene las versiones del cliente para comparar, debe verificar si han sido manipuladas.

¿No cree que sus clientes son tan indignos de confianza? Bien por ti, pero la evidencia no está de acuerdo. Una de mis primeras presentaciones a la programación fue abrir los juegos salvados para que SimCity me diera más dinero. Si existe la oportunidad de hacer trampa de alguna manera, entonces en algún momento la gente lo intentará.

+0

Esta es una buena respuesta, pero en este caso ya tengo un formulario que hace el cálculo y mi intención era, para los que llené en el servidor, aplanarlos después de llenarlos y servirlos de una forma no modificable. Los cálculos fueron complicados y quería aprovechar lo que ya estaba allí. – CMPalmer

+0

Sí, escribir los mismos cálculos dos veces es doloroso, pero también lo es rastrear los dólares que faltan. –

2

He actualizado todos los campos calculados de mis pdfs llamando al método JavaScript calculateNow en el objeto Doc.

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

Fuerzas cómputo 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 ingresa datos en un campo, incluso si no es un campo de cálculo. Una estrategia es desactivar los cálculos en algún punto y volverlos a activar 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(); 
} 
No
+0

Como el OP aplana el formulario antes de que se abra en un visor de PDF, agregar que la llamada js no lo ayudará. – mkl

Cuestiones relacionadas