展平pdf

时间:2017-08-08 15:32:41

标签: c# pdf itext visual-studio-2017

我使用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我可以使用的内容时,或者这些字段是否因为错误而无法编辑?

1 个答案:

答案 0 :(得分:0)

我通过使用

将PDF中的所有字段设置为只读来找到解决方法
foreach (var key in pdfFormFields.Fields.Keys){
  pdfFormFields.SetFieldProperty(key, "setfflags", PdfFormField.FF_READ_ONLY, null);
}

这可以保留计算值,同时防止进一步编辑。但它不是很整洁,并且Adobe Reader总是认为该文件很脏并且在尝试在打开PDF时关闭Reader时会提示保存对话框。因此,我仍然愿意接受更好的想法(或使用此解决方案修复保存提示)。