PostScript

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 20:00, 28 ноября 2018.
PostScript
Postrscript.png
Парадигма мультипарадигмальный, стековый, процедурный
Спроектировано Джон Уорнок, Чарльз Гешке, Дуглас Броц, Эд Тафт, Билл Пэкстон
Разработчики Adobe Inc.
Первый   появившийся 1982 - PostScript
Печать дисциплины Динамическая, сильная
Расширение файла .ps
Портал: Adobe PostScript 3
Главная реализация
Adobe PostScript, TrueImage, Ghostscript, InterPress
Под влиянием
InterPress, Lisp
Влияние
PDF
PostScript
Расширение файла .ps
Интернет-тип носителя application/postscript
Однородный идентификатор типа (UTI) com.adobe.postscript
Магические числа %!
Разработчик Adobe Inc.
Тип формата printing file format
Расширенный Encapsulated PostScript

PostScript - язык описания страниц, в основном используемый в настольных издательских системах. Это конкатенативный язык программирования с динамической типизацией. Был разработан в Adobe Systems Джоном Уорноком и Чарльзом Гешке в 1982-1984 годах.

Концепция

Изначально Postscript использовался как ядро механизма печати компьютеров Apple, но вскоре стал широко распространенным для большинства компьютерных систем. Интерпретаторы Postscript (в виде программных или аппаратных компонентов) для печати документов присутствуют практически во всех современных компьютерных системах. В Postscript используется модель изображения текста (или рисунков) на чистой странице. Когда страница готова, она выводится на печать и начинается «прорисовка» изображения очередной страницы. Это есть не что иное, как метод компиляции. Каждый документ Postscript обычно представляет собой программу, которая печатает на принтере (или отображает на экране монитора следующие друг за другом страницы.

История

Концепция языка PostScript была заложена в 1976 году Джоном Уорноком, сотрудником Evans and Sutherland Computer Corporation. Его коллега Джон Гэфни, занимавшийся тогда интерпретатором для большой базы данных трёхмерной графики Нью-Йоркского порта, создал язык «Design System» (очень похожий на FORTH. Позже Джон Уорнок перешёл в исследовательский центр Xerox в Пало-Альто Xerox P.A.R.C. и вместе с Мартином Ньювелом создал на базе Design System новую систему JaM (John and Martin), использовавшуюся в исследованиях печати и развившейся в InterPress, протокол печати Xerox.

В 1982 году Джон Уорнок уволился из Xerox и вместе с Чаком Гешке (Chuck Geschke) основал Adobe Systems Inc. Вначале их целью было создание специализированной рабочей станции для печати, которая должна была называться PostScript, но они вскоре поняли, что лучше сконцентрировать усилия на разработке средств для управления принтерами сторонних производителей.

PostScript Level 1

В 1984 году увидел свет PostScript (позже к названию было добавлено "Level 1", чтобы отличать его от Level 2). Postscript имел ряд преимуществ перед другими системами того времени:

  • Платформонезависимость. Один и тот же файл мог печататься как на лазерном принтере, выдававшем тогда 300 dpi, так и на фотонаборном устройстве с 2400 dpi, с наилучшим возможным качеством в каждом случае.
  • Любой производитель мог лицензировать интерпретатор PostScript и использовать PostScript со своим устройством.
  • Спецификации PostScript были общедоступны, таким образом, любой разработчик мог писать программы, поддерживающие PostScript.

Adobe рисковала, выпуская PostScript, и, возможно, ей не удалось бы убедить рынок в необходимости такого языка, если бы не Стив Джобс из Apple Computer. В 1985 году продажи компьютеров Macintosh начали падать, и Apple нужен был «killer app» — нечто, что мог бы только её компьютер. Стив Джобс инвестировал 2,5 миллиона долларов в Adobe, которая создала PostScript-контроллер для принтера Apple LaserWriter, и в Aldus, создавшую программу PageMaker, использовавшую все возможности Macintosh и LaserWriter. Появившаяся тогда возможность допечатной подготовки на компьютере спасла Apple и превратила Adobe и Aldus в крупные компании. Другие производители фотонаборной аппаратуры, начиная с Linotype, оценили PostScript и вскоре оснастили свою продукцию интерпретаторами PostScript. PostScript стал стандартом в области допечатной подготовки.

PostScript Level 2

В 1991 Adobe выпустила следующую ревизию PostScript — PostScript Level 2.

Основными улучшениями были:

  • увеличенная скорость и надёжность (в основном это коснулось управления памятью);
  • поддержка цветоделения в самом контроллере;
  • распаковка сжатых изображений в самом контроллере (JPEG и CCITT group 4);
  • поддержка больших наборов шрифтов (для азиатских стран);
  • кэширование шрифтов и изображений;
  • улучшенные драйверы;
  • улучшенные алгоритмы печати изображения (Accurate Screening).

Adobe совершила ошибку, обнародовав спецификации PostScript Level 2 до начала работ по его аппаратной реализации. Конкуренты неожиданно вышли на рынок с эмуляторами PostScript Level 2 раньше самой Adobe. В результате потребовалось очень много времени, прежде чем приложения начали использовать все новые функции PostScript level 2. Такая функция, как цветоделение в контроллере до сих пор не поддерживается XPress 5, хотя с момента выхода Level 2 прошло много лет.

PostScript 3

В конце 1997 года был представлен PostScript 3 (Adobe отказалась от терминологии "level" для упрощения нумерации версий).

PostScript 3 был знаменателен с точки зрения замены существующих систем цветной электронной допечатной подготовки, тогда широко используемой в производстве журналов, благодаря внедрению операций плавного шэйдинга с 4096 оттенками серого (вместо 256 доступных в PostScript Level 2), а также DeviceN - цветового пространства, позволяющего добавлять дополнительные цвета (называемые плашечными цветами) в составные цветные страницы.

Применение в печати

До PostScript

До появления PostScript, принтеры получали входные данные для печати в виде текста, обычно в ASCII. Для данной задачи существовало ряд технологий, но большинство из них объединял общий недостаток – глифы было тяжело изменить, так как они были физическими оттисками на печатных головках, металлических или оптических пластинах.

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

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

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

PostScript

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

PostScript — больше, чем типичный язык управления принтером, он является полнофункциональным языком программирования. Многие прикладные программы могут преобразовать документ в PostScript-программу, при выполнении которой будет получен начальный документ. Эта программа может быть послана непосредственно на принтер с поддержкой PostScript или преобразована интерпретатором PostScript в другой формат (для принтеров без поддержки PostScript), или результат её выполнения интерпретатором может быть показан на экране. Так как исходная PostScript-программа одна и та же, PostScript называется независимым от устройства.

Большинство высокопроизводительных принтеров и плоттеров имеют встроенный интерпретатор языка PostScript. В то же время, простые принтеры домашнего класса поддерживают только элементарные графические операции, поэтому задача создания растрового изображения возлагается на центральный процессор. Существуют интерпретаторы языка PostScript для различных операционных систем, наиболее известный из них — свободная программа Ghostscript.

Вместо печати документа на принтере можно сохранить PostScript-языковое описание документа как файл «.PS» для печати на удаленных принтерах, предназначенный, например, поставщику услуг допечатной подготовки. Поставщик услуг может отправить файл .ps прямо на устройство вывода изображения. Размер PostScript-файла обычно больше, чем размер исходного InDesign документа, так как графика и шрифты встроены.

Применение в качестве графической системы

PostScript стал коммерчески успешен благодаря внедрению графического интерфейса пользователя, позволив напрямую редактировать макеты страниц для вывода на лазерном принтере. Однако, графические системы компьютеров были куда примитивнее самого PostScript; QuickDraw от Apple, к примеру, поддерживала только стандартные линии и дуги, но не сложные B-сплайны и функции заливки областей, как в PostScript. Чтобы в полной мере использовать возможности PostScript, программам приходилось переопределять такие функции используя собственную графическую систему платформы. Из-за этого зачастую созданная пользователем раскладка страницы и печатный вывод отличались друг от друга.

С ростом вычислительных мощностей компьютеров, стало возможным работать с системой PostScript на самом компьютере, а не на принтере, как ранее. Это привело к развитию PostScript из печатной системы в систему, которую можно было использовать как графический язык компьютера. У данного подхода было множество преимуществ; он не только устранял возможность несоответствия исходных данных и печатного вывода, но и давал компьютеру мощную графическую систему, позволяя упростить устройство принтеров, что вело к снижению их стоимости.

Однако, PostScript создавался как печатная система, и имел ряд особенностей, делающих его неподходящим для использования в качестве интерактивной системы отображения. Например, PS был основан на идее накопления команд отрисовки до появления команды showpage, после которой все поданные ранее команды обрабатывались и выводились в графическом виде. Очевидно, что для интерактивной системы это было неуместно. PS в целом не подразумевал никакой интерактивности; например, поддержка ввода с мыши не была предусмотрена в PS, разрабатывавшемся как язык для принтеров. Когда Стив Джобс покинул Apple и основал NeXT, он предложил Adobe использовать PS как графическую систему на своих новых компьютерах. Так появился Display PostScript, DPS. В нём появились такие возможности, как моментальное применение каждой команды, а также возможность вызова PS-кода напрямую кодом на языке C.

Компания Sun Microsystems пошла по другому пути, создав NeWS. Вместо того, чтобы позволить PS взаимодействовать с программами на С, NeWS расширила PS до языка, который можно было использовать как основную графическую систему компьютера. В язык были добавлены расширенные возможности для интерактивности, а также структуры данных и другие элементы, позволяющие PS стать полностью объектно-ориентированным языком. Однако, попытки стандартизировать систему X11 привели к её распространению среди систем Sun, и NeWS так и не стал широкоиспользуемым.

Encapsulated PostScript
Расширение файла .eps
.epsf
.epsi
Интернет-тип носителя application/postscript, application/eps, application/x-eps, image/eps, image/x-eps
Тип кода EPSF
TEXT
Однородный идентификатор типа (UTI) com.adobe.encapsulated-postscript
Тип формата Vector image format
Расширенный от PostScript

Encapsulated PostScript

Encapsulated PostScript (EPS) — формат файлов, базирующийся на подмножестве языка PostScript и предназначенный для обмена графическими данными между различными приложениями. Формат EPS был создан компанией Adobe и послужил базой для создания ранних версий формата Adobe Illustrator.

EPS-файлы – это, в некоторой степени, автономные PostSctipt-документы, которые содержат описание изображения или рисунка и могут быть помещены в другой PostScript-документ. Другими словами, EPS-файл – программа на PostScript, сохранённая отдельным файлом. EPS-файл также содержит изображение с предварительным просмотром результата в низком разрешении, которое некоторые программы могут отображать на экране в процессе работы.

Язык

PostScript — полнофункциональный тьюринг-полный язык программирования. Хотя программы на PostScript и создаются в основном не людьми, а другими программами, в принципе ничто не мешает писать на нём программы[1] для обсчёта графики, реализации численных методов решения математических задач и т. п.

PostScript — интерпретируемый стековый язык, похожий на Forth. Синтаксис языка использует обратную польскую нотацию, что делает ненужным использование скобок, однако требует некоторой практики для чтения текста программы из-за необходимости держать в голове содержимое стека. Большинство операторов берут операнды из стека и помещают результат вычислений в стек. Литералы (строки и числа) помещают свою копию в стек.

В PostScript для рисования используется двумерная прямоугольная система координат, начало которой совпадает с левым нижним углом страницы; ось X по умолчанию направлена горизонтально (то есть по ширине страницы), ось Y — вертикально. Единицей измерения линейных координат служит типографский пункт. С помощью операторов языка начало системы координат может быть перенесено в любую точку (оператор translate), а сама система — повернута на произвольный угол в плоскости страницы (оператор rotate); масштаб по каждой из двух осей с помощью оператора scale также может быть изменен. Например, «зеркальный» вывод изображения на пленку (т. н. «Emulsion down») в PostScript-принтерах осуществляется при помощи одного единственного оператора scale, задающего отрицательный масштаб по одной из осей системы координат: например, -1.0 1.0 scale.

PostScript имеет черты метафайла, совмещая поддержку как векторных, так и растровых изображений. Шрифты в PostScript только векторные. Немного особняком стоят т. н. Type3-шрифты, в которых для рисования глифов (процедура /BuildGlyph) может быть использована любая процедура, сформулированная в терминах языка PostScript. После выхода SP4 для Windows NT 4.0 в 1998 году при установленном в системе Adobe Type Manager 4.0 и драйвере AdobePS 5 все шрифты в не-roman кодировке, в частности кириллица выгружались в PostScript-файл в виде Type3-шрифтов, где каждый глиф был представлен в виде растрового изображения соответствующего разрешения. Выгрузка шрифта в виде растровых изображений создала много проблем при подготовке к выводу на фотонабор и допечатной подготовке вообще. Эта ошибка была исправлена в AdobePS 5.1 и Adobe Type Manager 4.1, которые затем вошли в дистрибутив Windows 2000.

Структура документа

Структура файла PostScript формируется структурными комментариями. Структурные комментарии начинаются с последовательности символов «%%» в начале строки.

Файл PostScript состоит из четырёх частей: заголовка, пролога, тела и эпилога.

Заголовок начинается строкой «%!PS-Adobe-N.M» где N.M — версия спецификации, далее идут структурные комментарии с общими свойствами документа, и заканчивается заголовок строкой «%%EndComments».

%!PS-Adobe-2.0
%%Creator: dvips(k) 5.78 Copyright 1998 Radical Eye Software
%%Title: rep.dvi
%%Pages: 9%%PageOrder: Ascend
%%BoundingBox: 0 0 596 842
%%EndComments

В прологе обычно содержатся описания подпрограмм и данные, необходимые для печати документа — например, процедуры и шрифты. Пролог заканчивается комментарием «%%EndProlog».

В теле программы содержатся команды, отвечающие за отрисовку каждой страницы, предваряемые строкой «%%Page: <метка> <номер>», где <метка> — метка страницы, которая не выводится на печать, и <номер> — порядковый номер страницы в файле, например, %%Page: iii 3

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

В эпилоге можно продублировать комментарии из заголовка (это реализовано на случай, если в начале вывода программе ещё не известно, например, число страниц) — в этом случае вместо числовых значений параметров в заголовке надо писать «(atend)».

Заканчивается файл строкой «%%EOF».

Обзор элементов языка

Стеки

В PostScript для хранения данных разных типов используются четыре стека: стек операндов, стек графических контекстов, стек исполнения, стек словарей.

Типы данных

Основные типы данных языка PostScript: целое число со знаком, вещественное число, логическое выражение (true или false), строка символов ( ( … ) ), массив ( [ … ] ), процедура ( { … } ), словарь, имя.

Операторы

Операторы в PostScript получают операнды (параметры), вынимая их из стека, и записывают результаты действий (если они есть) также в стек. Такой стиль программирования, при котором операнды задаются до операции над ними (оператора), называется постфиксной нотацией. Например, для сложения двух заданных чисел необходимо вначале поместить их в вершину стека операндов, затем выполнить команду add, которая извлечёт из стека два элемента, помещённые последними (то есть заданные числа), сложит их и запишет результат в стек, откуда он сможет быть извлечён другой операцией в качестве операнда. Это записывается так:

4 5 add

Операторы PostScript можно разделить на несколько групп. Это операторы для работы с содержимым стека (независимо от типа), арифметические операции, операторы работы с массивами, работы со словарями, работы со строками, сравнения, управления потоком команд, работы с типом аргументов и преобразования, доступа и работы с файлами, работы с виртуальной памятью, графического состояния и другие.

Краткий обзор механизма рисования изображения

Процесс рисования (растрирования) при выполнении интерпретации PostScript-программы заключается в вычислении для каждого пиксела устройства вывода одного (для монохромного) или нескольких (например четырёх для CMYK-устройства или шести для CMYKOrGr значений параметра(-ов) в диапазоне от 0 до 1.0. Вычисленное значение параметра (-ов) используется в качестве аргумента ещё одной важной функции — transfer function. По умолчанию в подавляющем большинстве случаев эта функция представляет собой простейшую функцию y(x)=x и её значение тождественно равно значению аргумента. Однако в ряде случаев — например для компенсации растискивания используются достаточно сложные нелинейные зависимости y(x), задаваемые кусочной либо табличной аппроксимацией. Кусочно-линейная аппроксимация transfer function используется например в EPS- и PS-файлах Adobe Photoshop — для аппроксимации используется разбивка области определения [0;1.0] на сорок участков с шагом 0.025 (2.5 % растровой точки); на каждом из сорока участков transfer function имеет вид y(x)=b·x+a. Transfer function вида y(x)=1-x (в терминах PostScript language {1 sub neg} settransfer) обращает изображение, делая из него негатив — именно таким образом печатают негатив PostScript-принтеры.

Для монохромных устройств — например для фотонабора, решение о закрашивании (засветке) пикселя может приниматься в результате сравнения вычисленного для данного пиксела значения transfer function и значения т. н. Spot-функции либо двумерного массива Threshold array: в случае, если значение transfer function больше значения Spot-функции или элемента Threshold array для этого пиксела последний закрашивается (засвечивается). Специальный подбор transfer function и Spot-функции или Threshold array позволяет получить отношение числа закрашенных и незакрашенных пикселей устройства вывода для каждого пиксела исходного (растрируемого) изображения таким, что на оттиске (отпечатке) средняя яркость соответствующего участка изображения почти пропорциональна значению вычисленного параметра.

Подобным образом формируются точки различного размера, из которых состоит полутоновое изображение на типографских оттисках: в газетах, журналах, книгах.

Пример программы

Вывод программы
%!PS-Adobe-1.0
% По умолчанию, PostScript использует единицу измерения 1 пункт=1/72 дюйма, 
% мы же хотим использовать миллиметры.
72 25.4 div           % 1 мм = 72/25.4 пунктов
dup                   % дублировать значение на вершине стека
scale                 % растянуть в это количество раз по обеим координатам
100 100 translate     % установить начало координат в (100мм, 100мм)
 
/Times-Roman findfont % взять шрифт Times-Roman
10 scalefont          % растянуть до размера 10 (у нас - мм!)
setfont               % установить выбранный шрифт
 
0 30 330 {            % цикл для углов от 0 до 330 с шагом 30
  gsave                 % запомнить текущее преобразование координат
    rotate              % повернуть систему координат (угол в градусах берём с вершины стека)
    15 0 moveto         % перейти в точку (15мм, 0мм)
    (Wikipedia) show    % написать слово текущим шрифтом
  grestore              % вернуть преобразование координат
} for                 % конец цикла for
 
showpage              % вывести страницу

Примечания

  1. Evan Danaher. "Life in PostScript". Archived from the original on 2012-05-15. Retrieved 2012-04-09. англ. I learned that Postscript is a real language, not just for graphics. So I spent a bit of time learning it, and wanted to do something interesting in it. So of course, the obvious choice was John Conway's game of life. 

Литература