是否可以在 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,例如xpdf
的pdftops
:
pdftops -eps f.pdf f.eps
... 然后 EPS 可以放置为例如带有上述命令的水印或标志:
gswin32c -q -o out.pdf -sDEVICE=pdfwrite -f ps.ps -f f.pdf
所以问题是,是否可以使用 Ghostscript 的 eps2write
来达到目的,也许我遗漏了一些东西。
我尝试按照 Adobe 的 EPSF 格式规范 中的定义将 (f.eps) run
与对 BeginEPSF
和 EndEPSF
的调用括起来,但它没有帮助。在解码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 创建)?的主要内容,如果未能解决你的问题,请参考以下文章