2013-05-31 62 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; 
}