使用 iTextSharp 填充其他字段时,如何强制 PDF 中的格式和计算?
-
19-08-2019 - |
题
我有一个包含多个文本字段的 PDF 表单。在这些字段中输入的值用于计算其他字段中的值(计算字段是只读的)。
当我在 Adobe Reader 中打开表单并填写字段时,计算字段会自动重新计算。
但是,我使用 iTextSharp 填写字段,展平生成的表单,然后通过网络将展平的表单流回给用户。
除了计算字段从不计算之外,该部分工作得很好。我假设由于没有用户触发的事件(例如按键或焦点或模糊)被触发,因此不会发生计算。
显然,我可以从可填写的表单中删除计算,并在填写字段时在服务器上完成所有计算,但我希望可填写的表单可供人类和服务器使用。
有谁知道如何强制计算?
编辑:我在这里并没有感受到太多 iText/iTextSharp 的爱......
以下是更多细节。将 stamper.AcroFields.GenerateAppearances 设置为 true 没有帮助。
我 思考 答案就在页面操作中的某个地方,但我不知道如何触发它......
解决方案
Paulo Soares(iText 的主要开发者之一,iTextSharp 的当前维护者) 说:
Itext不会付出任何努力来修复计算的字段,因为大多数时候都是不可能的。Pdfcopyfields对此有一些支持,有时有时起作用,有时行不通。
其他提示
我已经找到了如何做到这一点。请参阅我的回答对计算器的问题:
我已通过调用文档对象上的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();
}
在服务器端,看看是否有在计算字段一个答案。如果不是,计算它们。
由于格雷格Hurlman说,你应该自己做的计算在服务器上。这不仅仅是为了方便更多的,其实有一个很好的理由。
这客户有任何文件,它们与螺丝的潜力。我不知道什么是PDF表单是,但机会是它连接到的钱不知怎么的,所以可能存在人们通过使计算显示错误的结果作弊。如果你相信在客户端做了计算,你有没有探测它的方式。
当你从客户端收到的PDF格式,你应该重做所有的计算,让你知道他们是正确的。然后,如果你也有客户端的版本来比较,你应该检查它们是否已经拧合。
别以为你的客户是不值得信任的?好样的,但证据不同意。我的一个最早介绍给节目是开放的游戏存档的模拟城市给自己更多的钱。如果机会存在以某种方式作弊,那么在某些时候人会尝试。