如何使用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();
使用权可以包含许多不同的内容,例如允许人们发表评论,允许人们保存填写的表单,允许人们签署文档,……
要找出启用了哪些权限,您必须检查UR
或UR3
字典(请注意, 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启用注释,否则不启用。