使用Java的Pdf页数

时间:2011-05-17 06:17:22

标签: java pdf size itext

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

页面信息是否位于pdf标题的某处,或者是否需要完整的文件?

6 个答案:

答案 0 :(得分:23)

这是对的。 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;
}

<强>更新

itext API经历了一次小修。现在(在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;
  }

答案 1 :(得分:3)

您只需阅读页面树(目录,页面,孩子)并计算页面条目。

答案 2 :(得分:2)

Lars Vogel使用the following code

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

如果getNumberOfPages的实施 比任何其他解决方案慢

,我会感到惊讶。


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

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

答案 3 :(得分:0)

PdfReader document = new PdfReader(new FileInputStream(new File("filename")));  
int noPages = document.getNumberOfPages(); 

答案 4 :(得分:0)

PdfReader document = new PdfReader(new FileInputStream(new File("filename")));   
int noPages = document.getNumberOfPages(); 

以上是计算pdf页面的过程

答案 5 :(得分:0)

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

}