2017-08-08 1 views
0

Ich verwende itextsharp 5.5, um die Feldwerte mehrerer nicht berechneter Felder in einer PDF-Datei festzulegen. Die PDF enthält auch berechnete Werte. Ich möchte die berechneten Werte berechnen lassen und dann alle Felder schreibgeschützt machen, damit Benutzer, die das PDF öffnen, die Werte nicht mehr bearbeiten können.Behalten Sie die aktuell berechneten Werte beim Reduzieren von pdf

Ich habe es geschafft, die berechneten Werte erhalten

pdfStamper.JavaScript = "this.calculateNow();"; 

verwenden, aber dies lässt die editierbaren Felder aus. Verwenden

pdfStamper.FormFlattening = true; 

macht die Felder schreibgeschützt, aber die berechneten Werte werden wieder entfernt. Auch wenn ich nur kalkuliere, das PDF als temporäre Datei speichere, die temporäre Datei öffne und mit FormFlattening wieder auf true speichere, dann hat das fertige PDF die berechneten Werte nicht mehr.

Interessanterweise, wenn ich FormFlattening auf false gesetzt und beinhalten nicht die Linie pdfReader.RemoveUsageRights();

die resultierende pdf den Fehler „Dieses Dokument gibt aktivierter erweiterte Funktionen in Adobe Reader. Das Dokument geändert wurde, da es erstellt wurde und die Verwendung erweiterter Funktionen ist nicht mehr verfügbar ", wenn sie in Adobe Reader geöffnet wird. Nach dem Schließen dieser Fehlermeldung sieht die PDF-Datei jedoch korrekt aus, die berechneten Felder sind gefüllt und das Dokument ist schreibgeschützt. Aber da die resultierenden pdfs verteilt werden müssen, ist es keine Lösung, wenn sie alle Fehlermeldungen ausgeben.

Also meine Frage ist, gibt es eine Möglichkeit, FormFlattening zu verwenden, während Sie behalten, was die aktuell berechneten Werte von Feldern sind? Gibt es eine andere Möglichkeit, die Felder schreibgeschützt zu machen? Ist das Verhalten, wenn ich RemoveUsagerRights nicht verwende, etwas, das ich verwenden kann, oder sind die Felder aufgrund des Fehlers nur nicht editierbar?

Antwort

0

fand ich eine Abhilfe, indem alle Felder in der PDF-Einstellung Nur lesen

foreach (var key in pdfFormFields.Fields.Keys){ 
    pdfFormFields.SetFieldProperty(key, "setfflags", PdfFormField.FF_READ_ONLY, null); 
} 

Dies hält die berechneten Werte mit, während weitere Änderungen zu verhindern. Aber es ist nicht sehr ordentlich, und Adobe Reader hält die Datei irgendwie immer für schmutzig und wird einen sicheren Dialog anzeigen, wenn man versucht, Reader mit der PDF-Datei zu schließen. Ich bin also immer noch offen für bessere Ideen (oder eine Lösung für die Speicheraufforderung mit dieser Lösung).

Verwandte Themen