首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何检查PDF是否已启用或未使用C#?

如何检查PDF是否已启用或未使用C#?
EN

Stack Overflow用户
提问于 2015-05-29 14:26:10
回答 2查看 1.7K关注 0票数 2

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

我正在windows应用程序中这样做。如果我单击一个按钮,事件将被触发,在文件夹中搜索PDF文件。此事件需要检查文件夹中的PDF是否为注释启用了Reader。如果是的话,我需要删除注释的使用权限,或者将PDF恢复到原来的版本。

我的代码只能在文件夹中找到PDF文件。我不知道如何检查选定的PDF是否已启用注释。请温和,并提出解决方案。

这是我的密码:

代码语言:javascript
复制
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---
        }
    }
}
EN

Stack Overflow用户

回答已采纳

发布于 2015-05-29 15:45:19

您想知道PDF是否启用了阅读器。读取器启用是通过添加称为使用权限(UR)签名的数字签名来建立的。如果有PdfReader实例,则可以通过使用hasUsageRights()方法检查是否启用了PDF阅读器:

代码语言:javascript
复制
PdfReader reader = new PdfReader(path_to_file);
boolean isReaderEnabled = reader.hasUsageRights();

使用权限可以包含许多不同的东西,例如允许人们评论,允许人们保存填写的表单,允许人们签署文档,.

要找出启用了哪些权限,您必须检查URUR3字典(请注意,UR是不推荐的,但仍然可能存在有UR字典的PDF):

代码语言:javascript
复制
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转换参数字典中的条目”。

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

代码语言:javascript
复制
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#不应该是个问题。

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

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

或者您必须移除设置/获取:

  • Java: object.setSomething(某物);
  • C#:object.Something =某物;
票数 2
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30532143

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档