iTextsharp PDF 文档属性

Posted

技术标签:

【中文标题】iTextsharp PDF 文档属性【英文标题】:iTextsharp PDF Document Properties 【发布时间】:2016-12-01 07:03:56 【问题描述】:

在上传 PDF 过程开始之前,我需要检查 PDF 是否具有以下属性,

1) PDF 不应受密码保护 2) PDF 不应具有文档属性 - 页面提取 & 内容复制 & 内容复制以实现辅助功能不允许。

我可以使用 PdfReader IsEncrypted 属性检查 PDF 是否受密码保护。但是当 PDF 没有设置安全方法时,我如何检查上述文档属性。权限仅在文档被加密时才有用。 (使用 iTextsharp dll)

【问题讨论】:

【参考方案1】:

PDF 可以用不同的方式加密。最常见的方法是添加一两个密码:

    所有者密码:每个人都可以打开 PDF,但可能有适当的权限。 用户密码:只有知道用户密码或所有者密码的人才能打开文档。

如果设置了用户密码,iText 将无法打开文档,并且会抛出 BadPasswordException

public static boolean isPasswordProtected(string file) 
    try 
        PdfReader pdfReader = new PdfReader(file);
        return false;
     catch (BadPasswordException bpe) 
        return true;
    

如果只有所有者密码,那么您可以通过设置特殊参数来忽略该密码。见Can I use iText to merge PDF's with Permissions

PdfReader.unethicalreading = true;

请注意,PdfReader 也有一个 isEncrypted() 方法,请参阅“iText in Action - Second Edition”第 6 章中的 PageInformation 示例。

这回答了您问题的第一部分:如何检查 PDF 是否已加密?

关于权限:打开受密码保护的 PDF 后,您可以使用getPermissions() 方法了解哪些权限已到位:

PdfReader pdfReader = new PdfReader(file);
int permissions = pdfReader.getPermissions();

这个int 实际上是一个bitset。 PdfEncryptor 类有一个方法 getPermissionsVerbose() 解释每个位的含义:

public static String More ...getPermissionsVerbose(int permissions) 
    StringBuffer buf = new StringBuffer("Allowed:");
    if ((PdfWriter.ALLOW_PRINTING & permissions) == PdfWriter.ALLOW_PRINTING) buf.append(" Printing");
    if ((PdfWriter.ALLOW_MODIFY_CONTENTS & permissions) == PdfWriter.ALLOW_MODIFY_CONTENTS) buf.append(" Modify contents");
    if ((PdfWriter.ALLOW_COPY & permissions) == PdfWriter.ALLOW_COPY) buf.append(" Copy");
    if ((PdfWriter.ALLOW_MODIFY_ANNOTATIONS & permissions) == PdfWriter.ALLOW_MODIFY_ANNOTATIONS) buf.append(" Modify annotations");
    if ((PdfWriter.ALLOW_FILL_IN & permissions) == PdfWriter.ALLOW_FILL_IN) buf.append(" Fill in");
    if ((PdfWriter.ALLOW_SCREENREADERS & permissions) == PdfWriter.ALLOW_SCREENREADERS) buf.append(" Screen readers");
    if ((PdfWriter.ALLOW_ASSEMBLY & permissions) == PdfWriter.ALLOW_ASSEMBLY) buf.append(" Assembly");
    if ((PdfWriter.ALLOW_DEGRADED_PRINTING & permissions) == PdfWriter.ALLOW_DEGRADED_PRINTING) buf.append(" Degraded printing");
    return buf.toString();

例如,如果你想知道是否允许组装,你需要检查PdfWriter.ALLOW_ASSEMBLY & permissions的值。

【讨论】:

可以在不加密文档的情况下对文档设置这些权限吗?我不知道这是如何工作的。我的目的是检查文档属性,无论文档是否受保护。 @user7121382 “可以在不加密文档的情况下对文档设置这些权限吗?”这些权限到底是哪些?正如我在回复您的prior question 时试图解释的那样,某些权限确实只能设置为加密的一部分(即使 PDF 查看器用户可能无法识别加密,因为使用了默认密码)。

以上是关于iTextsharp PDF 文档属性的主要内容,如果未能解决你的问题,请参考以下文章

iText7 将 HTML 转换为 PDF“System.NullReferenceException”。

c# itextsharp PDF 创建每个页面上都有水印

使用 iTextSharp 添加水印文本时,PAC 工具中出现 iText 7 警告

iTextsharp PDF 文档属性

iTextsharp 将语言添加到 PDF 文档

iTextSharp 创建页脚页 # of #