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

gro*_*vel 10 pdf command-line page-numbering

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

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

Kur*_*fle 13

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

此外,您将无法使用类似工具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
Run Code Online (Sandbox Code Playgroud)

以上示例将标记页码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...
Run Code Online (Sandbox Code Playgroud)

如您所见,标记页面的PDF方法(将页码映射到页面名称)完全不直观.您只能通过研究PDF规范来理解它.

  • `pdftk.exe document.pdf dump_data output report.txt`将生成一个txt文件,该文件不仅列出书签等元数据,还列出页面标签.它将如下所示:`PageLabelNewIndex:1 PageLabelStart:1 PageLabelPrefix:C PageLabelNumStyle:DecimalArabicNumberals PageLabelNewIndex:3 PageLabelStart:1 PageLabelNumStyle:LowercaseRomanNumerals PageLabelNewIndex:15 PageLabelStart:1 PageLabelNumStyle:DecimalArabicNumerals`即C1,C2,i,ii,... ,xiii,1,2,...易于解析,正是我需要的.@Kurt,谢谢,无论如何,非常感谢! (8认同)