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

时间:2015-05-29 14:26:10

标签: c# pdf itextsharp pdfbox

我唯一的要求是在文件夹中找到选定的pdf是否启用了阅读器,更具体地说,如果以允许人们添加注释(例如评论)的方式定义使用权限,则更具体地说。

我在Windows应用程序中这样做。如果单击某个按钮,将触发一个事件,在文件夹中搜索PDF文件。此事件需要检查文件夹中的PDF是否启用了Reader以进行注释。如果是,我需要删除评论使用权或将PDF恢复为原始版本。

我的代码只能在文件夹中找到PDF文件。我不知道如何检查所选PDF是否启用了评论。请保持温和并建议解决方案。

这是我的代码:

class Request {
    // other methods

    send(method, url, args, body) {
        return new Promise((res, rej) => {  // it's good that new Promise is the first
            let xhr = new XMLHttpRequest(); // line since it's throw-safe. This is why it
            xhr.open(method, url);          // was chosen for the API and not deferreds

            xhr.onload = () => {
                // This _needs_ a try/catch, it will fail if responseText
                // is invalid JSON and will throw to the global scope instead of rejecting
                res(JSON.parse(xhr.responseText));
            };

            xhr.onerror = () => {
                let status = xhr.status;
                switch (status) {
                case 401:
                    // this _must_ be a reject, it should also generally be surrounded
                    // with a try/catch
                    rej(new UnauthorizedError(url));
                }
            };

            xhr.send(); // it's important that this is in the promise constructor
        });
    }
}

2 个答案:

答案 0 :(得分:2)

您想知道PDF是否启用了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条目,其值为一个数组,其值包括Create,Delete,Modify,Copy,Import,Export,Online和SummaryView。有关可能条目的完整概述,请参阅表255和#34; UR变换参数字典中的条目" ISO-32000-1。

您可以删除所有使用权限,如下所示:

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/UR字典中删除/UR3条目,即可破坏启用使用权限的数字签名。此数字签名是使用Adobe拥有的私钥创建的,并且不允许第三方工具(Adobe产品除外)使用该密钥。

最后说明:

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

在许多情况下,将小写字母改为大写字母就足够了:

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

或者你必须删除set / get:

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

答案 1 :(得分:0)

感谢所有对我的问题生效的人。我终于以类似的方式通过阅读PDF并检查特定字符串找到了答案(如果在PDF上启用了注释,则会显示特定字符​​串。)

特定字符串以/ Annot .....开头,首先我通过System.IO读取PDF,然后存储在字符串中并查找特定字符串,如果搜索字符串可用,那么PDF将启用注释不