Ghostscript Postscript pswrite кодирует текст

Почему Ghostscript pswrite кодирует мой текст в своем выводе? Рассмотрим следующий MWE:

%!PS-Adobe-3.0 
%%Title: mwe.ps
%%Pages: 001
%%BoundingBox: 0 0 595 842
%%EndComments

%%Page: 1 1
%%PageBoundingBox: 0 0 595 842
0 0 1 setrgbcolor
0 0 595 842 rectfill
1 0 0 setrgbcolor
247 371 100 100 rectfill
/Times-Roman findfont
72 scalefont
setfont
newpath
247 300 moveto
(Chris) show
showpage

Сохранение этого MWE в файл и просмотр в GSview отобразит синюю страницу с красным квадратом и моим именем внизу. Теперь запустите этот файл через Ghostscript 9.06 с помощью следующей командной строки:

"c:\Program Files\gs\gs9.06\bin\gswin64c.exe" ^
  -dSAFER -dBATCH -dNOPAUSE ^
  -sDEVICE=pswrite -sPAPERSIZE=a4 -r72 -sOutputFile=mwe_gs.ps mwe.ps

См. вывод Ghostscript ниже. Может кто-нибудь объяснить, что здесь происходит. В то время как две команды rectfill все еще видны, мой текст (Крис) был закодирован и больше не различим.

Есть ли альтернативное устройство постскриптума, которое сохранило бы мой текст?

<snip>
%%Page: 1 1
%%PageBoundingBox: 0 0 595 842
%%BeginPageSetup
GS_pswrite_2_0_1001 begin
595 842 /a4 setpagesize
/pagesave save store 197 dict begin
1 1 scale
%%EndPageSetup
gsave mark
255 0 r6
0 0 595 842 rf
255 0 r3
247 371 100 100 rf
Q q
0 0 595 0 0 842 ^ Y
255 0 r3
249 299 43 50 /5D
$C
,6CW56m1G"ZORNkWR*rB:!c2;9rlWTH="2^^[(q"h>cG<omZ2l^=qC[XbO:8_[?kji-8^"N#3q*
jhL~>
,
289 300 41 49 /0P
$C
4r?0p$m<EkK3,0>s8W-!s8W-!s8W,u]<1irI=*p=<t0>_@<)>Is8K6,aTi'$~>
,
325 300 30 33 /5I
$C
49S"pc4+Rhs8W-!s8W)oqdD:saRZq[4+k%):]~>
,
349 300 24 49 /0T
$C
4q%Ms%;PqCs8W-!s8W%1_qkn/K?*sYFSGd:5Q~>
,
377 299 23 34 /5M
$C
-TQR7$&O'!K+D:XribR9;$mr4#sqUi.T@,dX=Y&Llg+F`d^HC#%$"]~>
,
cleartomark end end pagesave restore
 showpage
%%PageTrailer
%%Trailer
%%Pages: 1
%%EOF

ПРИМЕЧАНИЕ. Это может показаться странным, но я изучаю идею использования Ghostscript для «очистки» вывода постскриптума из приложения Matlab.


person Chris    schedule 13.02.2013    source источник
comment
Как вы можете видеть, вы вряд ли получите более чистый постскриптум из любого автоматизированного инструмента для этого, если ввод зашумлен. Я думаю, что единственный вариант, поскольку здесь нет контроля над тем, как Matlabe создает свои файлы, полностью переключиться на другой стек для вашего математического развития. Открытый исходный код даст вам контроль на всех уровнях вашей работы (включая сами математические алгоритмы, которые закрыты в Matlab)   -  person jsbueno    schedule 14.02.2013


Ответы (3)


«Текст» был преобразован в изображения, а не в векторные пути. Это серьезное ограничение устройства pswrite, и одна из причин, по которой оно устарело, вместо него следует использовать устройство ps2write. Единственная причина, по которой устройство pswrite все еще включено, — это epswrite, который его использует (именно поэтому выходные данные pswrite и epswrite выглядят одинаково). В какой-то момент появится устройство eps2write, и pswrite будет заблокирован.

Вывод ps2write по умолчанию сжат. Если вам нужен несжатый вывод, используйте параметр -dCompressPages=false в командной строке.

Если все, что вам нужно, это расположение текста, вы можете рассмотреть устройство txtwrite. Реализация этого по умолчанию создает простое текстовое представление ввода, но вместо этого вы можете вывести поддельный XML, который включает такие вещи, как происхождение текста.

person KenS    schedule 14.02.2013

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

Переопределенное шоу могло включать имя и размер шрифта. Данные могли быть записаны в файл на диске, а не выгружены на консоль. Любой другой оператор также может быть переопределен, например, rectfill, fill, stroke... Поскольку исходный оператор также вызывается, вы можете преобразовать .ps в .pdf с помощью устройства pdfwrite, в то же время получая информацию о положении.

gswin32c.exe -dBATCH -dNOPAUSE  header.ps trash.ps
gswin32c.exe -sDEVICE=pdfwrite -dCompressPages=false -sOutputFile=test.pdf header.ps trash.ps

выход

currentpoint  x:247.0 y:300.0  pathbbox 249.015,298.992 400.066,349.184   text:Chris  currentrgbcolor:1.0,0.0,0.0( )
currentpoint  x:50.0 y:90.0  pathbbox 50.8682,89.2852 181.327,139.184   text:Fred  currentrgbcolor:1.0,0.0,0.0( )
currentpoint  x:150.0 y:200.0  pathbbox 150.867,184.298 304.154,247.673   text:Mary  currentrgbcolor:1.0,0.0,0.0( )
currentpoint  x:300.0 y:350.0  pathbbox 300.867,348.993 598.79,398.681   text:Mr. Green  currentrgbcolor:0.0,1.0,0.0( )
currentpoint  x:100.0 y:400.0  pathbbox 100.866,399.202 358.547,449.183   text:Mr. Blue  currentrgbcolor:0.0,0.0,1.0( )

Заголовок.ps

/mydict 5 dict def
mydict begin
/show 
    {
    (currentpoint ) print 
    currentpoint exch 10 string cvs ( x:) print print  10 string cvs ( y:) print print
    gsave dup false charpath flattenpath 

    (  pathbbox ) print 
    pathbbox  
    4 -1 roll 10 string cvs print (,) print 
    3 -1 roll 10 string cvs print ( ) print 
    2 -1 roll 10 string cvs print (,) print 
    10 string cvs print ( ) print 
    grestore
    (  text:) 10 string cvs print   
    dup print ( ) print
    ( currentrgbcolor:) print 
    currentrgbcolor
    3 -1 roll 10 string cvs print (,) print
    2 -1 roll 10 string cvs print (,) print
    10 string cvs print ( ) ==
    systemdict /show get exec
} def

мусор.ps

%!PS-Adobe-3.0 
%%Title: mwe.ps
%%Pages: 001
%%BoundingBox: 0 0 595 842
%%EndComments
%%Page: 1 1
%%PageBoundingBox: 0 0 595 842
0 0 1 setrgbcolor
0 0 595 842 rectfill
1 0 0 setrgbcolor
247 371 100 100 rectfill
/Times-Roman findfont
72 scalefont
setfont
newpath
247 300 moveto (Chris) show
50 90 moveto (Fred) show
150 200 moveto (Mary) show
0 1 0 setrgbcolor
300 350 moveto (Mr. Green) show
0 0 1 setrgbcolor
100 400 moveto (Mr. Blue) show
showpage
person Fred F    schedule 15.02.2013

Текст был преобразован в векторные контуры. 249 299 43 50 /5D начинается с первой буквы "C", затем 289 300 - "h", 289 300 - "r"....

Что сделал pswrite, так это устранил необходимость в шрифте, поэтому, хотя ваш исходный код использовал /Times-Roman, дистиллированный код не нуждается в каком-либо шрифте, а скорее рисует текст с использованием векторов.

Я не уверен точно, что вам нужно, но вы можете попробовать «ps2write» или «epswrite» в качестве альтернативы «pswrite». pswrite используется для записи в стандарт ps level 1, а ps2write будет записывать выходные данные ps level 2. Никто больше не требует уровня ps 1, поэтому уровень 2 будет приемлем. epswrite будет писать в инкапсулированный постскриптум (eps).

person Fred F    schedule 13.02.2013
comment
epswrite, по-видимому, выдает почти такой же вывод, что и pswrite. ps2write еще более закодирован. Я борюсь за создание PDF-документа с использованием LaTeX из вывода postscript из Matlab. Мне нужно проанализировать вывод постскриптума, чтобы найти «блоки» и создать гиперссылки. В настоящее время контрольные точки постскриптума не являются источниками «нижнего левого» угла, что делает синтаксический анализ и вычисление прямоугольников вокруг объектов очень сложными. Я ищу способы очистки вывода постскриптума Matlab, чтобы помочь моему анализу. - person Chris; 13.02.2013
comment
Для меня самым простым ответом было бы использовать постскриптум. В postscript вы можете переопределить операторы. Оператор show может вывести файл (cvs или с фиксированным полем) с форматом записи show,x,y,color,text и rectfill для сохранения прямоугольников rect,x1,y1,x2,y2,color Postscript имеет оператор pathbbox, который вычисляет ограничивающая рамка любой формы пути, поэтому вместо Ghostscript также есть pdfwrite, вместо того, чтобы текст просто задавал 1 x/y, он мог бы определить поле, в котором текст находится в show,x1,y1,x2,y2,color,text - person Fred F; 13.02.2013
comment
помимо pswrite есть еще pdfwrite, который выводит pdf. С помощью описанного выше метода можно преобразовать .ps в .pdf и получить файл данных о местоположении. Ghostscript, pswrite, epswrite, pdfwrite — все они имеют открытый исходный код. Если вы чувствуете себя настоящим авантюристом, вы можете изменить ghostscript, чтобы он делал именно то, что вам нужно, ошибка ghostscript - это какой-то уродливый код, и изменить show и rectfill было бы намного проще. - person Fred F; 13.02.2013