Найти строку и преобразовать в ASCII с помощью PostScript

Я полный новичок, когда дело доходит до постскриптумного программирования, и я пытался найти решение своей проблемы с помощью здешних гениев.

Я студент, который в настоящее время работает над проектом, в котором мы должны прочитать что-то из файла постскриптума и поместить его в новый файл постскриптума.

Я хочу отредактировать файл postscript с помощью ghostscript, чтобы сделать вывод с определенными значениями, которые я выбрал из исходного файла postscript.

Прямо сейчас у меня есть файл, который делает это, но я хочу получить шрифты, встроенные в шестнадцатеричную строку, и декодировать ее, чтобы получить из нее символ ASCII.

В исходном файле есть объекты, которые выглядят примерно так

/g5 ‹1C60D8A8C9B64EDFFB83C6241DB110BEE5AB2FAD9D94B39ED5E81E7411B 66E9361DDE78FC667AB91EF9824>

И что я хочу сделать, так это выбрать их и проверить их по какому-то словарю в коде постскриптума (systemdict???) и выбрать его значение.

У кого-нибудь есть что-то подобное или пример для этого?

Прямо сейчас мой код для выбора файла начинается примерно так: (%stdout) (w) file def

где я беру файл и теперь хочу найти скажем строку "‹1C60D8" и скопировать все что находится между этим и символом ">"

После этого я хочу проверить, что скрывает под собой шестнадцатеричный код, в данном случае это буква «Е» в Arial.

Я хочу извлечь текст, чтобы иметь его в новом файле без шестнадцатеричных строк и в чистом формате ASCII. Так становится "P", например. После этого я могу сделать программное обеспечение, которое выбирает «P» из нового файла постскриптума и помещает его на мою домашнюю страницу, и конечным результатом будет домашняя страница, например, с результатами всех тестов с последнего экзамена.

Прямо сейчас я использую ghostscript и следующую командную строку, которую я нашел где-то в Интернете, чтобы извлечь информацию из файла.

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

где Extract.ps - это файл, в котором мне нужно сделать некоторую кодировку, чтобы получить шестнадцатеричную строку, закодировать ее и, наконец, вывести ее, чтобы она стала «нормальным» шрифтом, а также записать некоторые координаты того, где они должны лежать.

Если у вас есть какие-либо знания о том, как я должен начать, это было бы здорово. Прямо сейчас я думаю, что это, вероятно, не сработает, и мне придется использовать другой подход, как и другим студентам, но, поскольку я узнал, что PostScript — это язык программирования, я подумал, что смогу это сделать.

Прямо сейчас я думаю, что мне, вероятно, нужно сделать что-то подобное в начале. (%Stdout)(w) test{dup ???? проверка writestring на systemdict? гчек?? } связать деф-шоу тест???

В настоящее время я пытаюсь читать некоторую литературу, которую я нашел в Интернете, но это очень сложно!

Если вы знаете, как решить проблему, с примером, пожалуйста, дайте мне знать

С наилучшими пожеланиями!


person Joe    schedule 18.04.2011    source источник


Ответы (1)


Вы на правильном пути, на мой взгляд. 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.

Очевидно, вы можете распространить это на других операторов шоу. Вы также можете делать копии словарей шрифтов, а затем создавать их по мере необходимости. Там немного программирования, но вот схема:

%!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 даст вам позицию 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, чтобы вы могли рассчитать нужный размер шрифта и так далее.

person KenS    schedule 19.04.2011
comment
Вау! Это очень много информации! :D большое спасибо, я постараюсь интерпретировать именно то, как вы написали код, и я вернусь к вам снова, чтобы задать дополнительные вопросы:D - person Joe; 19.04.2011
comment
Извините, что спрашиваю еще раз, но вы никогда не знаете, когда. Возможно, вы снова будете в сети, но не могли бы вы помочь отредактировать текст, чтобы его было легче вставлять в файл redefine.ps? У меня проблемы с редактированием комментариев и кода! :/ С наилучшими пожеланиями! - person Joe; 19.04.2011
comment
@Joe: твой собственный вопрос тоже не очень хорошо отформатирован. Как насчет того, чтобы сначала улучшить эту? :-) - person Kurt Pfeifle; 27.04.2011
comment
Скрепя сердце, вы можете использовать ken на spamcop.net. - person KenS; 12.07.2011