0

我正在尝试将一段文本添加到带有 ghostscript 的 2 页 pdf 中。查看类似的问题(https://stackoverflow.com/a/9783516/1581629https://stackoverflow.com/a/12596669/1581629 https://stackoverflow.com/a/18774237/1581629)我试图使用 /EndPage 我期望在堆栈上获得一个“页面计数器”并使用它来选择要修改的页面。

但是,当 /EndPage(Postscript 语言参考的第 441 页)堆栈中的“原因”为 0 时,“计数器”也始终为 0。

MWE 可能是(使用来自 git repo 的 gs 9.23):

gs -o out.pdf -sDEVICE=pdfwrite a.ps in.pdf

其中 a.ps 是:

<<
    /EndPage
    {
        (-----------------START\n) print
        stack
        true
        (------------------END\n) print
    }
>> setpagedevice

in.pdf 是用 pdflatex (texlive 2017) 制作的:

\documentclass{article}
\begin{document}
aaa

\newpage

bbb
\end{document}

谁能指出我在这里缺少的东西?

4

1 回答 1

2

Ghostscript PDF 解释器在 PDF 文件的每一页的开头执行 setpagedevice。

这样做是因为 PDF 文件中的每个页面都可以拥有不同的 MediaBox,因此它会提取 MediaBox 并使用包含 MediaBox 的 PageSize 条目构造一个字典,以便设置(可能)新的媒体大小。

每次执行 setpagedevice 都会重置页面计数,因此每个页面实际上都是第一页。

如果您需要页计数,那么您可以创建一个私有字典,将计数器初始化为 0,然后在 EndPage 过程中打开字典测试当前计数值(并可选择增加它)。

于 2017-10-12T07:31:16.047 回答