11

我正在尝试使用 iText 的 PdfReader 来检查给定的 PDF 文件是否受密码保护,但出现此异常:

线程“主线程”中的异常 java.lang.NoClassDefFoundError:org/bouncycastle/asn1/ASN1OctetString

但是当针对非密码保护文件测试相同的代码时,它运行良好。这是完整的代码:

try {
    PdfReader pdf = new PdfReader("C:\\abc.pdf");
} catch (IOException e) {
    e.printStackTrace();
}
4

8 回答 8

7

在旧版 PDFBox

try
{
    InputStream fis = new ByteArrayInputStream(pdfBytes);                       
    PDDocument doc = PDDocument.load(fis);

    if(doc.isEncrypted())
    {
      //Then the pdf file is encrypeted.
    }
}

在较新版本的 PDFBox 中(例如 2.0.4)

    InputStream fis = new ByteArrayInputStream(pdfBytes);
    boolean encrypted = false;
    try {
        PDDocument doc = PDDocument.load(fis);
        if(doc.isEncrypted())
            encrypted=true;
        doc.close();
    }
    catch(InvalidPasswordException e) {
        encrypted = true;
    }
    return encrypted;
于 2017-03-16T02:05:08.110 回答
6

从这里使用 Apache PDFBox - Java PDF 库:
示例代码:

try
{
    document = PDDocument.load( "C:\\abc.pdf");

    if(document.isEncrypted())
    {
      //Then the pdf file is encrypeted.
    }
}
于 2013-04-09T08:29:41.907 回答
6

我这样做的方法是尝试在PdfReader不传递密码的情况下读取 PDF 文件。如果文件受密码保护,BadPasswordException则会抛出 a。这是使用 iText 库。

于 2013-04-09T08:52:41.917 回答
5

这是一个不需要 3rd 方库的解决方案,使用 PdfRenderer API。

 fun checkIfPdfIsPasswordProtected(uri: Uri, contentResolver: ContentResolver): Boolean {
    val parcelFileDescriptor = contentResolver.openFileDescriptor(uri, "r")
        ?: return false
    return try {
        PdfRenderer(parcelFileDescriptor)
        false
    } catch (securityException: SecurityException) {
        true
    }
}

参考:https ://developer.android.com/reference/android/graphics/pdf/PdfRenderer

于 2019-01-31T16:16:52.543 回答
4
try {
    PdfReader pdfReader = new PdfReader(String.valueOf(file));
    pdfReader.isEncrypted();
} catch (IOException e) {
    e.printStackTrace();
}

您可以使用 iText PDF 库进行检查。如果它发生异常处理它(要求输入密码)

于 2018-11-28T06:20:58.470 回答
2

试试这个代码:

    boolean isProtected = true;
    PDDocument pdfDocument = null;
    try
    {
        pdfDocument = PDDocument.load(new File("your file path"));
        isProtected = false;

    }
    catch(Exception e){
        LOG.error("Error while loading file : ",e);
    }
    Syste.out.println(isProtected);

如果您的文档受密码保护,则它无法加载文档并抛出 IOException。使用验证上述代码pdfbox-2.0.4.jar

于 2017-01-24T05:33:58.283 回答
1
public boolean checkPdfEncrypted(InputStream fis) throws IOException {
    boolean encrypted = false;
    try {
        PDDocument doc = PDDocument.load(fis);
        if (doc.isEncrypted())
            encrypted = true;
        doc.close();
    } catch (
            IOException e) {
        encrypted = true;
    }
    return encrypted;
}

注意:在 iText 中存在一个极端情况,一些文件被加密保护但没有密码打开,读取这些文件并像这样添加水印

PdfReader reader = new PdfReader(src);
reader.setUnethicalReading(true);
于 2021-04-27T18:28:44.760 回答
0

我不想使用任何第三方库,所以我使用了这个 -

            try {
                new PdfRenderer(ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY));
            } catch (Exception e) {
                e.printStackTrace();
                // file is password protected
            }

如果文件受密码保护,我没有使用它。

于 2021-03-30T09:33:03.300 回答