如何使用C#检查PDF是否启用了Reader?

我唯一的要求是在文件夹中找到选定的pdf是否启用了Reader,更具体地说,如果以允许人们添加注释(例如注释)的方式定义使用权限。

我在Windows应用程序中这样做。 如果单击某个按钮,则会触发一个事件,在文件夹中搜索PDF文件。 此事件需要检查文件夹中的PDF是否启用了Reader以进行注释。 如果是,我需要删除评论使用权或将PDF还原为其原始版本。

我的代码只能在文件夹中找到PDF文件。 我不知道如何检查选定的PDF是否启用了评论。 请温柔并提出解决方案。

这是我的代码:

private void button1_Click(object sender, EventArgs e) { { string[] filePaths = Directory.GetFiles("D:\\myfolder\\pdffolder"); List files = new List(); foreach (string filePath in filePaths) { ---need to check comment enabled or not--- } } } 

您想知道PDF是否启用了Reader。 通过添加称为使用权利(UR)签名的数字签名来建立读者启用。 如果您有PdfReader的实例, PdfReader可以使用hasUsageRights()方法检查PDF是否启用了Reader:

 PdfReader reader = new PdfReader(path_to_file); boolean isReaderEnabled = reader.hasUsageRights(); 

使用权可以包含许多不同的内容,例如允许人们发表评论,允许人们保存填写的表单,允许人们签署文档,……

要找出启用了哪些权限,您必须检查URUR3字典(请注意, UR已被弃用,但可能仍存在具有UR字典的PDF):

 PdfDictionary catalog = reader.getCatalog(); PdfDictionary perms = catalog.getAsDict(PdfName.PERMS); PdfDictionary ur = null; if (perms != null) { PdfDictionary ur = perms.getAsDict(PdfName.UR); if (ur == null) ur = perms.getAsDict(PdfName.UR3); } } 

如果ur保持为null ,则没有使用权限。 如果您只想检查是否启用了注释,则必须检查您的词典的条目。 将有一个/Annots条目,其值为一个数组,其值包括Create,Delete,Modify,Copy,Import,Export,Online和SummaryView。 有关可能条目的完整概述,请参阅ISO-32000-1的表255“UR变换参数字典中的条目”。

您可以删除所有使用权限,如下所示:

 PdfReader reader = new PdfReader(path_to_file); if (reader.hasUsageRights()) { reader.removeUsageRights(); PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(path_to_new_file)); stamper.close(); } 

在保留其他使用权利(如果存在)的同时, 不可能仅删除评论的使用权限。 只需从/UR/UR3字典中删除/Annots条目就会破坏启用使用权限的数字签名。 此数字签名是使用Adobe拥有的私钥创建的,并且不允许使用该密钥的第三方工具(Adobe产品除外)。

最后说明:

所有代码片段都是用Java编写的,但iTextSharp在C#中有相应的方法或属性。 将片段移植到C#应该不是问题。

在许多情况下,将小写更改为大写就足够了:

  • Java:object.add(something);
  • C#:object.Add(something);

或者你必须删除set / get:

  • Java:object.setSomething(something);
  • C#:object.Something = something;

感谢所有对我的问题生效的人。 我终于以类似的方式通过阅读PDF并检查特定字符串找到答案(如果在PDF上启用了注释,则会显示特定字符​​串)。

特定字符串以/ Annot …..开头,首先我通过System.IO读取PDF,然后存储在字符串中并查找特定字符串,如果搜索字符串可用,则PDF启用注释,否则不启用。