6

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

当我在 Adob​​e Reader 中打开表单并填写字段时,计算的字段会自动重新计算。

但是,我正在使用 iTextSharp 填写字段,展平生成的表单,然后将展平的表单通过网络流回给用户。

这部分工作得很好,除了计算的字段从不计算。我假设由于没有触发用户触发的事件(如按键或焦点或模糊),因此不会发生计算。

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

有谁知道如何强制计算?

编辑:我在这里感觉不太喜欢 iText/iTextSharp...

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

认为答案在于页面操作中的某个地方,但我不知道如何触发它......

4

5 回答 5

5

Paulo Soares(iText 的主要开发者之一和 iTextSharp 的当前维护者)

iText 不会做任何努力来修复计算字段,因为大多数时候这是不可能的。PdfCopyFields 对它有一些支持,有时有效,有时无效。

于 2009-02-01T15:31:24.803 回答
3

我通过在 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();
}
于 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 表格时,您应该重做所有计算,以便您知道它们是正确的。然后,如果您还有要比较的客户端版本,您应该检查它们是否被搞砸了。

你不觉得你的客户那么不可靠吗?对你有好处,但证据不同意。我最早对编程的介绍之一是为 SimCity 开放存档游戏,以便给自己更多的钱。如果存在以某种方式作弊的机会,那么在某些时候人们会尝试它。

于 2009-02-01T17:18:29.267 回答