1

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

4

3 回答 3

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"

于 2013-04-07T09:46:07.770 回答
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条目并检索标签详细信息

于 2013-04-05T16:50:47.660 回答
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();

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

于 2019-12-10T09:42:44.907 回答