如何使用pdfbox读取pdf文档的当前页码

时间:2013-04-05 14:38:49

标签: java parsing pdf itext pdfbox

PDF中的页码有不同的变体,有些PDF的初始页面为罗马数字,如I,ii,后来页码为1,2,....我在pdfbox中找到了一个函数来获取所需的页面page.get(pagenumber)。但是这个函数的问题在于,当我写get(1)时,它返回文档的第一页(可以编号为ii而不是页码为2的页面)。有没有办法获得PDF中的页码是2而不是第二页的页面?

3 个答案:

答案 0 :(得分:2)

PDF规范ISO 32000-1:2008中的第12.4.2节页面标签说明了如何在文档中定义页面标签(您想要了解的特殊页码):

  

PDF文档中的每个页面都应由整数页索引标识,该索引表示页面在文档中的相对位置。此外,文档可以可选地定义页面标签(PDF 1.3)以在屏幕上或在打印中可视地识别每个页面。页面标签和页面索引不一致:索引应该是固定的,从第一页的0开始连续通过文档运行,但标签可以以适合特定文档的任何方式指定。

     

出于页面标注的目的,文档应分为标签范围,每个标签范围是使用相同编号系统的一系列连续页面。范围内的页面应按升序顺序编号。页面的标签由基于其在标签范围内的位置的数字部分组成,可选地前面带有表示范围本身的标签前缀。

     

文档的标签范围应由文档目录中的PageLabels条目定义(参见7.7.2,“文档目录”)。此条目的值应为数字树(7.9.7,“数字树”),其每个键是标签范围中第一页的页面索引。相应的值应是页面标签字典,用于定义该范围内页面的标签特征。树应包含页面索引0的值。表159显示页面标签字典的内容。

更多细节和示例cf. specification本身。

使用低级PDFBox方法,可以轻松提取文档目录中的 PageLabels 条目并检索标签详细信息

答案 1 :(得分:2)

虽然标题提到了PDFBox,但您还要添加标签itext,所以让我向您展示如何使用iText提取PageLabels:

PdfReader reader = new PdfReader(src);
String[] labels = PdfPageLabels.getPageLabels(reader);

现在你有一个String数组,你可以拥有:

labels[0] = "i";
labels[1] = "ii";
labels[2] = "iii";
labels[3] = "iv";
labels[4] = "1";
labels[5] = "2";
labels[6] = "3";
and so on...

现在,如果您想知道哪个物理页面与页面标签HashMap对应,您可以将这些值与index + 1"2"一起作为页码。

答案 2 :(得分:2)

PDPageLabels.getLabelsByPageIndices()用于获取所有页面标签的列表。

PDDocument document = PDDocument.load(new File(src));
PDPageLabels lable = document.getDocumentCatalog().getPageLabels();
String[] range = lable.getLabelsByPageIndices(); //all page label
int pageNumber = 1; //page number for find page
int index = Arrays.binarySearch(range, pageNumber);  //get page which have given page number
PDPage page = document.getPage(index);
document.close();

您将获得所有页面标签数组。查找特定页码的索引并获取该页。