【问题标题】:How to read the current page number of the pdf document using pdfbox如何使用pdfbox读取pdf文档的当前页码
【发布时间】:2013-03-28 00:49:57
【问题描述】:
PDF 中的页码有不同的变体,有些 PDF 的初始页为罗马数字,如 I、ii,后来页码为 1,2,...。我在pdfbox 中找到了一个函数来获取所需的页面page.get(pagenumber)。但是这个函数的问题是,当我写get(1)的时候,它返回的是文档的第一页(可能编号为ii而不是页码为2的那一页)。有什么方法可以获取 PDF 中页码为 2 而不是整体第二页的页面?
【问题讨论】:
标签:
java
parsing
pdf
itext
pdfbox
【解决方案1】:
PDF 规范ISO 32000-1:2008 中的第 12.4.2 节 页面标签 解释了如何在文档中定义页面标签(您想了解的特殊页码):
PDF 文档中的每一页都应由一个整数页面索引标识,该索引表示页面在文档中的相对位置。此外,文档可以选择定义页面标签 (PDF 1.3) 以在屏幕上或打印中直观地识别每一页。页面标签和页面索引不必重合:索引应该是固定的,从第一页的 0 开始在文档中连续运行,但可以以适合特定文档的任何方式指定标签。
出于页面标注的目的,应将文档划分为标签范围,每个标签范围是使用相同编号系统的一系列连续页面。一个范围内的页面应按升序顺序编号。一个页面的标签由一个基于其在其标签范围内的位置的数字部分组成,可以选择在标签前缀之前表示该范围本身。
文档的标签范围应由文档目录中的 PageLabels 条目定义(参见 7.7.2,“文档目录”)。该条目的值应为数字树(7.9.7,“数字树”),其每个键都是标签范围内第一页的页面索引。对应的值应该是一个页面标签字典,定义了该范围内页面的标签特征。树应包含页面索引 0 的值。表 159 显示页面标签字典的内容。
有关更多详细信息和示例,请参阅。 specification 本身。
使用低级 PDFBox 方法应该很容易提取文档目录中的 PageLabels 条目并检索标签详细信息
【解决方案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...
如果您想知道哪个物理页面对应于页面标签"2",现在可以将这些值与index + 1 一起作为页码放在HashMap 中。
【解决方案3】:
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();
你得到所有的页面标签数组。查找特定页码的索引并获取该页面。