【发布时间】: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 的其他地方失败了。
【问题讨论】:
-
您能否详细说明您认为违反限制操作员的原因?即使用什么操作符?
-
嗯,我得考虑一下……
标签: ghostscript eps