iTextsharp PDF文档属性

时间:2016-12-01 07:03:56

标签: c# itext pdf-reader

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

1)PDF不应受密码保护 2)PDF不应具有文档属性 - 页面提取&内容复制&无法访问内容复制的可访问性。

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

1 个答案:

答案 0 :(得分:1)

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

  1. 所有者密码:每个人都可以打开PDF,但可能有适当的权限。
  2. 用户密码:只有知道用户密码或所有者密码的人才能打开文档。
  3. 如果有用户密码,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 - 第二版的第6章中的PageInformation示例。"

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

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

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

    这个int实际上是一个比特。 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的值。