1

暗号化された PDF フォーム ドキュメントがあり、フォームに目的の値を入力する必要があり、最後にドキュメントを保存する必要があります。これが私が試したコードの一部です。

            PDDocument document;
            document = PDDocument.load(sourcePath);
            if( document.isEncrypted() )
            {
                try
                {
                    document.decrypt( "" );
                }
                catch( InvalidPasswordException e )
                {

                }
            }
            PDAcroForm form = document.getDocumentCatalog().getAcroForm();
            PDField Field_1= form.getField("topmostSubform[0].CMS1500Form[0].PatientName[0]");          
            Field_1.setValue("ABC");    
            document.save("C:\\Users\\347702\\Desktop\\21.pdf");
            document.close();

しかし、それは私に以下の例外をスローします

java.lang.NullPointerException at org.apache.pdfbox.pdmodel.encryption.StandardSecurityHandler.prepareDocumentForEncryption(StandardSecurityHandler.java:303)

また、doc.save(""); の上に以下のステートメントを追加してみました。

document.setAllSecurityToBeRemoved(true);

エラーなしでプログラムを実行できるようになりましたが、目的の値 (値: "ABC") が保存されたドキュメントに入力されていません..空白に見えます

誰でも私を助けてくれませんか!!

ありがとう

4

1 に答える 1

1

ここにある StandardSecurityHandler.java のコードを調べました。このメソッド内には、次のコードがあります。

    version = computeVersionNumber();
    revision = computeRevisionNumber();
    encryptionDictionary.setFilter(FILTER);
    encryptionDictionary.setVersion(version);
    encryptionDictionary.setRevision(revision);
    encryptionDictionary.setLength(keyLength);

    String ownerPassword = policy.getOwnerPassword();
    String userPassword = policy.getUserPassword();

私たちが見ているバージョンがあなたのバージョンと同じではない可能性があることを考慮して、最も可能性の高い原因は、ポリシー オブジェクトが null であることです (これは 303 行目ではなく 305 行目ですが、この後の最初の行で、これ失敗する可能性があります)。 NullPointerException.

(PatientName[0])入力されていないフォーム フィールドについては、暗号化せずに保存し、編集しようとしているフィールドのフィールド名であるstring を探す必要があります。/V見つかった場合は、辞書に関連する値を持つキーが含まれているかどうかを確認する必要があります(ABC)、これは、コードがフィールドを正しく設定したことを意味します。この場合、あなたのドキュメントにも XFA が含まれていることは間違いありません。つまり、フォームの実際のデータは必ずしもフォームに保存されているとは限らず、XFA データに保存する必要があるかもしれません。パケット。幸いなことに、XFA 仕様は Adob​​e から入手できます。悪いニュースは、XFA 仕様が 1500 ページであることです。幸いなことに、XFA はダウンロード可能なスキーマを持つ XML ノードの大きなスイートです。悪いニュースは、スキーマが典型的な標準形式ではなく、それを使用するための利用可能なツールが (明らかに) 維持されていないことです。

于 2013-11-07T15:04:59.277 に答える