从iTextSharp中的PDF获取文档属性

时间:2014-01-16 11:57:33

标签: c# pdf itextsharp

我正在尝试从PDF文件中获取一些信息。我尝试过使用PdfSharp,它具有我需要的信息属性,但它无法打开iref流,所以我不得不放弃它。

相反,我正在尝试iTextSharp。到目前为止,我已经设法从Info数组中获取一些基本信息,如标题,aurhor和subject。

然而,我现在正在获取更多信息,但无法在iTextSharp中找到它所暴露的位置(如果它已暴露)....我所追踪的信息在下图中突出显示:

Info I Need

我无法弄清楚这些信息的存储位置。任何和所有的帮助将不胜感激。

2 个答案:

答案 0 :(得分:7)

对于使用标准密码加密加密的文档,您可以使用

PdfReader pdfReader中打开文件后检索权限
    在iText / Java

    的情况下,
  • getPermissions()

    int permissions = pdfReader.getPermissions()
    
  • 在iTextSharp / .Net

    的情况下,
  • Permissions

    int permissions = pdfReader.Permissions
    

返回的int值是包含

的加密字典的 P
  

一组标志,指定在用户访问权限打开文档时允许哪些操作(参见表22)。

     

[...]

     

P 条目的值应解释为无符号32位数量,其中包含一组标志,指定在用户访问权限打开文档时应授予哪些访问权限。表22显示了这些标志的含义。标志字内的位位置应从1(低位)到32(高位)编号。任何位置的1位都应启用相应的访问权限。

     

[...]

     

位位置含义

     

3 (修订版2的安全处理程序)打印文档。 (版本3或更高版本的安全处理程序)打印文档(可能不是最高质量级别,具体取决于是否还设置了第12位)。

     

4 通过第6,9和11位控制的操作以外的操作修改文档的内容。

     

5 (修订版2的安全处理程序)复制或以其他方式从文档中提取文本和图形,包括提取文本和图形(以支持残障用户的辅助功能)或用于其他目的)。 (修订版3或更高版本的安全处理程序)通过非由第10位控制的操作复制或以其他方式从文档中提取文本和图形。

     

6 添加或修改文本注释,填写交互式表单域,如果还设置了第4位,则创建或修改交互式表单域(包括签名域)。

     

9 (修订版3或更高版本的安全处理程序)即使第6位清除,也要填写现有的交互式表单字段(包括签名字段)。

     

10 (修订版3或更高版本的安全处理程序)提取文本和图形(支持残疾用户或其他用户的辅助功能)。

     

11 (修订版3或更高版本的安全处理程序)组装文档(插入,旋转或删除页面并创建书签或缩略图),即使第4位也是如此很清楚。

     

12 (修订版3或更高版本的安全处理程序)将文档打印到可以生成PDF内容的忠实数字副本的表示中。当该位清零(并且设置了第3位)时,打印仅限于外观的低级表示,可能是质量下降。

     

(PDF规范ISO 32000-1中的第7.6.3.2节“标准加密字典”)

您可以在此上下文中使用PdfWriter.ALLOW_*常量。

关于您所做的对话框截图,请注意,有效允许的操作不仅取决于PDF文档,还取决于PDF查看器!否则,您可能会遇到与this question的OP相同的陷阱。

答案 1 :(得分:1)

感谢mkl的答案,这是故事的一部分,但这是你帮我找到的答案:

using (var pdf = new PdfReader(File))
{
   Console.WriteLine(PdfEncryptor.IsModifyAnnotationsAllowed(pdf.Permissions));
}

PdfEncryptor是缺少的,它将P值转换为一个简单的bool,表示是或否。其他方法有:

  • IsAssemblyAllowed
  • IsCopyAllowed
  • IsDegradedPrintingAllowed
  • IsFillInAllowed
  • IsModifyAnnotationsAllowed
  • IsModifyContentsAllowed
  • IsPrintingAllowed
  • IsScreenReadersAllowed

至于安全方法部分,这就是我的用途:

using (var pdf = new PdfReader(File))
{
   Console.WriteLine(!pdf.IsOpenedWithFullPermissions == Expected);
}