在命令行导出PDF页面的标签(Export PDF page labels on command l

2019-08-01 13:38发布

我想导出存储在轻松解析某些PDF文档的页面的标签。 我知道有它转换与后我能挖成PDF文档qpdf ,但这似乎是大材小用。

有没有命令行工具,将简单(与其他元数据或共同)打印每个页面的页面标签? 我知道PDFSpy将出口的标签,但$ 300是不是一种选择,最好的解决应该是免费的。

Answer 1:

简短的回答:
我不知道任何免费的工具,可以“简单地打印”的标签页每一页的。

此外,你无法逃避的膨胀所压缩的对象和对象数据流,使用类似的工具qpdf或一个具有同等能力。

长一点的回答:
有没有这样的工具,因为这是唯一可以安全地依赖,当涉及到页面标签上的几件事情。 这些如下:

  1. 每个PDF文档必须包含一个根对象。
  2. 这根对象必须/Type /Catalog
  3. 该文件的预告片将显示在哪里可以找到使用键的对象/Root ,然后间接对象号引用。
  4. 如果 PDF文档使用非标准页面标签,然后将文档根目录对象必须有一个名为条目/PageLabels

这里是它停止相对容易。 因为该对象的/PageLabels键指的是可被包含在一个压缩对象 。 这意味着,你不得不展开对象流。

如果你真的成功获得页面的标签为ASCII的描述,你会发现它不是一个容易解析的简单列表(如dictionary是):它是一个数字的树

我不会进入这些复杂的细节,因为这将需要很长的文章来描述所有可能的变化。 你最好直接在阅读它的官方ISO的PDF 1.7规范

而是我给你在ASCII码PDF的例子:

213 0 obj
  << /Type /Catalog
     /PageLabels 
        << 
           /Nums 
                 [ 
                   0 <<           % start labeling from page no. 1
                       /S /r      % label with lowercase roman numbers
                     >> 
                   7 <<           % start new labeling from page no. 8
                       /S /D      % label with standard decimal numbers
                     >> 
                   11 <<          % start labeling page no. 12
                       /S /D      % label with decimal numbers...
                       /P (ABCD-) %   ...but using label prefix 'ABCD-'...
                       /St 3      %   ...followed by '3' as the start decimal.
                     >>
                  ]
        >>
     %%...........................
     %%...more root object keys...
     %%........................... 
  >>
endobj

上面的例子将标签这样的页数1,2,3,...(最后):

i
ii
iii
iv
v
vi
1
2
3
4
ABCD-3
ABCD-4
ABCD-5
ABCD-6
...and so on until last page...

正如你所看到的,标签页(映射页码页面名称)的PDF方法是完全不直观。 您只能通过研究PDF规范的理解。



文章来源: Export PDF page labels on command line