是否可以在 EndPage 程序中使用 EPS 文件(使用 eps2write 创建)?

Posted

技术标签:

【中文标题】是否可以在 EndPage 程序中使用 EPS 文件(使用 eps2write 创建)?【英文标题】:Is it possible to use EPS file (created with eps2write) in EndPage procedure? 【发布时间】:2015-03-07 17:02:56 【问题描述】:

为了测试,我们画一些无意义的矩形:

gswin32c -q -o f.pdf -sDEVICE=pdfwrite -c "<</PageSize[595 842]>>setpagedevice 0 0 595 842 rectfill showpage"

+

gswin32c -q -o f.eps -sDEVICE=eps2write -f f.pdf

还有ps.ps文件:

<<
    /EndPage 
        exch pop 
        2 ne dup 
            1 dict begin
            /showpage  def
            (f.eps) run
            end
         if
    
>> setpagedevice

然后

gswin32c -q -o out.pdf -sDEVICE=pdfwrite -f ps.ps -f f.pdf

产生错误:

%%[ 由 opdfread.ps 处理的错误:GPL Ghostscript 9.15:不可恢复 错误,退出代码 1 不可恢复的错误:类型检查如果操作数堆栈: typecheck ebuf false false --nostringval--

另一方面,如果我使用其他工具创建 EPS,例如xpdfpdftops

pdftops -eps f.pdf f.eps

... 然后 EPS 可以放置为例如带有上述命令的水印或标志:

gswin32c -q -o out.pdf -sDEVICE=pdfwrite -f ps.ps -f f.pdf

所以问题是,是否可以使用 Ghostscript 的 eps2write 来达到目的,也许我遗漏了一些东西。

我尝试按照 Adob​​e 的 EPSF 格式规范 中的定义将 (f.eps) run 与对 BeginEPSFEndEPSF 的调用括起来,但它没有帮助。在解码eps2write 创建的序言之后(如果从EndPage 运行,它本身会给出相同的错误),在我看来它违反了上述规范的非法和受限运算符部分。

编辑: 如果代码从EndPage 运行,我认为立即评估的名称 存在问题。在eps2write 创建的序言中,有一个片段离开头不远:

//SetPageSize
//RotatePages//FitPages or//CenterPages or
mark(/RotatePages, /FitPages and CenterPages are not allowed with /SetPageSize)//error exec
if


//FitPages//CenterPages and
mark(CenterPages is not allowed with /FitPages)//error exec
if

ifelse

如果我这样构图:

SetPageSize ==
//SetPageSize ==


//SetPageSize
//RotatePages//FitPages or//CenterPages or
mark(/RotatePages, /FitPages and CenterPages are not allowed with /SetPageSize)//error exec
if


//FitPages//CenterPages and
mark(CenterPages is not allowed with /FitPages)//error exec
if

ifelse

 stopped  (***\n) print  if

并对ps.ps稍作修改:

<<
    /EndPage 
        exch pop 
        2 ne dup 
            1 dict begin
            /showpage  def
            (prologue.ps) run
            end
         if
    
>> setpagedevice

然后这个命令:

gswin32c -q -o out.pdf -sDEVICE=pdfwrite -f ps.ps -f f.pdf

...给出这个输出:

false 
/SetPageSize
*** 
%%[ Error handled by opdfread.ps : GPL Ghostscript 9.14: Unrecoverable error, exit code 1

即它在上面的片段中失败了(我认为原因很明显),然后在prologue.ps 的其他地方失败了。

【问题讨论】:

您能否详细说明您认为违反限制操作员的原因?即使用什么操作符? 嗯,我得考虑一下…… 【参考方案1】:

好的,所以我做了与您的经历类似的事情。我从一个简单的 PostScript 文件(testeps.ps)开始:

%!
0 1 0 setrgbcolor
0 0 100 100 rectfill
showpage

然后我使用 eps2write 设备通过 Ghostscript 运行它:

./gs -sDEVICE=eps2write -sOutputFile=out.eps -dCompressPages=false testeps.ps

然后我构建了另一个测试文件(test.ps):

%!

<<
    /EndPage 
        exch pop 
        2 ne dup 
            1 dict begin
            /showpage  def
            (/temp/out.eps) run
            end
         if
    
>> setpagedevice

1 0 0 setrgbcolor
0 100 100 100 rectfill

showpage

并通过 GS 运行:

./gs test.ps

文件运行完成,并在页面上的正确位置包含适当颜色的矩形。

这可能是已经修复的问题(你没有说你使用的是什么版本的 Ghostscript)。下一个版本 (9.16) 即将发布,或者您可以自己从源代码构建 iot,我建议您在可用时尝试。

【讨论】:

这个想法是用一个“戳记”(例如徽标)“戳记”现有的多页 PDF,其中只包含对 setpagedevice 的调用(加上外部 EPS)。然后命令 fails 如我所述(GS 版本 9.14、9.15)。但是,正如我现在发现的那样,查看您的示例,如果我们标记 postscript 文件(而不是标记 PDF),命令确实 not 失败。所以有一个简单的解决方法,我应该在发布这个问题之前检查它。而且,我还有一个小问题,这次使用BeginPage,也许它会是另一个问题,尽管我会在发布之前做更多检查:) Ghostscript PDF 解释器做了一些棘手的事情,我不确定我是否会依赖 BeginPage 和 EndPage 的行为,尽管它确实“通常”工作......

以上是关于是否可以在 EndPage 程序中使用 EPS 文件(使用 eps2write 创建)?的主要内容,如果未能解决你的问题,请参考以下文章

将 EPS 图像插入 PostScript 文档

使用 javamail 解析 eps 附件

EndGame() 函数后程序失败

如何解析 EPS 以获得网格类数据?

latex不能识别eps图片

浮点数比较