从 PDF 文件导出精确书签

从 PDF 文件导出精确书签

我在从 PDF 文件导出书签时遇到问题,因此我决定使用 pdftk 来解决:

pkftk.exe input.pdf dump_data output results.txt 

但是,pdftk 不会导出设置书签的确切页码,而是导出视图的页码。如果在 Foxit Reader 中设置书签时,我不仅可以看到设置书签的页面,还可以看到上一页的下半部分,则会导出上一页的页码。书签可以正确交互工作,并且两个页面都会显示在视图中,并具有准确的滚动位置。但是,我需要实际设置书签的页面的页码。此信息肯定存储在 pdf 中,因此应该有办法将其导出。我该如何实现呢?可能 pdftk 不是适合此目的的工具,可能有更好的方法,即使用脚本或其他程序(最好是免费的和用于脚本的命令行)。

更新:现在我尝试了 jpdfbookmark:

jpdfbookmarks_cli -d inputFile.pdf >results.txt

Results.txt 每个书签包含一行,如下所示:

TESTA_pg2inViewAndMarkedOnPg2/2,黑色,非粗体,非斜体,打开,FitWidth,813 TESTB_pg2inViewAndMargedOnPg3/2,黑色,非粗体,非斜体,打开,FitWidth,813

第一个 / 后面是页码。如果最后一个值为“1”,则设置书签时仅显示该页面。但如果值为 <>1,则它似乎表示从所标记页面开头的滚动偏移量。这使我更进一步,但不是最终的解决方案。此处显示的两个书签都设置在同一视图上,没有滚动。对于第一个书签,标记了第 2 页上的内容,对于第二个书签,标记了第 3 页上的内容。因此,书签页码相同,偏移量也相同。因此,使用这些值,我无法确定书签设置在哪一页上。

答案1

书签不是从某个页面设置的,而是整个文件所特有的。

因此它们就像目录(实际上可以在一个级联侧边栏中看到)但物理上却按照书写的任何顺序分散在整个文件中。

这些“书签”被称为"/Outlines"目的地

您可以在我的文本 demo.pdf 右上角的下载按钮中看到三个,并在记事本中阅读https://github.com/GitHubRulesOK/MyNotes/blob/master/demo.pdf

%Note objects do not need to be in order here is 9 before 7 & 8 could as easily be 1 0obj or last no problem
%09) Outline / Bookmark entry 3 
9 0 obj
<</A<</D [6 0 R /FitR 90 90 300 300]/S/GoTo>>/C[0 0 1]/F 3/Parent 4 0 R/Prev 7 0 R/Title(Hello World\041)>>
endobj
%07) Outline / Bookmark entry 1 
7 0 obj
<</A<</D [6 0 R /XYZ 0 740 2]/S/GoTo>>
/C [1 0 0]/F 1/Parent 4 0 R/First 8 0 R/Last 8 0 R/Next 9 0 R/Title(All text is "Body" text.)>>
endobj
%08) Outline / Bookmark entry 2 
8 0 obj
<</A<</D [6 0 R /XYZ 100 500.0 2.0]/S/GoTo>>/C[0 1 0]/F 2/Parent 7 0 R/Title(Jane)>>
endobj

所以

  • /A 是动作
  • /D 是目标(页面对象引用)[6 0 R在演示页面=0(第一页)中
  • /XYZ 标记样式为 X 偏移 Y 偏移 Z oom
  • /S/GoTo 是函数
  • /C 是颜色
  • /F 是字体样式(粗体、斜体等)
  • /Parent 是嵌套顺序
  • /Title 是显示文本,对于哪些字符可以接受有些奇怪,因此在 Hello World 中!需要写成\041

从 JpdfBookmarks -dump 我们得到

All text is "Body" text./1,Red,notBold,italic,open,TopLeftZoom,66,0,2.0
    Jane/1,Lime,bold,notItalic,open,TopLeftZoom,369,168,2.0
Hello World!/1,Blue,bold,italic,open,FitRect,621,151,886,505

您应该注意的差异如下

  • 所有标题都转到第 /1 页而不是第 /名为 A 的页(仅使用简单的数字并不是问题)
  • 酸橙色是纯绿色(看起来很奇怪,但它确实是鲜绿色)
  • 价值观被改变(这令人费解,为什么使用 YX 顺序 &%?
    第 1 条记录现在为 66,0(原为 0 740)
    第 2 条记录现在为 369,168(原为 100 500)
    第 3 条记录现在为 621,151,886,505(原为 90 90 300 300)
  • GUI 查看器看不到所有文件内容(不清楚原因!)

我会推荐用于提取轮廓在许多方面(也可以添加和删除)但是目前不支持颜色或文本样式!(因此对于添加自定义轮廓,JpdfBookmarks 可能更好)

使用 Coherent cpdf

cpdf -list-bookmarks -utf8  demo.pdf

For non-commercial use only
To purchase a license visit http://www.coherentpdf.com/

0 "All text is \"Body\" text." 1 "[1/XYZ 0 740 2]"
1 "Jane" 1 "[1/XYZ 100 500 2]"
0 "Hello World!" 1 "[1/FitR 90 90 300 300]"

它还可以列出其他 goto,例如注释链接cpdf -list-annotations in.pdf(参见下面显示 JSON 命令的注释)。

注意:Foxit 中的“单一”页面转到(与其他一些编辑器相反或使用页面视图模式时)基于。

在连续滚动模式下,书签是根据当前主要显示的页面来设置的。在您的示例中,第 1 页比第 2 页占用更多的屏幕空间,因此您位于第 1 页。

概括

原则上,PDF 中的每一页都是独立的(Foxit 可以在上方显示第 2 页,在下方显示第 1 页),并且书签是指向一个编号点(或仅一页的区域)的简单指针,即使在添加时有 2 个或更多页面可见。

相关内容