如何在Linux中为每个页面的PostScript或PDF文件添加页脚?

7
我想在每个由groff在Linux中使用postscript生成的pdf文件的底部添加一个“页脚”(归属信息)。我正在使用ps2pdf工具将文件从ps转换为pdf,因此我可以访问这两种格式。这两篇文章对我有些帮助:如何在Postscript/PDF中添加页码如何使程序在postscript文件上叠加文本?。我不反对使用第一种方法,但我没有访问第一个脚本中提到的pdflatex实用程序,也没有在需要执行工作的机器上安装它的选项。
看起来第二种方法可能有效,但是我已经安装了8.15版本的Ghostscript,但是在手册页面(http://unix.browserdebug.com/man/gs/)上并没有列出许多标志。我认为我可以使用“-c”标志插入一些后置代码,即使它没有列出。无论如何,这里是两个我尝试失败的命令:

gs -o output.pdf -sDEVICE=pdfwrite -g5030x5320 \
-c "/Helvetica-Italic findfont 15 scalefont setfont 453 482 moveto (test-string) show" \
-f input.ps

这给了我这个结果:

未知开关-o - 忽略 ESP Ghostscript 815.02 (2006-04-19) 版权所有(C) 2004 artofcode LLC,Benicia,CA。保留所有权利。 本软件不提供任何保证:有关详细信息,请参见PUBLIC文件。 错误:/undefinedfilename in (output.pdf) 操作数堆栈:
执行堆栈: %interp_exit .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval-- --nostringval-- --nostringval-- false 1 %stopped_push 字典堆栈: --dict:1117/1686(ro)(G)-- --dict:0/20(G)-- --dict:102/200(L)-- 当前分配模式为本地 上一个操作系统错误: 2 ESP Ghostscript 815.02: 不可恢复的错误,退出代码1

显然,-o标志存在问题,因此我进行了一些研究并尝试了以下语法:

gs -sOUTPUTFILE=output.pdf -sDEVICE=pdfwrite -g5030x5320 \
-c "/Helvetica-Italic findfont 15 scalefont setfont 453 482 moveto (test-string) show" \
-f input.ps

这将输出这个结果,并让我按回车键4次(也许输入的.ps文件有4页)

ESP Ghostscript 815.02 (2006-04-19) 版权所有 (C) 2004 artofcode LLC, Benicia, CA。保留所有权利。 此软件不提供任何保证:有关详细信息,请参阅文件PUBLIC。 找不到(或无法打开)字体文件/usr/share/ghostscript/8.15/Resource/Font/Helvetica-Italic。 找不到(或无法打开)字体文件Helvetica-Italic。 查询操作系统的字体文件... 未在系统中找到此字体! 用Helvetica-Oblique替换Helvetica-Italic字体。 从/usr/share/fonts/default/Type1/n019023l.pfb加载NimbusSanL-ReguItal字体...3742416 2168114 2083056 759694 1完成。 从/usr/share/fonts/default/Type1/n021023l.pfb加载NimbusRomNo9L-ReguItal字体...3781760 2362033 2365632 1015713 1完成。 从/usr/share/fonts/default/Type1/n021004l.pfb加载NimbusRomNo9L-Medi字体...3865136 2547267 2365632 1029818 1完成。 从/usr/share/fonts/default/Type1/n021003l.pfb加载NimbusRomNo9L-Regu字体...4089592 2759001 2365632 1032885 1完成。 将NimbusRomanNo9L-Regu字体用于NimbusRomNo9L-Regu。 >>显示页面,请按键继续<< >>显示页面,请按键继续<< >>显示页面,请按键继续<< >>显示页面,请按键继续<<

看起来使用gs将某些内容插入ps文件似乎很简单,但实际上证明它相当复杂...

3个回答

7

在您的 PostScript 文件中,您可以使用一个页面计数器,并重新定义 showpage 以在页脚显示它。这是一个示例程序:

4 dict begin

/showpage_org /showpage load def            % you'll need this later!  
/page_num 0 def  
/page_str 3 string def                      % Page numbers -99 to 999 supported, error if > 3 char

/showpage                                   % with page number footer  
{  
    gsave
    /Courier findfont 10 scalefont setfont  % Set the font for the footer  
    /page_num page_num 1 add def            % increment page number counter  
    10 10 moveto (Page ) show                 
    page_num page_str cvs show              % convert page number integer to a string and show it  
    grestore  
    showpage_org                            % use the original showpage  
} def  

%Page 1  
/Courier findfont 22 scalefont setfont  
100 500 moveto (Hello) show  
showpage  

%Page 2  
100 500 moveto (World) show  
showpage  

end

谢谢回答!我还没有时间测试这个(问题写了一段时间),但如果我回来测试并且它运行良好,我会更改我的接受答案。 - cwd
你可以在新的“showpage”函数中使用“bind def”。这样,它就会在内部使用原始的“showpage”,而不需要辅助方法,同样避免了递归。 - Ricardo Nolde
你如何将该命令应用于所有/多个页面? (而不是复制粘贴代码#NumOfPages次...) - Dor
@RicardoNolde 没有递归。 - U. Windl
@Dor 每个页面都使用了 showpage,所以您只需要重新定义它,在调用/执行时不需要修改其它东西。 - U. Windl

5

ESP Ghostscript已经非常老旧,除非您绝对无法避免,否则不要再使用它。它是原始Ghostscript的一个分支,在一段时间内由CUPS使用。(在开发人员解决了一些问题后,最近版本的CUPS现在也再次使用GPL Ghostscript...)

新的GPL Ghostscript版本在这里:http://www.ghostscript.com/releases/

此外,-o out.pdf只是-dBATCH -dNOPAUSE -sOutputFile=out.pdf的简写。因此,您应该尝试这样做。(-dNOPAUSE部分可以让您不必每次翻页都按<return>....)

最后,不要期望第三方man gs页面提供完整的文档范围。相反,请参考您所使用的Ghostscript版本的原始文档,其中最重要的部分包括:


更新: Ghostscript已经将其源代码仓库从Subversion迁移到Git。因此,以下链接已经多次更改:

这是关于IT技术的内容,涉及到当前开发分支和一些文档链接。需要注意的是,保留了HTML标签,但不写解释。

我正在使用一个没有安装特权的 ESP 的系统,无法安装升级版本。我想知道是否有办法让它能与 ESP 协同工作... - cwd
ESP Ghostscript不再维护...让它作为非特权用户工作的唯一方法是另外在您的主目录(或任何其他可由您的帐户写入的位置)安装更新版本的Ghostscript。 - Kurt Pfeifle
https://dev59.com/h1PTa4cB1Zd3GeqPk59x#6620599 应该适用于任何 PostScript 解释器。 - U. Windl

1

添加页面页脚的最合适的地方是在 groff 源代码中。当然,具体方法取决于您使用的宏包。对于 -ms,您可以执行以下操作:

.ds RF "Page \\n(PN

添加右页脚的页码。对于-mm,它更像是:

.PF "'''Page \\\\nP'"

其中单引号用于界定页脚的“左部分”、“中心部分”和“右部分”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接