![Ghostscript 9.07:错误:pdfmark 目标...指向最后一页以外](https://linux22.com/image/267273/Ghostscript%209.07%EF%BC%9A%E9%94%99%E8%AF%AF%EF%BC%9Apdfmark%20%E7%9B%AE%E6%A0%87...%E6%8C%87%E5%90%91%E6%9C%80%E5%90%8E%E4%B8%80%E9%A1%B5%E4%BB%A5%E5%A4%96.png)
我使用gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -dFirstPage=$2 -dLastPage=$3 -sOUTPUTFILE=$4 $1
脚本从带有 Ghostscript 9.07 的 pdf 文件中提取页面。我收到很多警告(如以下输出中的第一行所示)和一个错误:
GPL Ghostscript 9.07: **** Warning: Outline has invalid link that was discarded.
GPL Ghostscript 9.07: ERROR: A pdfmark destination page 4 points beyond the last page 3.
但是,生成的 PDF(包含提取的页面)没有问题。我想知道为什么我选择了 选项,但仍然会出现此错误和警告-q
。quiet
我对此进行了一些搜索,例如,这,但 PDF 文件已经生成hypertexnames=false
,因此那里建议的解决方案对我的情况(Ubuntu 13.04)不起作用。
只需补充一下:该.pdf
文件是通过pdflatex
以下方式生成的
\documentclass{scrartcl}
\usepackage[T1]{fontenc}
\usepackage[american]{babel}
\usepackage{tikz}
\usepackage[hypertexnames=false]{hyperref}
\begin{document}
\tikz[remember picture, overlay]\node at (current page.south)[rectangle, fill, color=gray]{};
\clearpage
\section{foo}
\clearpage
\tableofcontents
\clearpage
\section{bar}
foo bar
\end{document}
如果注释掉之后的部分\begin{document}
,gs
突然就没有警告也没有错误了,所以这与 PDF 文件的生成方式有关。
答案1
软件包hyperref
添加了书签(大纲)。如果只提取了部分页面,那么可能会有页面包含书签条目(例如\section{bar}
)。但是 ghostscript 不会重新组织书签树(通常不简单)。它只会在复制树时做得很差,删除一些无效条目。这样的页面子集文档对于打印目的来说不是问题。如果您需要交互功能(书签、链接),那么最好直接通过 TeX 生成它。
更新查看错误信息。
示例测试文件:
\RequirePackage{pdf14}
\documentclass[a5paper,12pt]{article}
\usepackage{hyperref}
\hypersetup{pageanchor=false}
\title{Test}
\author{Me}
\begin{document}
\maketitle
\newpage
Reference to first section~\ref{sec:first} and second
section~\ref{sec:second}.
\newpage
\section{First section}
\label{sec:first}
\newpage
\section{Second section}
\label{sec:second}
\end{document}
该文件包含四页和三个目的地:
Doc-Start
hyperref
在文档开头设置,section.1
在第 3 页,\section{First section}
带有标签sec:first
,section.2
位于第 4 页,\section{Second section}
带有标签sec:second
。
该链接\ref{sec:first}
使用\ref{second}
后两个目的地作为链接目标。
现在我们删除第一页:
$ ps2pdf -dFirstPage=2 test.pdf test-new.pdf
现在链接\ref{sec:first}
仍然指向第 3 页,但这是原始文件的第 4 页test.pdf
。它现在应该链接到第 2 页的部分。
此外,目标\ref{sec:second}
使用了错误的页码。Ghostscript 忘记了第一页已被删除,并想链接到第四页,但新文档只有三页。因此 Ghostscript 会抱怨:
GPL Ghostscript 9.05: ERROR: A pdfmark destination page 4 points beyond the last page 3.
因此我认为这是 Ghostscript 中的错误。
更好的工作是pdftk
:
$ pdftk test.pdf cat 2-4 output test-new.pdf
这里的链接是正确的。但是书签/大纲被删除了。(但是 Ghostscript 的书签不太好用,因为目的地使用了错误的页面,如上所示。)我认为这是 ghostscript 中的错误。如果第一页(-dFirstPage
)大于,它就会混淆1
。它似乎将原始文档的页码作为目的地(的链接目标\ref
)