4

PDFファイルがパスワードで保護されているかJavaで保護されていないかを確認するには? これを行うことができるいくつかのツール/ライブラリを知っていますが、Javaでプログラムするだけでこれが可能かどうか知りたいです.

4

5 に答える 5

3

PDFBoxを使用できます。

http://pdfbox.apache.org/

コード例:

try
{
    document = PDDocument.load( yourPDFfile );

    if( document.isEncrypted() )
    {
      //ITS ENCRYPTED!
    }
}

Mavenを使用していますか?

<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox</artifactId>
    <version>2.0</version>
</dependency>
于 2013-02-11T06:26:01.877 に答える
3

アップデート

この回答の下の mkl のコメントによると、仕様で許可されている PDF 構造には 2 つのタイプがあるようです: (1) 相互参照テーブル (2) 相互参照ストリーム。次の解決策は、最初のタイプの構造のみを扱います。この回答は、2 番目のタイプに対処するために更新する必要があります。

====

上記の回答はすべて、OPがすでに認識しているサードパーティのライブラリを参照しています。OPはネイティブJavaアプローチを求めています。私の答えはイエスです。それはできますが、多くの作業が必要になります。

次の 2 段階のプロセスが必要です。

ステップ 1 : PDF が暗号化されているかどうかを確認する

Adobe の PDF 1.7仕様(ページ番号 97 および 115) に従って、トレーラ レコードにキー "\Encrypted" が含まれている場合、pdf は暗号化されます (暗号化は、単純なパスワード保護、RC4、AES、またはカスタム暗号化の可能性があります)。サンプルコードは次のとおりです。

    Boolean isEncrypted = Boolean.FALSE;
    try {
        byte[] byteArray = Files.readAllBytes(Paths.get("Resources/1.pdf"));
        //Convert the binary bytes to String. Caution, it can result in loss of data. But for our purposes, we are simply interested in the String portion of the binary pdf data. So we should be fine.
        String pdfContent = new String(byteArray);
        int lastTrailerIndex = pdfContent.lastIndexOf("trailer");
        if(lastTrailerIndex >= 0 && lastTrailerIndex < pdfContent.length()) {
            String newString =  pdfContent.substring(lastTrailerIndex, pdfContent.length());
            int firstEOFIndex = newString.indexOf("%%EOF");
            String trailer = newString.substring(0, firstEOFIndex);
            if(trailer.contains("/Encrypt"))
                isEncrypted = Boolean.TRUE;
        }
    }
    catch(Exception e) {
        System.out.println(e);
        //Do nothing
    }

ステップ 2 :暗号化の種類を把握する

この手順はより複雑です。コードサンプルはまだありません。しかし、アルゴリズムは次のとおりです。

  1. 上記のステップ 1 で読み取ったように、トレーラからキー「/Encrypt」の値を読み取ります。たとえば、値は 288 0 R です。
  2. バイト「288 0 obj」を探します。これは、ドキュメント内の「暗号化辞書」オブジェクトの場所です。このオブジェクト境界は、文字列「endobj」で終了します。
  3. このオブジェクトでキー「/Filter」を探します。「フィルタ」は、ドキュメントのセキュリティ ハンドラを識別するものです。"/Filter" の値が "/Standard" の場合、ドキュメントは組み込みのパスワード ベースのセキュリティ ハンドラを使用します。

PDF が暗号化されているかどうかだけを知りたいだけで、暗号化が所有者/ユーザー パスワードの形式によるものなのか、高度なアルゴリズムによるものなのかを気にする必要がない場合は、上記の手順 2 は必要ありません。

お役に立てれば。

于 2016-12-27T22:43:44.553 に答える
1

iText pdf API を使用して、パスワードで保護された PDF を識別できます。

例 :

    try {
            new PdfReader("C:\\Password_protected.pdf");            
        } catch (BadPasswordException e) {
            System.out.println("PDF is password protected..");
        } catch (Exception e) {
            e.printStackTrace();
        }
于 2013-02-11T06:59:36.283 に答える
0

Itext を使用して、pdf を検証できます。つまり、読み書き可能です。

以下はコードスニペットです。

boolean isValidPdf = false;
try {
    InputStream tempStream = new FileInputStream(new File("path/to/pdffile.pdf"));
    PdfReader reader = new PdfReader(tempStream);
    isValidPdf = reader.isOpenedWithFullPermissions();
    } catch (Exception e) {
        isValidPdf = false;
    }
于 2016-05-20T15:41:04.457 に答える