我使用itextsharp 5.5来设置pdf中几个非计算字段的字段值。 pdf还包含计算值。我想要做的是计算计算值,然后将所有字段设为只读,以便打开pdf的用户不再编辑这些值。
我已设法使用
获取计算值pdfStamper.JavaScript = "this.calculateNow();";
但这会使字段可编辑。使用
pdfStamper.FormFlattening = true;
使字段为只读,但会再次删除计算值。即使我只计算,将pdf保存为临时文件,打开临时文件并将FormFlattening设置为true再次保存,最终的pdf不再具有计算值。
有趣的是,如果我将FormFlattening设置为false并且不包含行pdfReader.RemoveUsageRights();
生成的pdf给出错误"此文档在Adobe Reader中启用了扩展功能。该文档自创建以来已被更改,并且不再使用扩展功能"在Adobe Reader中打开时,但在关闭该错误消息后,pdf看起来没问题,计算字段将被填充,文档将根据需要为只读。但是,由于生成的pdf将被分发,让它们全部抛出错误消息不是解决方案。
所以我的问题是,是否有任何方法可以使用FormFlattening同时保留当前计算的字段值?还有另一种方法可以将字段设为只读吗?当我没有包含RemoveUsageRights我可以使用的内容时,或者这些字段是否因为错误而无法编辑?
答案 0 :(得分:0)
我通过使用
将PDF中的所有字段设置为只读来找到解决方法foreach (var key in pdfFormFields.Fields.Keys){
pdfFormFields.SetFieldProperty(key, "setfflags", PdfFormField.FF_READ_ONLY, null);
}
这可以保留计算值,同时防止进一步编辑。但它不是很整洁,并且Adobe Reader总是认为该文件很脏并且在尝试在打开PDF时关闭Reader时会提示保存对话框。因此,我仍然愿意接受更好的想法(或使用此解决方案修复保存提示)。