6

多数のテキスト フィールドを含む PDF フォームがあります。これらのフィールドに入力された値は、他のフィールドの値を計算するために使用されます (計算フィールドは読み取り専用です)。

Adobe Reader でフォームを開いてフィールドに入力すると、計算フィールドが自動的に再計算されます。

ただし、iTextSharp を使用してフィールドに入力し、結果のフォームを平坦化し、平坦化されたフォームを Web 経由でユーザーにストリーミングします。

計算フィールドが計算されないことを除けば、その部分は問題なく機能します。ユーザーがトリガーしたイベント (キーダウン、フォーカス、ぼかしなど) が発生していないため、計算は行われないと想定しています。

明らかに、入力可能なフォームから計算を削除し、フィールドに入力しているときはすべてサーバー上で実行できますが、入力可能なフォームをサーバーだけでなく人間も使用できるようにしたいと考えています。

誰かが計算を強制する方法を知っていますか?

編集:私はここでiText / iTextSharpの愛をあまり感じていません...

ここにいくつかの詳細があります。Stamper.AcroFields.GenerateAppearances を true に設定しても役に立ちません。

答えはページアクションのどこかにあると思いますが、それをトリガーする方法がわかりません...

4

5 に答える 5

3

Doc オブジェクトで javascript メソッド calculateNow を呼び出して、pdf のすべての計算フィールドを更新しました。

adobe javascriptのドキュメントによるとthis.calculateNow();

現在のドキュメントのすべての計算フィールドの計算を強制します。

フォームに多くの計算が含まれている場合、計算フィールドでなくても、ユーザーがフィールドにデータを入力した後、大幅な遅延が発生する可能性があります。戦略の 1 つは、ある時点で計算をオフにし、後でオンに戻すことです (例を参照)。

iTextSharp で JavaScript 呼び出しを含めるには:

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();
}
于 2013-10-22T14:08:10.450 に答える
2

私はこれを行う方法を考え出しました。stackoverflow の質問に対する私の回答を参照してください。

非計算フィールドの書式設定を更新し、入力可能な PDF フォームの計算フィールドを更新する方法

于 2013-06-03T18:50:42.863 に答える
1

サーバー側で、計算フィールドに回答があるかどうかを確認します。そうでない場合は、それらを計算します。

于 2009-01-27T21:35:46.603 に答える
1

Greg Hurlman が言うように、計算はサーバー上で自分で行う必要があります。これは単なる便宜上のものではなく、実際には正当な理由があります。

顧客が持っているファイルは、いじられる可能性があります。PDF フォームが何のためにあるのかはわかりませんが、何らかの方法でお金に関連している可能性があるため、計算で間違った結果を表示することで不正行為を行う可能性があります。クライアント側で行われる計算を信頼している場合、それを検出する方法はありません。

クライアントから PDF フォームを受け取ったら、計算が正しいことを確認するために、すべての計算をやり直す必要があります。次に、比較するクライアントのバージョンもある場合は、それらが台無しになっていないかどうかを確認する必要があります。

あなたのクライアントはそれほど信頼できないと思いませんか? あなたにとっては良いことですが、証拠は同意しません。私がプログラミングを始めた最初の頃の 1 つは、SimCity のセーブゲームを開いてお金を稼ぐことでした。何らかの方法でごまかす機会があれば、ある時点で人々はそれを試みます。

于 2009-02-01T17:18:29.267 に答える