提取内容列表条目及其链接的页码

时间:2015-04-08 23:20:28

标签: java python pdf itext pypdf

我有a PDF file,其中包含一个内容表,其中每个条目都链接到文件中的一个页面。

如何使用Python或Java(或其他语言)编程以下列形式提取内容表:

entry1  PageNumberEntry1LinkedTo
entry2  PageNumberEntry2LinkedTo
...

e.g。

Section 2.6. Argument Arrays  2
Section 2.7. Thread-Safe Functions  2

(如果可以根据内容表的结构在某些树数据结构中提取它们,那就更好了,但如果不可能,可以跳过它。)

我想获得一些关于Python或Java模块和函数可以用来实现这一目标的帮助吗?例如Python中的PDFMiner或pypdf2,IPython或Java中的iText,......?

1 个答案:

答案 0 :(得分:1)

我检查了你的档案,看起来很奇怪。

请参阅以下屏幕截图:

enter image description here

我使用iText RUPS来查看页面树的根目录。您可能知道PDF中的页面并不知道其页码。页面的页码由页面树中页面的位置决定。

在屏幕截图中,您会看到第1页的页面词典(对象3)的一部分(它的第1页因为3 0 R/Kids数组中的第一个元素)。

我已使用注释打开数组,并且我看到带有/GoTo操作的链接注释。此操作告诉PDF查看器跳转到页面字典为对象编号58的页面。

当我们检查页面树(实际上只是一个没有任何叶子的单个分支)时,我们看到58 0 R引用了第2页(页面树中的第二个项目)。

然而,这可能是对的,可以吗?第2页只包含了TOC的另一部分,所以我认为这些链接是正确的。

看起来好像是基于网页创建了PDF,因为我看到一个引用HTML页面的/PA条目。

长话短说:

您需要遍历每个页面中的所有注释并查找/Link注释。然后,您必须检查操作的值(/A)。这将为您提供您正在寻找的页面的对象ID。

至于文本:显然,文本不存储在注释中。对于屏幕截图中显示的链接,您必须在矩形[107.2 754.3 235.6 763.6]内搜索文本。这并非不可能,但并不总是微不足道。

您的问题是需要几天工作的项目。如果你想要一个有效的例子,请考虑到你要求人们贡献的时间不仅仅是几个小时。