Come posso forzare la formattazione e i calcoli in un PDF quando compilo altri campi usando iTextSharp?

StackOverflow https://stackoverflow.com/questions/470707

Domanda

Ho un modulo PDF con un numero di campi di testo. I valori immessi in questi campi vengono utilizzati per calcolare i valori in altri campi (i campi calcolati sono di sola lettura).

Quando apro il modulo in Adobe Reader e compilo un campo, i campi calcolati vengono ricalcolati automaticamente.

Tuttavia, sto usando iTextSharp per compilare i campi, appiattire il modulo risultante, quindi trasmettere nuovamente il modulo appiattito all'utente sul Web.

Quella parte funziona perfettamente, tranne che i campi calcolati non vengono mai calcolati. Suppongo che dal momento che nessun evento attivato dall'utente (come keydown o focus o sfocatura) si sta attivando, i calcoli non si verificano.

Ovviamente, potrei rimuovere i calcoli dal modulo compilabile e farli tutti sul server mentre sto compilando i campi, ma vorrei che il modulo compilabile fosse utilizzabile dagli umani e dal server.

Qualcuno sa come forzare i calcoli?

EDIT: Non provo troppo amore per iText / iTextSharp qui ...

Ecco alcuni dettagli in più. L'impostazione di stamper.AcroFields.GenerateAppearances su true non aiuta.

Penso che la risposta risieda da qualche parte nelle azioni della pagina, ma non so come attivarla ...

È stato utile?

Soluzione

Paulo Soares (uno dei principali sviluppatori di iText e attuale manutentore di iTextSharp) dice :

  

iText non fa alcuno sforzo per risolvere   campi calcolati perché la maggior parte del   volte impossibile. PdfCopyFields   ha un supporto per questo che a volte   funziona e talvolta no.

Altri suggerimenti

Ho capito come fare. Si prega di vedere la mia risposta per la domanda StackOverflow:

Come aggiornare la formattazione su Campo non calcolato e aggiorna campi calcolati in formato PDF compilabile

Ho aggiornato tutti i campi calcolati dei miei pdf chiamando il metodo javascript calcoliOra sull'oggetto Doc.

Secondo la documentazione di Adobe JavaScript this.calculateNow();

  

Forza il calcolo di tutti i campi di calcolo nel documento corrente.

     

Quando un modulo contiene molti calcoli, può verificarsi un ritardo significativo dopo che l'utente ha inserito i dati in un campo, anche se non è un campo di calcolo. Una strategia è disattivare i calcoli ad un certo punto e riaccenderli in un secondo momento (vedi esempio).

Per includere la chiamata 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();
}

Sul lato server, vedere se c'è una risposta nei campi calcolati. In caso contrario, calcolarli.

Come dice Greg Hurlman, dovresti fare tu stesso i calcoli sul server. Questo non è solo una comodità, in realtà c'è una buona ragione per farlo.

Qualsiasi file che il cliente ha, ha il potenziale per rovinare. Non so a cosa servano i moduli PDF, ma è probabile che sia in qualche modo collegato al denaro, quindi esiste il potenziale per le persone di imbrogliare facendo sì che i calcoli mostrino il risultato sbagliato. Se ti fidi dei calcoli effettuati sul lato client, non hai modo di rilevarlo.

Quando ricevi il modulo PDF dal client, dovresti ripetere tutti i calcoli in modo da sapere che sono corretti. Quindi, se hai anche le versioni del client da confrontare, dovresti verificare se sono state fregate.

Non pensi che i tuoi clienti siano così inaffidabili? Buon per te, ma le prove non sono d'accordo. Una delle mie prime introduzioni alla programmazione è stata l'apertura dei salvataggi per SimCity per darmi più soldi. Se esiste l'opportunità di imbrogliare in qualche modo, a un certo punto le persone lo proveranno.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top