使用Java的Pdf页数

han*_*age 15 java pdf size itext

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

页面信息是pdf标题中的某个位置,还是需要完整的文件?

Mar*_*rer 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;
}
Run Code Online (Sandbox Code Playgroud)

更新:

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;
  }
Run Code Online (Sandbox Code Playgroud)


aio*_*obe 4

拉尔斯·沃格尔使用以下代码

PdfReader reader = new PdfReader(INPUTFILE);
int n = reader.getNumberOfPages();
Run Code Online (Sandbox Code Playgroud)

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


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

N     integer (Required)      The number of pages in the document.
Run Code Online (Sandbox Code Playgroud)