我目前有一个没有任何目录的 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,这是一款带有试用版的商业 Adobe 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。