如何使用 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();
使用权可以包含许多不同的东西,例如允许人们发表评论、允许人们保存填写的表格、允许人们签署文档……
要找出启用了哪些权限,您必须检查 UR
或 UR3
字典(请注意 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
条目将破坏启用使用权限的数字签名。此数字签名是使用 Adobe 拥有的私钥创建的,不允许任何第三方工具(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是否启用评论,否则不启用。
我唯一的要求是在文件夹中找到选定的 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();
使用权可以包含许多不同的东西,例如允许人们发表评论、允许人们保存填写的表格、允许人们签署文档……
要找出启用了哪些权限,您必须检查 UR
或 UR3
字典(请注意 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
条目将破坏启用使用权限的数字签名。此数字签名是使用 Adobe 拥有的私钥创建的,不允许任何第三方工具(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是否启用评论,否则不启用。