使用 Java 的 Pdf 的页数

2022-09-02 20:36:29

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

页面信息是否位于pdf页眉的某个位置,或者是否需要完整的文件扫描?


答案 1

没错。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;
  }

答案 2

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.

推荐