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

Java 如何使用pdfbox读取pdf文档的当前页码,java,parsing,pdf,itext,pdfbox,Java,Parsing,Pdf,Itext,Pdfbox,PDF中的页码有不同的变体,有些PDF的首页是罗马数字,如I、ii,后来的页码是1、2、。我在pdfbox中找到了一个函数,用于获取所需的页面page.get(pagenumber)。但是这个函数的问题是,当我写get(1)时,它返回文档的第一页(可能编号为ii,而不是第2页)。有没有办法获得PDF中页码为2而不是第二页的页面?PDF规范第12.4.2节页面标签解释了如何在文档中定义页面标签(您想要理解的特殊页码): PDF文件中的每一页都应通过整数页索引进行标识,该索引表示页面在文件中的相对位

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

PDF规范第12.4.2节页面标签解释了如何在文档中定义页面标签(您想要理解的特殊页码):

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

对于页面标签,文件应划分为标签范围,每个标签范围是使用相同编号系统的一系列连续页面。范围内的页面应按升序顺序编号。页面的标签由一个数字部分组成,该数字部分基于其在标签范围内的位置,可以选择前面加一个表示范围本身的标签前缀

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

有关更多详细信息和示例,请参阅

使用低级PDFBox方法,可以很容易地提取文档目录中的页面标签条目,并检索标签详细信息

PDF规范中的第12.4.2节页面标签解释了如何在文档中定义页面标签(您想要理解的特殊页码):

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

对于页面标签,文件应划分为标签范围,每个标签范围是使用相同编号系统的一系列连续页面。范围内的页面应按升序顺序编号。页面的标签由一个数字部分组成,该数字部分基于其在标签范围内的位置,可以选择前面加一个表示范围本身的标签前缀

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

有关更多详细信息和示例,请参阅


使用低级PDFBox方法,应该很容易提取文档目录中的页面标签条目并检索标签详细信息

尽管标题提到了PDFBox,但您也添加了标签itext,因此让我向您展示如何使用itext提取页面标签:

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...

现在,如果您想知道哪个物理页面与页面标签
“2”

相对应,您可以将这些值与
索引+1
一起作为页码放在
HashMap
中,尽管标题提到了PDFBox,但您也添加了标签itext,因此让我向您展示如何使用itext提取页面标签:

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...

现在,如果您想知道哪个物理页面与页面标签
“2”

PDPageLabels,您可以将这些值与
索引+1
一起作为页码放在
哈希映射中。GetLabelsbyPageIndexs()用于获取所有页面标签的列表

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();

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

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

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();
您将获得所有页面标签数组。找到特定页码的索引并获取该页