【问题标题】:How to Check PDF is Reader enabled or not using C#?如何使用 C# 检查 PDF 是否启用阅读器?
【发布时间】:2015-08-12 11:18:57
【问题描述】:

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

我在 Windows 应用程序中执行此操作。如果我单击一个按钮,则会触发一个事件,在文件夹中搜索 PDF 文件。此事件需要检查文件夹中的 PDF 是否为 cmets 启用了 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 都启用了注释,因为 Adob​​e Reader 不再要求文档启用 Reader 以便人们能够添加 cmets。另一种选择是您指的是通过加密设置的权限,但在这种情况下,您的问题就更没有意义了,因为不清楚您将如何处理加密文件以使其不再启用评论。这个问题在目前的状态下是无法回答的。如果不明确,则应以“不清楚”的形式关闭。
  • 如果您询问编写您的需求的人她/他的意思以及她/他希望通过删除“评论启用”来实现什么,这将有所帮助。除非您了解命令的意图,否则切勿服从命令。
  • 感谢布鲁诺的建议和澄清。实际上生成的pdf默认是不启用评论的,在acrobat文件>另存为>阅读器扩展PDF>在Adobe Reader中启用评论,帮助读者标记cmet。所以我需要以编程方式检查该文件是否启用了注释?我希望我已经表明了我的观点......
  • 我试图解释的是,Adobe Reader 现在允许最终用户将 cmets 添加到 any PDF,无论它是否启用了 Reader。删除阅读器启用不会帮助您阻止用户添加 cmets...
  • 我已经用 Java 回答了你的问题。将 Java 转换为 C# 对您来说应该没有问题。

标签: c# pdf itextsharp pdfbox


【解决方案1】:

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

PdfReader reader = new PdfReader(path_to_file);
boolean isReaderEnabled = reader.hasUsageRights();

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

要找出启用了哪些权限,您必须检查 URUR3 字典(请注意,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 条目,其值为一个数组,其值包括 Create、Delete、Modify、Copy、Import、Export、Online 和 SummaryView。有关可能条目的完整概述,请参阅 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 条目将破坏启用使用权限的数字签名。此数字签名是使用 Adob​​e 拥有的私钥创建的,不允许第三方工具(Adobe 产品除外)使用该密钥。

最后说明:

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

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

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

或者你必须删除设置/获取:

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

【讨论】:

  • 感谢 Bruno 的努力,我是 C# 的初学者,我需要做 R 和 D。请稍等,如果我需要任何建议,我会尽快回复您。
  • Bruno,我今天才开始检查,我在 c# 中尝试过,但 pdfreader 没有 hasUsageRights() 属性。你能帮忙吗?我只需要检查 pdf 是否启用了评论(通过 acrobat 专业版激活),如果启用了 pdf,我需要删除特定任务。
  • @@Bruno Lowagie,只需要检查pdf是否启用,如果启用阅读器可以在工具菜单中看到cmets和测量工具菜单,如果没有启用cmets和测量工具是在菜单中不可用。我的意思是检查所选的 pdf 是否启用评论。
  • 你能确认这应该只检查启用的评论吗?我在一个过程中将 java 转换为 C#,但遇到了一些错误
  • [复制/粘贴回复:] 整个星期我都在新加坡参加 Communicasia 会议。如果您还有其他问题,因此我今天无法回答您的问题。 [额外评论:] 我不知道你在说什么。 iTextSharp 是您唯一的希望,但如果您想完成这项工作,您要么必须自己找到解决方案。如果您希望其他人解决您的问题,请雇用其他人来帮助您。
【解决方案2】:

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

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

【讨论】:

  • 这是完全错误的。 Annot 是页面字典中用于页面上的一组注释的键。因此,您所做的所有测试都是检查当前是否文档中是否有任何注释(甚至不正确,因为可能同时存在误报和误报)。有许多工具可以添加注释而不需要启用阅读器的文档,启用阅读器的文档还不需要注释。
  • 这是对的,我没有包含完整的关键字@mkl。我提到像 Annots..,这就是注释启用 pdf 将包含的关键,Annots[/Create/Delete/Modify/Copy/Import/Export
  • 这仍然不是一个确定的事情,也许下一个 Acrobat 会以根据 PDF 语法等效的方式更改字符串表示的细节。将 PDF 视为简单文本文件的算法通常会在一段时间后中断或从野外获得足够的输入..
  • @mkl,我正在为我当前的问题寻找解决方案,我会检查并更新未来的变化。感谢您的建议
猜你喜欢
  • 1970-01-01
  • 2013-04-04
  • 2013-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-24
  • 2017-05-27
相关资源
最近更新 更多