在命令行上导出PDF页面标签

时间:2012-10-16 21:56:01

标签: pdf command-line page-numbering

我想导出存储在某些PDF文档中的页面标签,以便于解析。我知道在用qpdf转换后可以深入研究PDF文档,但这看起来有些过分。

是否没有命令行工具只会打印每个页面的页面标签(或与其他元数据一起)?我知道PDFSpy将导出标签,但300美元不是一个选项,最好是解决方案应该是免费的。

2 个答案:

答案 0 :(得分:12)

简答:
我不知道任何(免费)工具可以“简单地打印”每页的页面标签。

此外,您将无法使用qpdf之类的工具或具有同等功能的工具来规避扩展压缩对象和对象流。

答案很长:
没有这样的工具,因为在页面标签方面,这些是您可以安全依赖的几件事。这些如下:

  1. 每个PDF文档必须包含根对象。
  2. 根对象必须属于/Type /Catalog
  3. 文档的预告片将使用键/Root后跟间接对象编号参考来显示在何处查找对象。
  4. IF PDF文档使用非标准页面标签,然后文档根对象必须具有名为/PageLabels的条目。
  5. 这是相对容易停下来的地方。因为/PageLabels键引用的对象可能包含在压缩对象 stream 中。这意味着您必须扩展该对象流。

    如果你真的成功地将页面标签的描述描述为ASCII,你会发现它不是一个易于解析的平面列表(就像dictionary那样):它是一个数字树< / em>的。

    我不会详细介绍这些复杂性,因为需要一篇很长的文章来描述所有可能的变化。您最好直接在official ISO PDF-1.7 specification中阅读。

    但我会给你一个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规范来理解它。

答案 1 :(得分:2)

我编写了一个基于 Poppler 的小型命令行实用程序来完成此任务:https://github.com/HeimMatthias/pdfpagelabels

免责声明:我是 OP,并在不同的帐户下创建了原始帖子。多年来,我一直在通过 pdftk(在上面的评论中列出)成功地使用该解决方案。然而,去年是时候从头开始重新实现我们的系统了,我们有很多实例无法通过我们的实现来解析 pdf-tk 输出。

新的命令行工具遵循 doing just one thing, but doing it well 的理念,只需打印 pdf 文件的所有或选定页面的页面标签。如果有人觉得这很有用,并在这里偶然发现它,那就更好了。