C# 在使用iTextSharp填充其他字段时,如何强制PDF格式和计算?

C# 在使用iTextSharp填充其他字段时,如何强制PDF格式和计算?,c#,pdf,pdf-generation,itextsharp,itext,C#,Pdf,Pdf Generation,Itextsharp,Itext,我有一个带有许多文本字段的PDF表单。这些字段中输入的值用于计算其他字段中的值(计算字段为只读) 当我在Adobe Reader中打开表单并填写字段时,计算字段会自动重新计算 但是,我使用iTextSharp填充字段,展平生成的表单,然后通过web将展平的表单流回到用户 除了计算字段从不计算外,该部分工作正常。我假设由于没有触发用户触发的事件(如按键、聚焦或模糊),因此计算不会发生 显然,我可以从可填充表单中删除计算,并在填充字段时在服务器上完成所有计算,但我希望可填充表单既可供服务器使用,也可

我有一个带有许多文本字段的PDF表单。这些字段中输入的值用于计算其他字段中的值(计算字段为只读)

当我在Adobe Reader中打开表单并填写字段时,计算字段会自动重新计算

但是,我使用iTextSharp填充字段,展平生成的表单,然后通过web将展平的表单流回到用户

除了计算字段从不计算外,该部分工作正常。我假设由于没有触发用户触发的事件(如按键、聚焦或模糊),因此计算不会发生

显然,我可以从可填充表单中删除计算,并在填充字段时在服务器上完成所有计算,但我希望可填充表单既可供服务器使用,也可供人使用

有人知道如何强制计算吗

编辑: 我在这里感觉不到太多的爱

这里有一些更多的细节。将stamper.AcroFields.GenerateAppearances设置为true没有帮助


我想答案就在页面操作的某个地方,但我不知道如何触发它…

在服务器端,查看计算字段中是否有答案。如果没有,请计算它们。

保罗·索雷斯(iText的主要开发者之一,目前是iTextSharp的维护者):

iText不做任何努力来修复 计算字段,因为大多数 这是不可能的。PdfCopyFields 有人支持有时候 工作,有时不工作


正如Greg Hurlman所说,您应该自己在服务器上进行计算。这不仅仅是为了方便,事实上这是一个很好的理由

客户拥有的任何文件都有可能被篡改。我不知道PDF表格是做什么用的,但很有可能它与金钱有某种联系,因此人们可能会通过让计算结果显示错误的结果来作弊。如果您信任在客户端完成的计算,则无法检测到它

当您从客户端收到PDF表单时,您应该重新进行所有计算,以便知道它们是正确的。然后,如果你也有客户的版本进行比较,你应该检查他们是否被欺骗了


你不觉得你的客户那么不可信吗?对你有好处,但证据不一致。我对编程的最早介绍之一是为SimCity打开savegames,给自己更多的钱。如果存在以某种方式作弊的机会,那么在某个时候人们会尝试。

我已经想出了如何做到这一点。有关stackoverflow问题,请参见我的答案:


通过调用Doc对象上的javascript方法calculateNow,我已经更新了PDF的所有计算字段

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

这是一个很好的答案,但在本例中,我已经有了一个表单来进行计算,我的意图是,对于我在服务器上填写的表单,在填写后将其展平,并以不可修改的形式提供它们。计算很复杂,我想利用已经存在的东西。是的,写两次相同的计算很痛苦,但追踪丢失的美元也是如此。这不是一个令人满意的答案,但这正是我所寻找的-至少这是它不起作用的确凿证据,我可以继续做其他事情……是的。iText必须支持Acrobat的JavaScript对象模型(与HTML的DOM完全不同)。除非有人来给iText软件(很多钱)让它实现,否则这是极不可能的。这是一项艰巨的工作。@Denis不知道,很久没有使用iText/iTextSharp了。但是,正如其他答案所说,自己进行计算是个好主意。由于OP在pdf查看器中打开表单之前将表单展平,添加js调用对他没有帮助。