我唯一的要求是在文件夹中找到选定的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<ListViewItem> files = new List<ListViewItem>();
foreach (string filePath in filePaths)
{
---need to check comment enabled or not---
}
}
}
您想知道PDF是否启用了Reader。阅读器启用是通过添加一个称为Usage Rights (UR)签名的数字签名来建立的。如果您有一个PdfReader
的实例,您可以使用hasUsageRights()
方法检查PDF是否启用了Reader:
PdfReader reader = new PdfReader(path_to_file);
boolean isReaderEnabled = reader.hasUsageRights();
使用权可以包含许多不同的内容,例如允许人们发表评论,允许人们保存填写好的表格,允许人们签署文件,……
要找出哪些权限是启用的,您必须检查UR
或UR3
字典(注意UR
已被弃用,但可能仍然有pdf有UR
字典):
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
,则没有使用权。如果您只想检查是否启用了注释,则必须检查ur
字典的条目。将有一个/Annots
条目,其值为一个数组,其值包括创建,删除,修改,复制,导入,导出,在线和汇总视图。对于可能条目的完整概述,请参见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(东西);
- c#: object.Add(东西);
或者你必须删除set/get:
- Java: object.setSomething(东西);
- c#:对象。
感谢所有回答我问题的人。我最终以类似的方式找到了答案,通过阅读PDF并检查特定字符串(如果PDF上启用了注释,则显示特定字符串)。
特定字符串以/Annot .....开头首先,我阅读PDF通过系统。IO,然后存储在一个字符串中并查找特定的字符串,如果搜索字符串可用,则PDF是启用注释的,否则不启用。