Wie erzwinge ich Formatierung und Berechnungen in einem PDF, wenn andere Felder ausfüllen mit iTextSharp?

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

Frage

Ich habe ein PDF-Formular mit einer Reihe von Textfeldern. Die Werte in diesen Feldern eingegeben werden verwendet, um Werte in anderen Bereichen zu berechnen (die berechneten Felder sind schreibgeschützt).

Wenn ich das Formular in Adobe Reader öffnen und fülle in einem Feld, die berechneten Felder automatisch neu zu berechnen.

Aber ich bin mit iTextSharp in den Feldern zu füllen, glätten die resultierende Form, dann die abgeflachte Form über das Internet an den Benutzer zurück übertragen.

Das Teil funktioniert gut, außer die berechneten Felder nie berechnen. Ich gehe davon aus, dass da keine Benutzerereignisse ausgelöst (wie keydowns oder Fokus oder Blur) feuern, die Berechnungen nicht auftreten.

Natürlich könnte ich die Berechnungen aus der ausfüllbare entfernen und tun sie alle auf dem Server als ich die Felder ausfülle, aber ich würde das ausfüllbare durch den Menschen nutzbar sein mag als auch der Server.

Wer weiß, wie die Berechnungen zu zwingen?

EDIT: Ich bin nicht zu viel iText / iTextSharp Liebe hier fühlen ...

Hier sind ein paar weiteren Details. Einstellen stamper.AcroFields.GenerateAppearances auf true hilft nicht.

I denkt die Antwort liegt irgendwo in der Seite Aktionen, aber ich weiß nicht, wie es auslösen ...

War es hilfreich?

Lösung

Paulo Soares (eine der wichtigsten Entwickler von iText und aktuellen Maintainer iTextSharp) sagt :

  

iText führt keine Mühe zu beheben   Felder berechnet, weil die meisten der   Zeiten, die unmöglich sind. PdfCopyFields   hat es eine gewisse Unterstützung, die manchmal   funktioniert und manchmal nicht.

Andere Tipps

Ich habe herausgefunden, wie dies zu tun. Bitte beachten Sie meine Antwort auf die Frage Stackoverflow:

Wie aktualisiert Formatierung auf Nicht Berechnete Feld und aktualisieren Berechnete Felder in ausfüllbare PDF-Formular

Ich habe alle berechneten Felder meiner pdfs aktualisiert durch die JavaScript-Methode calculateNow auf dem Doc-Objekt aufrufen.

Nach der Adobe javascript Dokumentation this.calculateNow();

  

Forces Berechnung aller Rechenfelder im aktuellen Dokument.

     

Wenn ein Formular viele Berechnungen enthält, kann es eine erhebliche Verzögerung, nachdem der Anwender Daten in einem Feld, auch wenn es kein Berechnungsfeld ist. Eine Strategie ist, Berechnungen an einem gewissen Punkt auszuschalten und sie wieder auf später (siehe Beispiel).

Um den Javascript-Aufruf mit iTextSharp gehören:

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();
}

Auf der Serverseite, sehen, ob es eine Antwort in den berechneten Feldern ist. Wenn nicht, berechnen sie.

Wie Greg Hurlman sagt, sollten Sie die Berechnungen selbst auf dem Server tun. Dies ist mehr als nur Bequemlichkeit, es ist eigentlich ein guter Grund dafür.

Jede Datei, die der Kunde hat, sie haben das Potenzial, verschrauben mit. Ich weiß nicht, was die PDF-Formulare sind für, aber die Chancen sind es irgendwie zu Geld verbunden ist, so dass das Potenzial vorhanden ist für die Menschen, indem sie die Berechnungen zu betrügen das falsche Ergebnis zeigen. Wenn Sie die Berechnungen erfolgen auf der Client-Seite vertrauen, haben Sie keine Möglichkeit, es zu erkennen.

Wenn Sie das PDF-Formular von dem Client empfangen, sollten Sie alle Berechnungen wiederholen, so dass Sie wissen, dass sie richtig sind. Dann, wenn Sie auch die Client-Versionen zu vergleichen, sollten Sie prüfen, ob sie mit geschraubt worden sind.

Denken Sie nicht Ihre Kunden, dass nicht vertrauenswürdig sind? Gut für Sie, aber die Beweise nicht einverstanden ist. Eine meiner frühesten Einführung in die Programmierung wurde das Öffnen der Speicherstände sich für SimCity mir mehr Geld zu geben. Wenn die Möglichkeit in irgendeiner Weise zu betrügen existiert, dann irgendwann Leute werden es versuchen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top