我希望能导出一些PDF文档中存储的页面标签以便于解析。我知道可以使用
qpdf
将PDF转换后再深入挖掘,但这似乎有点过度。是否没有命令行工具可以简单地打印每个页面的页面标签(或与其他元数据一起)?我知道PDFSpy会导出标签,但300美元不是我的选择,最好的解决方案应该是免费的。qpdf
将PDF转换后再深入挖掘,但这似乎有点过度。是否没有命令行工具可以简单地打印每个页面的页面标签(或与其他元数据一起)?我知道PDFSpy会导出标签,但300美元不是我的选择,最好的解决方案应该是免费的。简短回答:
我不知道有任何(免费)工具可以“简单打印”每个页面的页面标签。
此外,使用像qpdf
或具有等效功能的工具,您将无法避免扩展压缩对象和对象流。
长回答:
没有这样的工具,因为这些是关于页面标签的唯一可靠的信息:
/Type /Catalog
。/Root
后跟间接对象号引用。/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, ... (last):
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规范才能理解它。
pdftk.exe document.pdf dump_data output report.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,无论如何还是谢谢你,非常感激! - grovel