2013-05-31 83 views
1

我有一個PDF文檔,它可能是通過從另一個PDF文檔中提取幾頁來創建的。我想知道如何獲得頁碼。由於起始頁碼爲572,對於完整的PDF文檔應該是1.從PDF文件中提取頁碼

您是否認爲將PDF轉換爲XMl會對此問題進行排序?

回答

1

最有可能的是該文件包含Document Catalog中的/PageLabels條目。此條目也指定頁碼的編號樣式和起始編號。

您可能需要更新起始號碼或完全刪除條目。下列文件中包含更多信息有關/PageLabels項:如果你決定要更新條目

示例2文件中可能是有用的。

+0

感謝您的回覆。但我實際上試圖從我的Java程序中訪問它。有沒有辦法從PDFReader對象獲取句柄? – Deb

1

最後用iText搞清楚了。如果沒有波夫羅斯基的提示,這是不可能的。對他表示感謝。發佈代碼示例:

public void process(PdfReader reader) { 
    PRIndirectReference obj = (PRIndirectReference) dict.get(com.itextpdf.text.pdf.PdfName.PAGELABELS); 
    System.out.println(obj.getNumber()); 
    PdfObject ref = reader.getPdfObject(obj.getNumber()); 
    PdfArray array = (PdfArray)((PdfDictionary) ref).get(com.itextpdf.text.pdf.PdfName.NUMS); 
    System.out.println("Start Page: " + resolvePdfIndirectReference(array, reader)); 
} 

private static int resolvePdfIndirectReference(PdfObject obj, PdfReader reader) { 
    if (obj instanceof PdfArray) { 
     PdfDictionary subDict = null; 
     PdfIndirectReference indRef = null; 
     ListIterator <PdfObject> itr = ((PdfArray) obj).listIterator(); 
     while (itr.hasNext()) { 
      PdfObject pdfObj = itr.next(); 
      if (pdfObj instanceof PdfIndirectReference) 
       indRef = (PdfIndirectReference) pdfObj; 
      if (pdfObj instanceof PdfDictionary) { 
       subDict = (PdfDictionary) pdfObj; 
       break; 
      } 
     } 
     if (subDict != null) { 
      return resolvePdfIndirectReference(subDict, reader); 
     } else if (indRef != null) 
      return resolvePdfIndirectReference(indRef, reader); 
    } else if (obj instanceof PdfIndirectReference) { 
     PdfObject ref = reader.getPdfObject(((PdfIndirectReference) obj).getNumber()); 
     return resolvePdfIndirectReference(ref, reader); 
    } else if (obj instanceof PdfDictionary) { 
     PdfNumber num = (PdfNumber)((PdfDictionary) obj).get(com.itextpdf.text.pdf.PdfName.ST); 
     return num.intValue(); 
    } 
    return 0; 
}