使用Java的Pdf页数

目前我正在使用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; } 

更新:

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

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

Lars Vogel使用以下代码 :

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

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


第F.3.3节说有一个名为N的头字段描述如下:

 N integer (Required) The number of pages in the document. 
 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页面的过程