PDFにあらゆる種類のデジタル署名があるかどうかを理解する必要があります。巨大 PDFを管理する必要があります。たとえば、それぞれ500MBなので、方法を見つける必要があります署名されたものと署名されていないものを区別します(そのため、署名されたPDFをそれらを管理するメソッドに送信できます)これまでに見つかった手順には、Bouncycastle libs(私の場合、Javaの場合)を介して証明書を抽出する試みが含まれます。 pdfは、存在しない場合や例外が発生した場合でも署名されますが、そうではありません(sic!)が、リソースを浪費する実装の例を除いて、明らかに時間とメモリを消費します。
言語に依存しない簡単な方法はありますか? PDFファイルを開き、最初のバイトを読み取り、そのファイルに署名が付いていることを示す情報を見つけますか?または、内部的にPDFを作成する方法を詳細に説明しているリファレンスマニュアルがありますか?
前もって感謝します
PDF Libraryをすべて自分で実装しようとするのではなく、使用したいとします。そうしないと、線形化されたドキュメント、フィルター、増分更新、オブジェクトストリームのバリエーションを処理することに行き詰まってしまいます。相互参照ストリームなど。
参考資料に関して;私の大まかな検索によれば、AdobeはISO 32000:2008仕様のバージョンを誰にも提供していないようですが、その仕様は主に PDF v1.7リファレンスマニュアル の翻訳ですISO準拠の言語。
したがって、PDF v1.7リファレンスを想定すると、最も関連するセクションは8.7(デジタル署名)、3.6.1(ドキュメントカタログ)、および8.6(インタラクティブフォーム)になります。
基本的なプロセスは次のようになります。
PDFライブラリを使用して、ドキュメントの相互参照テーブルを使用して適切な間接オブジェクトにナビゲートできるため、証明書のドキュメントをブルートフォースで検索するよりも、リソースを大量に消費する必要がなくなります。 。
これは最適なソリューションではありませんが、別のソリューションです... "Sigflags"を確認して、最初の一致で停止することができます。
grep -m1 "/Sigflags" ${PDF_FILE}
または、ディレクトリ内にそのようなファイルを取得します。
grep -r --include=*.pdf -m1 -l "/Sigflags" . > signed_pdfs.txt
grep -r --include=*.pdf -m1 -L "/Sigflags" . > non_signed_pdfs.txt
大きなファイルの場合、Grepは非常に高速です。これを一定の時間バッチで実行し、その後結果のリスト(.txtファイル)を処理できます。
ファイルは署名後に段階的に変更される可能性があり、最後のバージョンは署名されない可能性があることに注意してください。それが「署名済み」の実際の意味になります。
とにかく、ファイルに/ Sigflagsstringがない場合は、署名されていないことがほぼ確実です。
すべてのオブジェクトがどこにあるかを示す相互参照テーブルがあるため、適合リーダーは(ファイルの最後から)逆方向に読み取りを開始することに注意してください。
peepdf を使用してファイルの内部構造を確認することをお勧めします。ファイルに対するコマンドの実行をサポートします。例えば:
$ peepdf -C "search /SigFlags" signed.pdf
[6]
$ peepdf -C "search /SigFlags" non-signed.pdf
Not found!!
しかし、私はそのパフォーマンスをテストしていません。これを使用して、PDF PDF v1.7 Reference からの学習の内部構造を参照できます。PDF例があります。