我唯一的要求是在文件夹中找到一个选定的pdf是否启用了阅读器,更具体地说,如果使用权限是以允许人们添加注释(例如注释)的方式定义的。
我正在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---
}
}
}发布于 2015-05-29 15:45:19
您想知道PDF是否启用了阅读器。读取器启用是通过添加称为使用权限(UR)签名的数字签名来建立的。如果有PdfReader实例,则可以通过使用hasUsageRights()方法检查是否启用了PDF阅读器:
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,则不存在使用权限。如果只想检查是否启用了注释,则必须检查ur字典的条目。将有一个/Annots条目,其值为数组,数组的值包括创建、删除、修改、复制、导入、导出、联机和SummaryView。FOr对可能条目的全面概述,请参阅表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();
}不可能只删除注释的使用权限,同时保留其他使用权限(如果存在的话)。只要从/Annots或/UR3字典中删除/UR3条目,就会破坏启用使用权限的数字签名。此数字签名使用Adobe拥有的私钥创建,不允许第三方工具( Adobe产品除外)使用该密钥。
最后注:
所有代码片段都是用Java编写的,但是iTextSharp在C#中有相应的方法或属性。将代码段移植到C#不应该是个问题。
在许多情况下,将小写改为大写就足够了:
或者您必须移除设置/获取:
https://stackoverflow.com/questions/30532143
复制相似问题