2011-05-17 64 views
15

此刻我正在使用itext來讀取PDF的頁數。這需要很長時間,因爲lib似乎掃描整個文件。使用Java的PDF頁面數

頁面信息是否位於pdf頭部的某個位置,還是需要完整的文件掃描?

+0

請你能張貼您的代碼在這裏 – developer 2011-05-17 06:26:28

+0

這不僅僅是代碼問題的普遍質疑。如果它能做到最好,我會繼續使用itext。但加載完整的文件似乎沒用。 – 2011-05-17 06:33:49

+0

http://stackoverflow.com/a/4135059/489364此答案使用Apache PDFBox。 java庫 – kommradHomer 2013-06-18 06:44:36

回答

2

拉爾斯·沃格爾使用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. 
+0

是的,我知道這是我的代碼。但是,這段代碼是否必須掃描完整的pdf,或者如果您只閱讀pdf的標題,它們是否會變得更簡單? – 2011-05-17 06:32:16

+0

讓我試着找出... – aioobe 2011-05-17 06:36:03

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

以上是用於計算PDF頁面

+0

哪個庫? – Jaydev 2016-05-25 08:15:02

3

你只是過程需要閱讀頁面樹(Catalog,Pages,Kids)並統計頁面條目。

+0

其實,你只需要根頁面對象,並得到它/計數。 – 2011-05-17 20:39:52

21

這是正確的。 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; 
    } 
+0

不應該調用raf.close()來釋放資源嗎? – 2017-12-05 16:08:00