使用PostScript查找字符串并转换为ASCII

时间:2011-04-18 10:29:05

标签: hex ghostscript postscript

对于postscript编程我是一个全新手,我试图在这里的天才的帮助下找到我的问题的解决方案。

我是一名学生,目前正在处理一个项目,我们应该从postscript文件中读取一些内容并将其放在一个新的postscript文件中。

我想在ghostscript的帮助下编辑一个postscript文件,以便输出我从原始postscript文件中选择的某些值。

现在我有一个文件来执行此操作,但我想获取嵌入在十六进制字符串中的字体并对其进行解码,以便从中获取ASCII符号。

原始文件的对象看起来像这样

/ g5< 1C60D8A8C9B64EDFFB83C6241DB110BEE5AB2FAD9D94B39ED5E81E7411B 66E9361DDE78FC667AB91EF9824>

我想要做的就是把它们拿出来并在postscript代码(systemdict ???)中查看一些字典并检查它的值。

有没有人有这样的事情或一个例子来做这件事?

现在我挑选文件的代码启动如下: (%stdout)(w)文件def

我在哪里获取文件,现在我想搜索字母“< 1C60D8”,并复制它与符号“>”之间的所有内容。

之后我想检查十六进制代码隐藏在它下面的内容,在本例中是Arial中的“E”。

我想提取文本,这样我就可以在没有十六进制字符串和纯ASCII格式的新文件中使用它。因此,例如变成“P”。 之后,我可以制作一个软件,从新的postscript文件中选出“P”并将其放在我的主页上,最终结果是一个主页,其中包含了上一次考试的每个人测试结果。

现在我正在使用ghostscript和我在互联网上找到的以下命令行来提取文件中的信息。

gswin32c.exe -q -dNODISPLAY -dNOPAUSE -sFONTPATH = C:\ WINDOWS \ Fonts -dBATCH extract.ps input.ps> output.ps

其中extract.ps是我需要进行一些编码以检索十六进制字符串并对其进行编码并最后输出它以使其成为“普通”字体的文件,并且还写入它们应该位于的某些坐标中的位置

如果你有任何关于我应该如何开始的知识,那就太棒了。现在我认为这可能不会起作用,我将不得不像其他学生那样做另一种方法,但是因为我发现PostScript是一种编程语言,我以为我可以做到。

现在我想我可能需要在开始时做这样的事情。 (%STDOUT)(w)的 测试{            dup ????      writestring      检查systemdict?      G检查?           } bind def 显示测试???

我目前正在尝试阅读一些我在互联网上找到的文献,但这很难!

如果您知道如何解决问题,请举例说明

祝你好运!

1 个答案:

答案 0 :(得分:2)

我认为你走在正确的轨道上。 PostScript 一种编程语言,因此出于一般目的,您必须使用PostScript解释器来处理它。简单地解析文件或任何其他类似方法在一般情况下不起作用(尽管它可能是一个简单的文件)。

您引用的原始对象似乎可能是字体中的字形描述,可能是类型3字体,可能由Fontographer生成,但这只是猜测。请注意,字形不是字体,字体是字形的集合。

如果我这样做,我将首先重新定义各种PostScript运算符。例如,如果重新定义“show”,则可以在绘制时拾取文本(实际上有几种show运算符,您需要重新定义它们)。同时你可以选择字体字典,然后你可以安排将它输出到文件中。

例如,您可以从:

开始
%!PS
% redefine.ps
%

/OutputFile (/out.txt) (w) file def

/show {
  OutputFile exch writestring
} bind def

然后运行此命令:

gswin32 redefine.ps input.ps

它将运行redefine.ps,重新定义运算符,然后它将解释input.ps。重新定义的“show”运算符会将任何“show”操作的字符串参数写入名为/out.txt的文件。

显然你可以将它扩展到其他show运算符。您还可以获取字体词典的副本,然后根据需要发出它们。这里有一些编程,但这是一个大纲:

%!PS
%

/OutputFile (/out.txt) (w) file def

%% FontStore will be an array of font dictionaries
/FontStore 1 array def

/CheckFont {
  currentfont /FontName get %% Extract the name of the current font from the 
                            %% font dictionary 
  true                      %% termination condition
  FontStore {               %% forall is called for each member of the array
    /FontName get           %% get font name from stored font dictionary
    2 index                 %% copy the current font name from the stack
    eq                      %% See if they are the same
    {
      pop                   %% remove the 'false' condition
      false                 %% replace it with a 'true'
      exit                  %% and exit the loop
    } if
  } forall
  exch pop                  %% remove stored font name
  {
    %% make the array one bigger, copy the old array, add the current font dict.
  } if
} def

/show {
  CheckFont
  OutputFile exch writestring
} bind def

/showpage {
  %% Emit the fonts if required, potentially reorder the stored strings etc.
} bind def

现在每当我们执行'show'时,我们都会检查当前字体是否已经存储,如果没有则存储它。在页面的末尾(当执行showpage时)我们可以做其他事情,比如将存储的字体字典作为字体发出等等。

您可能想要做的一件事是在字符串到达​​'show'时记录字符串的位置,当前点操作符将在显示时显示x.y位置。您可以决定将字符串及其位置存储在数组中,而不是将它们写入文件。实际上,您可以构建一个包含有用信息的字典:

/show {
  5 dict            %% make a dictionary
  begin             %% start it (put it on the dict stack as the current dict)
  /String exch def  %% put the string operand in the dict.
  currentpoint      %% get the current location
  /Y exch def       %% store in the dict
  /X exch def       %%
  currentfont       %% get current font dict
  /FontName get     %% get FontName
  /Font exch def    %% store name in dict
  currentfont       %% copy current dict to operand stack
  end               %% close dictionary and remove from dict stack
  %%
  %% In here, add the newly created dictionary to an array of dictionaries
  %%
} bind def

现在,当你进入'showpage'时,你有一个字体数组,以及一个包含其属性的字符串片段数组。您可以发出字体,然后写出适当的字体选择条件和字符串,以“显示”输出PostScript文件中的字符串。

你可以做更多的事情,你可以捕捉颜色,你需要CTM,这样你就可以计算出你需要的字体点大小等等。