从 XML/JSON/文件将目录添加到 PDF 吗?

从 XML/JSON/文件将目录添加到 PDF 吗?

我目前有一个没有任何目录的 PDF 文件(例如,在 Mac 的 Preview.app 中,我无法在侧边栏中看到目录)。

但是我有 XML 格式的目录,其中有一个标题和该部分开始的页码。

有什么方法可以批量将目录添加到我的 PDF 文件中?

因为我有 XML 格式的目录,所以我基本上可以以任何可能的方式对其进行解析,因此如果有命令行可以将目录项添加到 PDF,我也可以这样做。

有任何想法吗?

答案1

使用以下方法向 PDF 添加书签非常简单:Ghostscript语法为:

gs -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=out.pdf in.pdf pdfmarks

其中 pdfmarks 是一个文本文件,其内容如下:

[/Title (Title Page) /Page 1 /OUT pdfmark
[/Title (Table of Contents) /Page 3 /OUT pdfmark
...

对于嵌套级别,请使用 /Count 属性。例如:

[/Count 3 /Title (Chapter 1) /Page 1 /OUT pdfmark
[/Count -2 /Title (Section 1.1) /Page 2 /OUT pdfmark
[/Title (Section 1.1.1) /Page 3 /OUT pdfmark
[/Title (Section 1.1.2) /Page 4 /OUT pdfmark
[/Count -1 /Title (Section 1.2) /Page 5 /OUT pdfmark
[/Title (Section 1.2.1) /Page 6 /OUT pdfmark
[/Title (Section 1.3) /Page 7 /OUT pdfmark

/Count 的参数给出直接下级书签的数量。参数的符号设置默认显示(负数表示关闭,正数表示打开)。

如果书签不足以作为目录,则可以使用从书签创建目录的应用程序。我没有使用过这样的应用程序,但谷歌搜索后出现了例如 Mapsoft TOCBuilder,这是一款带有试用版的商业 Adob​​e Acrobat 插件。

资料来源:
使用 Ghostscript 制作 PDF 书签
如何通过 ghostscript/pdfwrite/pdfmark 生成书签

答案2

如果您只有一个文件,可以使用以下方法pdfTeX。这可能有点复杂,但我知道 TeX(不知道其他工具),当我需要它时,它就能解决问题。

这是一个示例文件,它将复制您的全部内容input.pdf并添加包含指向某些页码的链接的目录。

% Set page size... this is A4, change to whatever you need
\pdfpagewidth=210mm
\pdfpageheight=297mm

% TeX always adds unwanted 1in left and top margins, this counteracts them.
\advance\hoffset by -1in
\advance\voffset by -1in

% This macro inserts a verbatim copy of one page from the source into the output.
\def\copypage#1{%
  \pdfximage page #1 {input.pdf}%
  \shipout\vbox{\pdfrefximage\pdflastximage}}

% Determine the total number of pages
\pdfximage{input.pdf}
\newcount\total
\total=\pdflastximagepages

% Define an iterator to copy the whole file
\def\copy{%
  \copypage{\the\pageno} % Copy the page given by current page number
  \advance\pageno by 1 % Increase page number by one
  \ifnum\pageno > \total
    \let\copy\relax % After the last page has been copied, stop
  \fi
  \copy} % This repeats the cycle until \copy is redefined to \relax at the very end

\copy % Run the cycle

% Here you add your outline
\pdfoutline goto page 1 {/Fit} count 2 {Chapter}
  \pdfoutline goto page 1 {/Fit} count -3 {Section}
    \pdfoutline goto page 1 {/Fit} {Item}
    \pdfoutline goto page 2 {/Fit} {Item}
    \pdfoutline goto page 3 {/Fit} {Item}
  \pdfoutline goto page 4 {/Fit} count 1 {Section}
    \pdfoutline goto page 4 {/Fit} count -2 {Subection}
      \pdfoutline goto page 1 {/Fit} {Item}
      \pdfoutline goto page 5 {/Fit} {Item}

\end

如何使用\pdfoutline命令:

  • 始终提供页码,即使对于可能不应直接使用的章节标题也是如此
  • 将“章节”、“项目”等替换为您想要的标题
  • 提供包含子项的项的数量(请注意,没有“关闭”命令,因此 TeX 需要提前知道数量)
  • 编辑感谢 harrymc:如果您希望某个项目的子项目默认关闭,请将计数设为负数;如果您希望它默认打开,请将计数设为正数

准备好此输入文件后,将其另存为,例如,,output.tex然后使用进行处理pdftex。瞧,这会生成output.pdf您崭新的 ToC。

相关内容