如何使用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<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();

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

要找出哪些权限是启用的,您必须检查URUR3字典(注意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是启用注释的,否则不启用。

最新更新