【问题标题】:Get document properties from PDF in iTextSharp在 iTextSharp 中从 PDF 获取文档属性
【发布时间】:2014-01-17 00:47:29
【问题描述】:

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

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

但是,我现在需要更多信息,但无法在 iTextSharp 中找到它的暴露位置(如果它暴露)......我所追求的信息在下图中突出显示:

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

【问题讨论】:

    标签: c# pdf itextsharp


    【解决方案1】:

    对于使用标准密码加密的文档,您可以在使用PdfReader pdfReader 打开文件后检索权限

    • getPermissions() 在 iText/Java 的情况下

        int permissions = pdfReader.getPermissions()
      
    • Permissions 在 iTextSharp/.Net 的情况下

        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 规范中的第 7.6.3.2 节“标准加密字典”ISO 32000-1

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

    关于您制作的对话框截图,请注意,有效允许的操作不仅取决于 PDF 文档,还取决于 PDF 查看器!否则你可能会和this question的OP陷入同一个陷阱。

    【讨论】:

      【解决方案2】:

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

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

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

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

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

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

      【讨论】:

      • 好的,这是方便的方法... ;-) 另一方面,P 值本身不足以满足其中一些测试,请参见上表,解释不同的安全处理程序版本不同。
      猜你喜欢
      • 1970-01-01
      • 2019-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-17
      • 1970-01-01
      相关资源
      最近更新 更多