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

How to Check PDF is Reader enabled or not using C#?

我唯一的要求是在文件夹中找到选定的 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 已启用。 Reader 启用是通过添加称为 使用权 (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 的 Table 255 "Entries in the UR transform parameters dictionary"。

您可以像这样删除所有使用权限:

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 条目将破坏启用使用权限的数字签名。此数字签名是使用 Adob​​e 拥有的私钥创建的,不允许任何第三方工具(Adobe 产品除外)使用该密钥。

最后说明:

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

在很多情况下,将小写字母转换为大写字母就足够了:

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

或者您必须删除 set/get:

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

感谢所有对我的问题产生影响的人。我终于以类似的方式找到了答案,方法是阅读 PDF 并检查特定字符串(如果在 PDF 上启用了评论,则显示特定字符​​串)。

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