我唯一的要求是在文件夹中找到选定的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
});
}
}
答案 0 :(得分:2)
您想知道PDF是否启用了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
条目,其值为一个数组,其值包括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#不应该是一个问题。
在许多情况下,将小写字母改为大写字母就足够了:
或者你必须删除set / get:
答案 1 :(得分:0)
感谢所有对我的问题生效的人。我终于以类似的方式通过阅读PDF并检查特定字符串找到了答案(如果在PDF上启用了注释,则会显示特定字符串。)
特定字符串以/ Annot .....开头,首先我通过System.IO读取PDF,然后存储在字符串中并查找特定字符串,如果搜索字符串可用,那么PDF将启用注释不