通过unix shell命令编辑postscript(.ps或.eps)数字中的厚度?

时间:2016-11-18 14:30:45

标签: shell unix plot postscript tcsh

我有许多后记(.eps)格式的图形(图表),我希望用这些图形加厚。

我找到了以下代码,但输出文件没有什么不同。我想知道我做错了什么。

代码:

<div class="tab_area"><a href="#" class="tab">Tab 1</a></div>

现在从命令行执行此操作,我使用命令(filename是ps_thicken,并具有适当的权限):

    # get list of all arguments
    set args = ($*)

    # if not enough arguments, complain.
    if ($#args < 2) then
   echo "Usage: ps_thicken ps_file factor"
   echo "Thickens all lines in a PostScript file by changing the linewidth macro."
   echo "Result goes to standard output."
   exit 1
   endif

   sed -e "s/^\/lw {\(.*\) div setlinewidth/\/lw {$2 mul \1 div setlinewidth/" $1

我认为应该使所有东西都厚10倍,但它不会改变任何东西。

任何帮助都会非常感激,我对shell脚本很新!

1 个答案:

答案 0 :(得分:2)

PostScript是一种编程语言,因此无法以这种自动方式进行更改。至少没有编写PostScript程序就可以了!

请注意,线宽不是“宏”(PostScript没有宏)其运算符。您为sed发布的代码(如果我记得sed足够好)是寻找/ lw的定义并将其替换为修改后的版本。问题是/ lw是特定PostScript程序中的函数声明。大多数PostScript程序都没有(或使用)一个名为'lw'的函数。

将PostScript程序代码添加到以下内容会更好:

/oldsetlinewidth /linewidth load def

/setlinewidth {2 div oldsetlinewidth} bind def

这将定义(在当前字典中)一个名为'setlinewidth'的函数。现在,如果以下程序在创建自己的函数时只使用setlinewdith的当前定义,它将使用上面重新定义的函数。在这种情况下,这会产生将所有线宽除以2的效果。显然要增加宽度,你会使用2 mul而不是2 div。

请注意,这绝不是万无一失的,它完全可以让PostScript程序从systemdict显式加载setlinewidth的定义,并且不能替换它(至少不容易),因为systemdict是只读的。

然而,EPS程序不大可能会引发这样的伎俩,所以这应该对你有用。

[基于评论]

嗯,你的意思是'未能导入'到应用程序或其他东西?

如果您将EPS加载到应用程序中,那么只需将该代码放在其前面就会破坏它。 EPS(与PostScript不同)需要遵循一些规则,因此要成功修改它,您必须遵循它们。这包括跳过任何EPS预览。

这不是一项微不足道的练习。您最好的选择可能是通过Ghostscript运行文件,您可以通过利用PostScript解释器来完成工作。

从文件中的2行PostScript开始,然后使用eps2write设备运行要通过Ghostscript“修改”的EPS文件。这将产生一个新的EPS,其中的变化是'烘焙'。

例如(假设线宽修改代码在'lw.ps'中):

gs -sDEVICE=eps2write -o out.eps lw.ps file.eps

但请注意,由此产生的EPS是一个完全重写的程序,与原始程序无关。特别是任何预览缩略图都将丢失。