使用iTextSharp检查PDF是否受密码保护

9

我希望检查一个pdf文件是否受密码保护以便查看。也就是我想知道这个pdf文件是否有用户密码。

我在一些论坛上找到了一些关于使用isencrypted函数的帮助,但它并没有给出正确的答案。

是否可能检查pdf是否受到密码保护?


我在某个论坛上找到了一些关于使用isencrypted函数的帮助,但它并没有给出正确的答案。-- 这听起来不太令人鼓舞。 - Robert Harvey
4个回答

17

使用PdfReader.IsEncrypted方法的问题在于,如果您尝试在需要密码的PDF上实例化一个PdfReader,并且您没有提供该密码,那么您将会得到一个BadPasswordException异常。

考虑到这一点,您可以编写如下的方法:

public static bool IsPasswordProtected(string pdfFullname) {
    try {
        PdfReader pdfReader = new PdfReader(pdfFullname);
        return false;
    } catch (BadPasswordException) {
        return true;
    }
}
请注意,如果您提供了无效的密码,则在尝试构造PdfReader对象时会得到相同的BadPasswordException异常。您可以使用此方法创建一个验证PDF密码的方法:
public static bool IsPasswordValid(string pdfFullname, byte[] password) {
    try {
        PdfReader pdfReader = new PdfReader(pdfFullname, password);
        return false;
    } catch (BadPasswordException) {
        return true;
    }
}

虽然它看起来不太美观,但据我所知,这是检查PDF是否受密码保护的唯一方法。希望有人能提供更好的解决方案。


不错的方法,对我很有用。我只是在你的代码上做了一点改动。在IsPasswordValid中,你使用了true和false返回值,导致密码有效时返回了false,反之亦然,这样的答案不够直观! - Abe
1
你应该更新示例,包括对PdfReader对象调用Dispose()方法。 - NickC
2
似乎打开时不再出现错误,等待您采取行动。有一个完全访问属性可以检查,以确定是否存在未提供的密码。 - workabyte

7
  private void CheckPdfProtection(string filePath)
        {
            try
            {
                PdfReader reader = new PdfReader(filePath);
                if (!reader.IsEncrypted()) return;
                if (!PdfEncryptor.IsPrintingAllowed(reader.Permissions))
                    throw new InvalidOperationException("the selected file is print protected and cannot be imported");
                if (!PdfEncryptor.IsModifyContentsAllowed(reader.Permissions))
                    throw new InvalidOperationException("the selected file is write protected and cannot be imported");
            }
            catch (BadPasswordException) { throw new InvalidOperationException("the selected file is password protected and cannot be imported"); }
            catch (BadPdfFormatException) { throw new InvalidDataException("the selected file is having invalid format and cannot be imported"); }
        }

2

参考:检查完整权限

你应该能够直接检查属性PdfReader.IsOpenedWithFullPermissions。

PdfReader r = new PdfReader("YourFile.pdf");
if (r.IsOpenedWithFullPermissions)
{
    //Do something
}

在处理密码保护的文件时,以下代码会在这一行产生异常 PdfReader r = new PdfReader("YourFile.pdf");。只需使用此代码检查一个密码保护的 PDF 文件即可。 - Md Kamruzzaman Sarker
检查这个受密码保护的文件...你可以看到异常尝试 { PdfReader r = new PdfReader("YourFile.pdf"); if (r.IsOpenedWithFullPermissions) { //做一些事情 } } catch(Exception ex) { MessageBox.Show(ex.ToString()); } - Md Kamruzzaman Sarker
2
@MdKamruzzamanPallob:请在您的问题中添加异常,好吗?(对于其他人来说,设置这个并不是一件容易的事情,所以他们不太可能这样做-在寻求帮助时,请详细并有益地回答问题!) - halfer

-1

如果有人需要帮助,这里是我在vb.net中使用的简单解决方案。使用fullpermissions进行检查的问题(如上所述)是您实际上无法打开防止您打开它的密码保护PDF。我在下面的代码中还有一些关于检查的内容。itextsharp.text.pdf实际上有一些你可能会发现有用的异常,如果这不是你需要的,请查看它。

Dim PDFDoc As PdfReader
Try
    PDFDoc = New PdfReader(PDFToCheck)
If PDFDoc.IsOpenedWithFullPermissions = False Then
   'PDF prevents things but it can still be opened. e.g. printing.
end if
Catch ex As iTextSharp.text.pdf.BadPasswordException
    'this exception means the PDF can't be opened at all. 
Finally 
    'do whatever if things are normal!
End Try

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接