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



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

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

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

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

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

有关更多细节和示例,请参阅规范本身。

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

虽然标题提到了PDFBox,但您还添加了标签文本,因此让我向您展示如何使用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...

现在你可以把这些值放在HashMapindex + 1一起作为页码,如果你想知道哪个物理页面对应的页面标签"2"

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

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

最新更新