如何在 linux 中的 postscript 或 pdf 文件的每一页底部添加页脚?

Posted

技术标签:

【中文标题】如何在 linux 中的 postscript 或 pdf 文件的每一页底部添加页脚?【英文标题】:How can I add a footer to the bottom of each page of a postscript or pdf file in linux? 【发布时间】:2011-01-22 07:47:28 【问题描述】:

所以我想在我通过 postscript 在 linux 中使用 groff 生成的 pdf 文件的每一页底部添加一个“页脚”(一个属性)。我正在使用 ps2pdf 工具自己将文件从 ps 转换为 pdf,因此我可以访问这两种格式。

这两个帖子有点帮助:

How to add page numbers to Postscript/PDF

How can I make a program overlay text on a postscript file?

我不反对使用第一种方法,但我无法访问第一个脚本中提到的pdflatex 实用程序,我也无法选择将其安装在需要完成工作的机器上.

看起来第二种方法可能可行,但我安装了版本 8.15 的 ghostscript,我没有看到手册页 (http://unix.browserdebug.com/man/gs/) 上列出的许多标志。我想我可以访问“-c”标志来插入一些后记代码,即使它没有列出。无论如何,这是我尝试失败的两个命令:

gs -o 输出.pdf -sDEVICE=pdfwrite -g5030x5320 \ -c "/Helvetica-Italic findfont 15 scalefont setfont 453 482 moveto (test-string) show" \ -f 输入.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 输入.ps

它输出这个并让我点击返回 4 次(可能 input.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 完成。 为 NimbusRomNo9L-Regu 使用 NimbusRomanNo9L-Regu 字体。 >>显示页面,按继续>显示页面,按继续>显示页面,按继续>显示页面,按继续

因此,使用gs 在 ps 文件中简单地插入一些东西似乎很简单,但事实证明它相当复杂......

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

感谢您的回答!还没有时间对此进行测试(不久前写了这个问题),但如果我回到这个问题并且效果很好,我会改变我接受的答案。 您可以在新的“显示页面”功能中使用“绑定 def”。这样,它内部使用了原始的“显示页面”,不需要辅助方法,也避免了递归。 如何将该命令应用于所有/多个页面? (而不是复制粘贴代码#NumOfPages 次...)【参考方案2】:

ESP Ghostscript 是 O-o-o-o-old。不要再使用它,除非你绝对,绝对不能避免它。它是 CUPS 使用了一段时间的原始 Ghostscript 的一个分支。 (在解决了开发人员之间的一些问题之后,更新的 CUPS 版本现在也再次使用 GPL Ghostscript...)

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

另外,-o out.pdf 只是-dBATCH -dNOPAUSE -sOutputFile=outpdf 的简写。所以你应该试试这个。 (-dNOPAUSE 部分让您不必在每页前进时点击<return>....)。

最后,不要指望 第三方 man gs 页面会提供完整范围的文档。而是参考您使用的版本的原始 Ghostscript 文档,最重要的部分是:

当前开发分支:Readme.htm + Use.htm + Ps2pdf.htm 9.00 发布:Readme.htm + Use.htm + Ps2pdf.htm 8.71 发布:Readme.htm + Use.htm + Ps2pdf.htm

更新: Ghostscript 已将其源代码存储库移至 Git(而不是 Subversion)。因此,以下链接已多次更改:

当前开发分支:Readme.htm + Use.htm + Ps2pdf.htm 当前开发分支:Readme.htm + Use.htm + Ps2pdf.htm

【讨论】:

我使用的系统安装了 ESP,但没有安装升级版本的权限。我想知道是否有办法让它与 ESP 一起工作...... ESP Ghostscript 不再维护.... 让它作为非特权用户工作的唯一方法是在您的主目录(或任何其他地方)另外安装更新版本的 Ghostscript可由您的帐户写入)。【参考方案3】:

添加页脚最合乎逻辑的地方是groff 源。执行此操作的确切方法当然取决于您使用的宏包。对于-ms,你可以这样做:

.ds RF "Page \\n(PN

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

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

单引号分隔页脚的'left part'center part'right part'。

【讨论】:

以上是关于如何在 linux 中的 postscript 或 pdf 文件的每一页底部添加页脚?的主要内容,如果未能解决你的问题,请参考以下文章

如何使 ghostscript 将 postscript 文件中的单个特定页面输出为 png?

想要嵌入字体但无法从 Font Suitcase 或 PostScript Type 1 文件转换 [关闭]

打印机设置到 PostScript 或 PCL 文件

在 C++ 中测量 postscript 字体宽度

如何使用 Ghostscript 在 Postscript 中导入 png 文件?

PostScript语言教程(坐标变换)