【问题标题】:Find string and convert to ASCII with PostScript使用 PostScript 查找字符串并转换为 ASCII
【发布时间】:2011-04-18 10:29:04
【问题描述】:

在 postscript 编程方面,我完全是新手,我试图在这里的天才的帮助下找到解决问题的方法。

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

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

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

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

/g5

而我想要做的是把它们挑出来,对照后记代码(systemdict???)中的一些字典检查它们,然后找出它的值。

有没有人有类似的东西或例子可以做到这一点?

现在我挑选文件的代码是这样开始的: (%stdout) (w) 文件定义

我在哪里得到文件,现在我想搜索让我们说字符串“”之间的所有内容

之后我想检查隐藏在它下面的十六进制代码,在本例中是 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 是一种编程语言后,我认为我可以做到。

现在我在想我可能需要在一开始就做这样的事情。 (%标准输出)(w) 测试{ 嘟嘟???? 写字符串 检查systemdict? 核对?? } 绑定定义 显示测试???

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

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

最好的问候!

【问题讨论】:

    标签: hex ghostscript postscript


    【解决方案1】:

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

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

    如果我这样做,我会从重新定义各种 PostScript 运算符开始。例如,如果重新定义'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的文件中。

    显然,您可以将其扩展到其他节目运营商。您还可以复制字体字典,然后根据需要发出它们。涉及到一些编程,但这里有一个大纲:

    %!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
    

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

    您可能想要做的一件事是记录字符串到达​​“show”时的位置,currentpoint 运算符将在 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,以便计算您需要的字体点大小等等。

    【讨论】:

    • 哇!那是很多信息! :D 非常感谢,我将尝试准确解释您是如何编写代码的,我会再次向您咨询更多问题 :D
    • 抱歉再问一次,但你永远不知道什么时候你可能会再次在线,但你能帮助编辑文本以便更容易插入到 redefine.ps 文件中吗?我无法编辑出什么是 cmets 和什么是代码! :/ 最好的问候!
    • @Joe:您自己的问题也没有很好的格式。先改进那个怎么样? :-)
    • 不情愿地,你可以在 spamcop.net 上使用 ken。
    猜你喜欢
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多