現在、私はitextを使用してPDFのページ数を読み取っています。 libがファイル全体をスキャンしているように見えるため、これにはかなり時間がかかります。
ページ情報はPDFのヘッダーのどこかにありますか、それとも完全なファイルスキャンが必要ですか?
そのとおりです。 iTextは、開かれるとかなりの量のPDFを解析します(ストリームオブジェクトの内容は読み取られませんが、それだけです)...
PdfReader(RandomAccessFileOrArray)
コンストラクターを使用しない限り、コンストラクターは外部参照のみを読み取り(ほとんどの場合必須)、特定のオブジェクトの要求を開始するまで(直接またはさまざまな呼び出しを介して)何も解析しません。
私が今まで書いた最初のPDFプログラムは、まさにこれを行いました。それはPDFを開き、必要最小限の作業を行って、ページ数を読みました。必要のない外部参照も解析しませんでした。そのプログラムについて何年も考えていませんでした...
したがって、完全に効率的ではありませんが、RandomAccessFileOrArrayを使用する方がはるかにより効率的です。
int efficientPDFPageCount(String path) {
RandomAccessFileOrArray file = new RandomAccessFileOrArray(path, false, true );
PdfReader reader = new PdfReader(file);
int ret = reader.getNumberOfPages();
reader.close();
return ret;
}
更新:
ItextAPIは少しオーバーホールされました。現在(バージョン5.4.x)、これを使用する正しい方法は、Java.io.RandomAccessFileをパススルーすることです。
int efficientPDFPageCount(File file) {
RandomAccessFile raf = new RandomAccessFile(file, "r");
RandomAccessFileOrArray pdfFile = new RandomAccessFileOrArray(
new RandomAccessSourceFactory().createSource(raf));
PdfReader reader = new PdfReader(pdfFile, new byte[0]);
int pages = reader.getNumberOfPages();
reader.close();
return pages;
}
ページツリー(カタログ、ページ、キッズ)を読んで、ページエントリを数えるだけです。
PdfReader document = new PdfReader(new FileInputStream(new File("filename")));
int noPages = document.getNumberOfPages();
PdfReader document = new PdfReader(new FileInputStream(new File("filename")));
int noPages = document.getNumberOfPages();
上記はPDFページを数えるためのプロセスです