使用Java的Pdf页面计数

使用Java的Pdf页面计数,java,pdf,size,itext,Java,Pdf,Size,Itext,目前,我正在使用itext阅读pdf的页数。这需要相当长的时间,因为lib似乎要扫描整个文件 页面信息是否在pdf的标题中,或者是否需要完整的文件扫描?Lars Vogel使用: 如果getNumberOfPages的实现比任何其他解决方案都慢,我会感到惊讶 第节说有一个名为N的标题字段,描述如下: N integer (Required) The number of pages in the document. 以上是计算pdf页面的过程,您只需阅读页面树(目录、页面、孩

目前,我正在使用itext阅读pdf的页数。这需要相当长的时间,因为lib似乎要扫描整个文件

页面信息是否在pdf的标题中,或者是否需要完整的文件扫描?

Lars Vogel使用:

如果
getNumberOfPages
的实现比任何其他解决方案都慢,我会感到惊讶


第节说有一个名为
N
的标题字段,描述如下:

N     integer (Required)      The number of pages in the document.

以上是计算pdf页面的过程,您只需阅读页面树(目录、页面、孩子)并计算页面条目。

这是正确的。iText在打开时解析相当多的PDF(它不读取流对象的内容,但仅此而已)

除非您使用
PdfReader(RandomAccessFileOrArray)
构造函数,否则在这种情况下,它将只读取外部参照(大部分是必需的),而不会解析任何内容,直到您开始请求特定对象(直接或通过各种调用)

我写的第一个PDF程序就是这样做的。它打开了一个PDF,做了最少的必要工作,阅读了大量的页面。它甚至没有解析外部参照,这是不必要的。好几年没想过那个节目了

因此,虽然效率不高,但使用RandomAccessFileOrray将大大提高效率:

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;
  }

在iText版本5.5.13中,下面的方法将在不扫描整个文件的情况下为您提供页码。它不会将完整的文件内容读入内存

int efficientPDFPageCount(String filePath){
     PdfReader reader = new PdfReader(filePath, new byte[0], true);
     int pages = reader.getNumberOfPages();
     reader.close();
     return pages;

}

请将您的代码张贴在此处。这是一个一般性问题,而不是代码问题。如果itext尽其所能,我将继续使用它。但是加载完整的文件似乎没有用。这个答案使用ApachePDFBox。java库是的,我知道这是我的代码。但是,这段代码是否必须扫描完整的pdf文件,或者如果只读取pdf文件的标题,这段代码会更简单。实际上,您只需要根页面对象并获取它的/Count。是否应该调用raf.close()来释放资源?我知道已经两年了,但是。。。iText@Jaydev
int efficientPDFPageCount(String path) {
  RandomAccessFileOrArray file = new RandomAccessFileOrArray(path, false, true );
  PdfReader reader = new PdfReader(file);
  int ret = reader.getNumberOfPages();
  reader.close();
  return ret;
}
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;
  }
int efficientPDFPageCount(String filePath){
     PdfReader reader = new PdfReader(filePath, new byte[0], true);
     int pages = reader.getNumberOfPages();
     reader.close();
     return pages;