Найти строку и преобразовать в ASCII с PostScript - PullRequest
2 голосов
/ 18 апреля 2011

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

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

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

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

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

/ g5 <1C60D8A8C9B64EDFFB83C6241DB110BEE5AB2FAD9D94B39ED5E81E7411B 66E9361DDE78FC667AB91EF9824>

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

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

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

где я получаю файл, и теперь я хочу найти, скажем, строку «<1C60D8» и скопировать все, что находится между этим и символом «>»

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

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

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

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

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

Если у вас есть какие-либо знания о том, как я должен начать, это было бы здорово.Прямо сейчас я думаю, что это, вероятно, не сработает, и мне придется использовать другой подход, как и другие студенты, но так как я узнал, что PostScript - это язык программирования, я подумал, что смогу его сделать.Я думаю, что мне, вероятно, нужно сделать что-то подобное в начале.(% Stdout) (w) test {dup ????проверка письменной проверки против системного приговора?gcheck ??} bind def show test ???

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

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

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

1 Ответ

2 голосов
/ 19 апреля 2011

Вы на правильном пути, по моему мнению. 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

Теперь, когда мы выполняем 'show', мы проверяем, сохранен ли текущий шрифт, и сохраняем его, если нет. В конце страницы (при запуске 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, чтобы вы могли рассчитать необходимый размер шрифта и т. Д.

...