web-dev-qa-db-ja.com

JavaのPDFのページ数

現在、私はitextを使用してPDFのページ数を読み取っています。 libがファイル全体をスキャンしているように見えるため、これにはかなり時間がかかります。

ページ情報はPDFのヘッダーのどこかにありますか、それとも完全なファイルスキャンが必要ですか?

15
hans sausage

そのとおりです。 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;
  }
23
Mark Storer

ページツリー(カタログ、ページ、キッズ)を読んで、ページエントリを数えるだけです。

3
mark stephens

Lars Vogelは 次のコード を使用します:

PdfReader reader = new PdfReader(INPUTFILE);
int n = reader.getNumberOfPages();

getNumberOfPagesの実装が他のどのソリューションよりも遅いとしたら、私は驚きます。


セクション F.3. は、次のように記述されたNと呼ばれるヘッダーフィールドがあることを示しています。

N     integer (Required)      The number of pages in the document.
2
aioobe
PdfReader document = new PdfReader(new FileInputStream(new File("filename")));  
int noPages = document.getNumberOfPages(); 
0
Tijo K Varghese
PdfReader document = new PdfReader(new FileInputStream(new File("filename")));   
int noPages = document.getNumberOfPages(); 

上記はPDFページを数えるためのプロセスです

0
developer