我有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,......?
答案 0 :(得分:1)
我检查了你的档案,看起来很奇怪。
请参阅以下屏幕截图:
我使用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]
内搜索文本。这并非不可能,但并不总是微不足道。
您的问题是需要几天工作的项目。如果你想要一个有效的例子,请考虑到你要求人们贡献的时间不仅仅是几个小时。