2009-01-22 41 views
6

我有一個PDF格式的文本字段。在這些字段中輸入的值用於計算其他字段中的值(計算字段爲只讀)。如何在使用iTextSharp填充其他字段時強制執行PDF格式和計算?

當我在Adobe Reader中打開表單並填寫一個字段時,計算的字段會自動重新計算。

但是,我正在使用iTextSharp填充字段,將生成的表單平鋪,然後將展平後的表單通過網絡傳回給用戶。

該部分工作得很好,除了計算字段永不計算。我假設由於沒有用戶觸發事件(如keydowns或焦點或模糊)正在觸發,計算不會發生。

顯然,我可以從可填寫的表格中刪除計算,並在服務器上完成它們,因爲我正在填充字段,但是我希望可填寫的表單可以被人類以及服務器使用。

有誰知道如何強制計算?

編輯: 我是不是感覺這裏太多的iText/iTextSharp的愛...

這裏有一些更多的細節。將stamper.AcroFields.GenerateAppearances設置爲true並沒有幫助。

認爲答案就在於某處頁面操作,但我不知道如何觸發它...

回答

5

聖保羅蘇亞雷斯(iText的和iTextSharp的當前維護者的主要開發者之一)says

的iText沒有做任何努力來解決,因爲大多數 倍,是不可能的 計算領域。 PdfCopyFields 有一些支持,有時 的作品,有時不。

+0

不是一個快樂的答案,但是這就是我一直在尋找的 - 至少這是確鑿的證據表明,它是不是要去工作,我可以移動在其他東西上... – CMPalmer 2009-02-02 04:11:25

+0

是的。 iText將不得不支持Acrobat的JavaScript對象模型(完全不同於HTML的DOM)。這是非常不可能的,除非有人出現並支付iTextSoftware(很多)才能實現。這是一項大工作。 – 2011-03-08 18:58:37

+0

這是否仍然準確? – Denis 2013-04-19 13:46:40

1

在服務器端,看是否有在計算領域的一個答案。如果不是,則計算它們。

1

正如Greg Hurlman所說,您應該自己在服務器上進行計算。這不僅僅是方便,其實有一個很好的理由。

客戶擁有的任何文件,他們有可能使用該文件。我不知道PDF表格的用途,但是它有可能以某種方式與錢相連,所以人們可能會通過計算顯示錯誤的結果來作弊。如果您信任在客戶端完成的計算,則無法檢測到它。

當您從客戶端收到PDF表單時,您應該重做所有計算,以便知道它們是正確的。然後,如果您也有客戶的版本進行比較,你應該檢查他們是否被擰緊。

不要以爲你的客戶是不值得信賴的?對你有好處,但證據不一致。我對編程的最早介紹之一就是開放模擬城市的遊戲存檔,爲自己提供更多資金。如果有機會以某種方式作弊,那麼在某些時候人們會嘗試。

2

我已經通過調用文檔對象的JavaScript方法calculateNow更新了我的PDF文件的所有計算領域。

根據土坯的JavaScript文件this.calculateNow();

部隊當前文檔中的所有計算領域的計算。

如果表單包含許多計算,則在用戶將數據輸入字段後,即使該數據不是計算字段,也可能會有明顯延遲。一種策略是在某個時刻關閉計算並稍後再打開它(請參閱示例)。

要包括與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(); 
} 
相關問題